arpakitlib 1.7.243__py3-none-any.whl → 1.7.244__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.
@@ -8,6 +8,7 @@ from pydantic_core.core_schema import ValidationInfo
8
8
 
9
9
  from arpakitlib.ar_json_util import safely_transfer_obj_to_json_str
10
10
  from arpakitlib.ar_settings_util import SimpleSettings
11
+ from arpakitlib.ar_sqlalchemy_util import generate_sqlalchemy_url
11
12
  from src.core.const import ProjectPaths
12
13
 
13
14
 
@@ -27,14 +28,40 @@ class Settings(SimpleSettings):
27
28
  @field_validator("sql_db_url", mode="after")
28
29
  def validate_sql_db_url(cls, v: Any, validation_info: ValidationInfo) -> str | None:
29
30
  if v is not None:
30
- return None
31
- user = validation_info.data.get('sql_db_user')
32
- password = validation_info.data.get('sql_db_password')
33
- port = validation_info.data.get('sql_db_port')
34
- database = validation_info.data.get('sql_db_database')
35
- if user is not None and password is not None and port is not None and database is not None:
36
- return f"postgresql://{user}:{password}@127.0.0.1:{port}/{database}"
37
- return None
31
+ return v
32
+
33
+ user = validation_info.data.get("sql_db_user")
34
+ password = validation_info.data.get("sql_db_password")
35
+ port = validation_info.data.get("sql_db_port")
36
+ database = validation_info.data.get("sql_db_database")
37
+
38
+ return generate_sqlalchemy_url(
39
+ base="postgresql",
40
+ user=user,
41
+ password=password,
42
+ port=port,
43
+ database=database
44
+ )
45
+
46
+ async_sql_db_url: str | None = None
47
+
48
+ @field_validator("async_sql_db_url", mode="after")
49
+ def validate_async_sql_db_url(cls, v: Any, validation_info: ValidationInfo) -> str | None:
50
+ if v is not None:
51
+ return v
52
+
53
+ user = validation_info.data.get("sql_db_user")
54
+ password = validation_info.data.get("sql_db_password")
55
+ port = validation_info.data.get("sql_db_port")
56
+ database = validation_info.data.get("sql_db_database")
57
+
58
+ return generate_sqlalchemy_url(
59
+ base="postgresql+asyncpg",
60
+ user=user,
61
+ password=password,
62
+ port=port,
63
+ database=database
64
+ )
38
65
 
39
66
  sql_db_echo: bool = False
40
67
 
@@ -16,6 +16,7 @@ def get_base_dbm() -> type[BaseDBM]:
16
16
  def create_sqlalchemy_db() -> SQLAlchemyDB:
17
17
  return SQLAlchemyDB(
18
18
  db_url=get_cached_settings().sql_db_url,
19
+ async_db_url=get_cached_settings().async_sql_db_url,
19
20
  db_echo=get_cached_settings().sql_db_echo,
20
21
  base_dbm=get_base_dbm()
21
22
  )
@@ -3,6 +3,7 @@ import asyncio
3
3
  import logging
4
4
  from datetime import timedelta, datetime
5
5
  from typing import Any
6
+ from urllib.parse import quote_plus
6
7
  from uuid import uuid4
7
8
 
8
9
  from sqlalchemy import create_engine, QueuePool, text, func, inspect, AsyncAdaptedQueuePool
@@ -23,37 +24,98 @@ def get_string_info_from_declarative_base(class_: type[DeclarativeBase]):
23
24
  return res
24
25
 
25
26
 
27
+ def generate_sqlalchemy_url(
28
+ *,
29
+ base: str = "postgresql",
30
+ user: str | None = None,
31
+ password: str | None = None,
32
+ host: str = "127.0.0.1",
33
+ port: int | None = None,
34
+ database: str | None = None,
35
+ **query_params
36
+ ) -> str:
37
+ """
38
+ Генерация URL для SQLAlchemy.
39
+
40
+ :param base: Базовая строка для подключения, например "postgresql+asyncpg" или "sqlite".
41
+ :param user: Имя пользователя (необязательно).
42
+ :param password: Пароль (необязательно).
43
+ :param host: Хост (по умолчанию "127.0.0.1").
44
+ :param port: Порт (необязательно).
45
+ :param database: Имя базы данных или путь к файлу для SQLite (необязательно).
46
+ :param query_params: Дополнительные параметры строки подключения.
47
+ :return: Строка подключения для SQLAlchemy.
48
+ """
49
+ # Формируем часть с авторизацией
50
+ auth_part = ""
51
+ if user and password:
52
+ auth_part = f"{quote_plus(user)}:{quote_plus(password)}@"
53
+ elif user:
54
+ auth_part = f"{quote_plus(user)}@"
55
+
56
+ # Формируем часть с хостом и портом
57
+ host_part = ""
58
+ if base.startswith("sqlite"):
59
+ # Для SQLite хост и порт не нужны
60
+ host_part = ""
61
+ else:
62
+ host_part = f"{host}"
63
+ if port:
64
+ host_part += f":{port}"
65
+
66
+ # Формируем часть с базой данных
67
+ database_part = f"/{database}" if database else ""
68
+ if base.startswith("sqlite") and database:
69
+ # Для SQLite путь указывается как абсолютный
70
+ database_part = f"/{database}"
71
+
72
+ # Дополнительные параметры
73
+ query_part = ""
74
+ if query_params:
75
+ query_items = [f"{key}={quote_plus(str(value))}" for key, value in query_params.items()]
76
+ query_part = f"?{'&'.join(query_items)}"
77
+
78
+ return f"{base}://{auth_part}{host_part}{database_part}{query_part}"
79
+
80
+
26
81
  class SQLAlchemyDB:
27
82
  def __init__(
28
83
  self,
29
84
  *,
30
- db_url: str = "postgresql://arpakitlib:arpakitlib@localhost:50517/arpakitlib",
31
- async_db_url: str = "postgresql+asyncpg://arpakitlib:arpakitlib@localhost:50517/arpakitlib",
85
+ db_url: str | None = "postgresql://arpakitlib:arpakitlib@localhost:50517/arpakitlib",
86
+ async_db_url: str | None = "postgresql+asyncpg://arpakitlib:arpakitlib@localhost:50517/arpakitlib",
32
87
  db_echo: bool = False,
33
88
  base_dbm: type[BaseDBM] | None = None,
34
89
  db_models: list[Any] | None = None,
35
90
  ):
36
- self._logger = logging.getLogger(self.__class__.__name__)
37
- self.engine = create_engine(
38
- url=db_url,
39
- echo=db_echo,
40
- pool_size=10,
41
- max_overflow=10,
42
- poolclass=QueuePool,
43
- pool_timeout=timedelta(seconds=30).total_seconds(),
44
- )
91
+ self._logger = logging.getLogger()
92
+
93
+ self.db_url = db_url
94
+ if self.db_url is not None:
95
+ self.engine = create_engine(
96
+ url=db_url,
97
+ echo=db_echo,
98
+ pool_size=10,
99
+ max_overflow=10,
100
+ poolclass=QueuePool,
101
+ pool_timeout=timedelta(seconds=30).total_seconds(),
102
+ )
45
103
  self.sessionmaker = sessionmaker(bind=self.engine)
46
104
  self.func_new_session_counter = 0
47
- self.async_engine = create_async_engine(
48
- url=async_db_url,
49
- echo=db_echo,
50
- pool_size=10,
51
- max_overflow=10,
52
- poolclass=AsyncAdaptedQueuePool,
53
- pool_timeout=timedelta(seconds=30).total_seconds()
54
- )
105
+
106
+ self.async_db_url = async_db_url
107
+ if self.async_db_url is not None:
108
+ self.async_engine = create_async_engine(
109
+ url=async_db_url,
110
+ echo=db_echo,
111
+ pool_size=10,
112
+ max_overflow=10,
113
+ poolclass=AsyncAdaptedQueuePool,
114
+ pool_timeout=timedelta(seconds=30).total_seconds()
115
+ )
55
116
  self.async_sessionmaker = async_sessionmaker(bind=self.async_engine)
56
117
  self.func_new_async_session_counter = 0
118
+
57
119
  self.base_dbm = base_dbm
58
120
 
59
121
  def is_table_exists(self, table_name: str) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.7.243
3
+ Version: 1.7.244
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -39,6 +39,7 @@ Requires-Dist: paramiko (>=3.5.0,<4.0.0)
39
39
  Requires-Dist: pika (>=1.3.2,<2.0.0)
40
40
  Requires-Dist: poetry (>=2.0.1,<3.0.0)
41
41
  Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0)
42
+ Requires-Dist: pulp (>=2.9.0,<3.0.0)
42
43
  Requires-Dist: pydantic (>=2.10.5,<3.0.0)
43
44
  Requires-Dist: pydantic-settings (>=2.7.1,<3.0.0)
44
45
  Requires-Dist: pyjwt (>=2.10.1,<3.0.0)
@@ -46,6 +47,7 @@ Requires-Dist: pymongo (>=4.10.1,<5.0.0)
46
47
  Requires-Dist: pytz (>=2024.2,<2025.0)
47
48
  Requires-Dist: pyzabbix (>=1.3.1,<2.0.0)
48
49
  Requires-Dist: requests[socks] (>=2.32.3,<3.0.0)
50
+ Requires-Dist: scipy (>=1.15.1,<2.0.0)
49
51
  Requires-Dist: sqladmin (>=0.20.1,<0.21.0)
50
52
  Requires-Dist: sqlalchemy (>=2.0.37,<3.0.0)
51
53
  Requires-Dist: twine (>=6.1.0,<7.0.0)
@@ -90,7 +90,7 @@ arpakitlib/_arpakit_project_template/src/core/_check_logging.py,sha256=APQp8jQa3
90
90
  arpakitlib/_arpakit_project_template/src/core/_check_settings.py,sha256=BQUcr-yj3cxz5GQo0jXe99wMoqHKrrrKD3-UovsJAt0,284
91
91
  arpakitlib/_arpakit_project_template/src/core/_generate_settings_env_example.py,sha256=SiEJe8AYQPOWicsaCwf9RdXp6UAmfkBdBT18AAInGb4,483
92
92
  arpakitlib/_arpakit_project_template/src/core/const.py,sha256=e2Y0NIQHfzm3bmnbQnGy3Z5YKt6OYnIsRoqVY8oIV2E,1008
93
- arpakitlib/_arpakit_project_template/src/core/settings.py,sha256=0-35RjLUMEWkHnuH454AKafwWpxH9cUAdRRc97nVLzQ,3094
93
+ arpakitlib/_arpakit_project_template/src/core/settings.py,sha256=R4dsQHOB9wVBn-A76sbJFQbsfCHyyR3AMKV8HZHIHmM,3819
94
94
  arpakitlib/_arpakit_project_template/src/core/util.py,sha256=mcikqcjljZa2qhYeoR1tR9JUSprrVSod8XcIK_PqS6o,1547
95
95
  arpakitlib/_arpakit_project_template/src/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
96
  arpakitlib/_arpakit_project_template/src/db/_check_conn_sqlalchemy_db.py,sha256=GPK7-w7x8ESqbZ0v1nI8m_ysWfnmjgRwyyh6kM8vYBQ,249
@@ -99,7 +99,7 @@ arpakitlib/_arpakit_project_template/src/db/_init_sqlalchemy_db.py,sha256=tHJ1NB
99
99
  arpakitlib/_arpakit_project_template/src/db/_reinit_sqlalchemy_db.py,sha256=_4O_xr6FXt3qcWOmO82CKG3XX6_RqbqaOYSEygxpBfA,339
100
100
  arpakitlib/_arpakit_project_template/src/db/const.py,sha256=dcvj5C9E2F2KCsGZPBBncQf_EvVJAC1qQgnyD8P4ZEw,6
101
101
  arpakitlib/_arpakit_project_template/src/db/sqlalchemy_model.py,sha256=tIdSerx8m6FA0cx4PDNJF8cWY1utpS_g0sZ0jBzUAbI,286
102
- arpakitlib/_arpakit_project_template/src/db/util.py,sha256=Ww0CYifxFcNkRvMedmDu806_Ic_Hbb1C5KQX8UsiLdc,787
102
+ arpakitlib/_arpakit_project_template/src/db/util.py,sha256=wYMVXtw_XURv4DFSx4n6CXnKYE-xskzpYSRk9lBIELY,848
103
103
  arpakitlib/_arpakit_project_template/src/operation_execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
104
  arpakitlib/_arpakit_project_template/src/operation_execution/_remove_operations.py,sha256=KsvAk2zQCp0PX6-QiRW0LKHoJfmH0wVJcBZviFqAoBI,471
105
105
  arpakitlib/_arpakit_project_template/src/operation_execution/_start_operation_executor_worker.py,sha256=K861UI9LFNxfCoPpQ5AJX-oUwjB6bfFNKScKsyU9Xd8,575
@@ -205,14 +205,14 @@ arpakitlib/ar_settings_util.py,sha256=rnoTqbRuhiq7294D4crD5kbnU8-gNWJbwGU_Ls2gJo
205
205
  arpakitlib/ar_sleep_util.py,sha256=OaLtRaJQWMkGjfj_mW1RB2P4RaSWsAIH8LUoXqsH0zM,1061
206
206
  arpakitlib/ar_sqladmin_util.py,sha256=6Nv9VQssk9PB0piyuss__soYKdjVhdbIeXIv4AgUxmQ,2660
207
207
  arpakitlib/ar_sqlalchemy_model_util.py,sha256=ezui1VEVuABYgrywpP_A2wYvDBlIxwQTZ0HQgBJfZE0,6293
208
- arpakitlib/ar_sqlalchemy_util.py,sha256=Eol7SxNdHoi9XAfaUCNTe5jDt-csyo3GaY4fTBJlzGc,5763
208
+ arpakitlib/ar_sqlalchemy_util.py,sha256=9dXCdKWmUPyMt19sF2YVBB-4x_tl5g2Bsfhn0c_SQ6M,8184
209
209
  arpakitlib/ar_ssh_runner_util.py,sha256=e9deuUdBW7Eh0Exx2nTBhk57SaOZYaJaSjNk8q6dbJk,6804
210
210
  arpakitlib/ar_str_util.py,sha256=yU5gOwNXUQaH5b_tM5t6fXUn9oUcv5EQbVnq2wXXIpQ,3378
211
211
  arpakitlib/ar_type_util.py,sha256=9C3ErtUVs0tAUqtK-foFzjJOykfBOntfCz2IogDOgfA,4134
212
212
  arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrIMsdpNK-AUlm0,5347
213
213
  arpakitlib/ar_zabbix_api_client_util.py,sha256=Q-VR4MvoZ9aHwZeYZr9G3LwN-ANx1T5KFmF6pvPM-9M,6402
214
- arpakitlib-1.7.243.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
215
- arpakitlib-1.7.243.dist-info/METADATA,sha256=unXXDHN-CYxrtUSEVR4kITElMCrzgW7DX0-Vz7-ryMw,3310
216
- arpakitlib-1.7.243.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
217
- arpakitlib-1.7.243.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
218
- arpakitlib-1.7.243.dist-info/RECORD,,
214
+ arpakitlib-1.7.244.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
215
+ arpakitlib-1.7.244.dist-info/METADATA,sha256=7Q2Y0Wb_OIUHWc5aXYt1L2EHIfYCEeelb-JrayEGrA0,3386
216
+ arpakitlib-1.7.244.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
217
+ arpakitlib-1.7.244.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
218
+ arpakitlib-1.7.244.dist-info/RECORD,,