dublib 0.6.2__tar.gz → 0.7.0__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.
- {dublib-0.6.2/src/dublib.egg-info → dublib-0.7.0}/PKG-INFO +6 -2
- {dublib-0.6.2 → dublib-0.7.0}/README.md +5 -1
- {dublib-0.6.2 → dublib-0.7.0}/pyproject.toml +1 -1
- {dublib-0.6.2/src/dublib → dublib-0.7.0/src/dublib/CLI}/StyledPrinter.py +12 -8
- dublib-0.7.0/src/dublib/CLI/Templates.py +33 -0
- {dublib-0.6.2/src/dublib/Exceptions → dublib-0.7.0/src/dublib/CLI}/__init__.py +0 -0
- {dublib-0.6.2/src/dublib → dublib-0.7.0/src/dublib/Exceptions}/__init__.py +0 -0
- dublib-0.6.2/src/dublib/Methods.py → dublib-0.7.0/src/dublib/Methods/Data.py +24 -128
- dublib-0.7.0/src/dublib/Methods/Filesystem.py +38 -0
- dublib-0.7.0/src/dublib/Methods/JSON.py +28 -0
- dublib-0.7.0/src/dublib/Methods/System.py +44 -0
- dublib-0.7.0/src/dublib/Methods/__init__.py +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib/TelebotUtils.py +61 -15
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib/Terminalyzer.py +5 -1
- dublib-0.7.0/src/dublib/__init__.py +0 -0
- {dublib-0.6.2 → dublib-0.7.0/src/dublib.egg-info}/PKG-INFO +6 -2
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib.egg-info/SOURCES.txt +10 -4
- {dublib-0.6.2 → dublib-0.7.0}/LICENSE +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/setup.cfg +0 -0
- /dublib-0.6.2/src/dublib/Exceptions/StyledPrinter.py → /dublib-0.7.0/src/dublib/Exceptions/CLI.py +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib/Exceptions/TelebotUtils.py +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib/Exceptions/Terminalyzer.py +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib/Exceptions/WebRequestor.py +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib/Polyglot.py +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib/WebRequestor.py +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib.egg-info/dependency_links.txt +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib.egg-info/requires.txt +0 -0
- {dublib-0.6.2 → dublib-0.7.0}/src/dublib.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dublib
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Коллекция модулей от DUB1401.
|
|
5
5
|
Author-email: DUB1401 <vlad.milosta@outlook.com>
|
|
6
6
|
License: This is free and unencumbered software released into the public domain.
|
|
@@ -55,11 +55,15 @@ Requires-Dist: pyTelegramBotAPI; extra == "telebot"
|
|
|
55
55
|
# dublib
|
|
56
56
|
**dublib** – это библиотека, поставляющая компоненты, требующиеся в проектах [@DUB1401](https://github.com/DUB1401), написанных на Python.
|
|
57
57
|
|
|
58
|
+
Данный набор модулей распространяется по Rolling-модели. Это значит, что разработчик не заботится об обратной совместимости с прошлыми релизами, потому рекомендуется привязывать ваш проект строго к определённой версии библиотеки.
|
|
59
|
+
|
|
60
|
+
Все компоненты поставляют лишь базовую документацию, необходимую для общего понимания принципов работы. Библиотека является самодокументируемой.
|
|
61
|
+
|
|
58
62
|
# Поставляемые компоненты
|
|
59
63
|
Библиотека включает следующие модули:
|
|
64
|
+
* [CLI](https://github.com/DUB1401/dublib/blob/main/docs/CLI.md)
|
|
60
65
|
* [Methods](https://github.com/DUB1401/dublib/blob/main/docs/Methods.md)
|
|
61
66
|
* [Polyglot](https://github.com/DUB1401/dublib/blob/main/docs/Polyglot.md)
|
|
62
|
-
* [StyledPrinter](https://github.com/DUB1401/dublib/blob/main/docs/StyledPrinter.md)
|
|
63
67
|
* [TelebotUtils](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
64
68
|
* [Terminalyzer](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
65
69
|
* [WebRequestor](https://github.com/DUB1401/dublib/blob/main/docs/WebRequestor.md)
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
# dublib
|
|
2
2
|
**dublib** – это библиотека, поставляющая компоненты, требующиеся в проектах [@DUB1401](https://github.com/DUB1401), написанных на Python.
|
|
3
3
|
|
|
4
|
+
Данный набор модулей распространяется по Rolling-модели. Это значит, что разработчик не заботится об обратной совместимости с прошлыми релизами, потому рекомендуется привязывать ваш проект строго к определённой версии библиотеки.
|
|
5
|
+
|
|
6
|
+
Все компоненты поставляют лишь базовую документацию, необходимую для общего понимания принципов работы. Библиотека является самодокументируемой.
|
|
7
|
+
|
|
4
8
|
# Поставляемые компоненты
|
|
5
9
|
Библиотека включает следующие модули:
|
|
10
|
+
* [CLI](https://github.com/DUB1401/dublib/blob/main/docs/CLI.md)
|
|
6
11
|
* [Methods](https://github.com/DUB1401/dublib/blob/main/docs/Methods.md)
|
|
7
12
|
* [Polyglot](https://github.com/DUB1401/dublib/blob/main/docs/Polyglot.md)
|
|
8
|
-
* [StyledPrinter](https://github.com/DUB1401/dublib/blob/main/docs/StyledPrinter.md)
|
|
9
13
|
* [TelebotUtils](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
10
14
|
* [Terminalyzer](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
11
15
|
* [WebRequestor](https://github.com/DUB1401/dublib/blob/main/docs/WebRequestor.md)
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
from
|
|
1
|
+
from ..Exceptions.CLI import DuplicatedStyles
|
|
2
2
|
|
|
3
3
|
import enum
|
|
4
4
|
|
|
5
|
+
#==========================================================================================#
|
|
6
|
+
# >>>>> СТИЛИЗАЦИЯ ТЕКСТА <<<<< #
|
|
7
|
+
#==========================================================================================#
|
|
8
|
+
|
|
5
9
|
class Styles:
|
|
6
|
-
"""
|
|
10
|
+
"""Перечисления декораций и стилей."""
|
|
7
11
|
|
|
8
12
|
class Colors(enum.Enum):
|
|
9
13
|
"""Перечисление цветов."""
|
|
@@ -32,11 +36,11 @@ class Styles:
|
|
|
32
36
|
Upperlined = "53"
|
|
33
37
|
|
|
34
38
|
class StylesGroup:
|
|
35
|
-
"""Контейнер стилей. Предоставляет возможность комбинировать стили для их однократной инициализации с последующим многократным
|
|
39
|
+
"""Контейнер стилей. Предоставляет возможность комбинировать стили для их однократной инициализации с последующим многократным использованием."""
|
|
36
40
|
|
|
37
41
|
def __init__(self, decorations: list[Styles.Decorations] = list(), text_color: Styles.Colors | None = None, background_color: Styles.Colors | None = None):
|
|
38
42
|
"""
|
|
39
|
-
Контейнер стилей. Предоставляет возможность комбинировать стили для их однократной инициализации с последующим многократным
|
|
43
|
+
Контейнер стилей. Предоставляет возможность комбинировать стили для их однократной инициализации с последующим многократным использованием.
|
|
40
44
|
decorations – список декораций;
|
|
41
45
|
text_color – цвет текста;
|
|
42
46
|
background_color – цвет фона.
|
|
@@ -50,9 +54,9 @@ class StylesGroup:
|
|
|
50
54
|
# Добавить каждый маркер стиля к общей строке.
|
|
51
55
|
for Decoration in decorations: self.__StylesMarkers += Decoration.value + ";"
|
|
52
56
|
# Если передан цвет текста, создать соответствующий маркер.
|
|
53
|
-
if
|
|
57
|
+
if text_color != None: self.__StylesMarkers += "3" + text_color.value + ";"
|
|
54
58
|
# Если передан цвет фона, создать соответствующий маркер.
|
|
55
|
-
if
|
|
59
|
+
if background_color != None: self.__StylesMarkers += "4" + background_color.value + ";"
|
|
56
60
|
# Постановка завершающего символа маркировки.
|
|
57
61
|
self.__StylesMarkers = self.__StylesMarkers.rstrip(';') + "m"
|
|
58
62
|
|
|
@@ -61,7 +65,7 @@ class StylesGroup:
|
|
|
61
65
|
|
|
62
66
|
def StyledPrinter(text: str, styles: StylesGroup | None = None, decorations: list[Styles.Decorations] = list(), text_color: Styles.Colors | None = None, background_color: Styles.Colors | None = None, autoreset: bool = True, end: bool = True):
|
|
63
67
|
"""
|
|
64
|
-
Выводит в терминал стилизованный текст.
|
|
68
|
+
Выводит в терминал стилизованный с помощью ANSI-кодов текст.
|
|
65
69
|
text – стилизуемый текст;
|
|
66
70
|
styles – контейнер стилей;
|
|
67
71
|
decorations – список декораций;
|
|
@@ -84,7 +88,7 @@ def StyledPrinter(text: str, styles: StylesGroup | None = None, decorations: lis
|
|
|
84
88
|
|
|
85
89
|
def TextStyler(text: str, styles: StylesGroup | None = None, decorations: list[Styles.Decorations] = list(), text_color: Styles.Colors | None = None, background_color: Styles.Colors | None = None, autoreset: bool = True) -> str:
|
|
86
90
|
"""
|
|
87
|
-
Стилизует
|
|
91
|
+
Стилизует текст с помощью ANSI-кодов.
|
|
88
92
|
text – стилизуемый текст;
|
|
89
93
|
styles – контейнер стилей;
|
|
90
94
|
decorations – список декораций;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import readline
|
|
2
|
+
|
|
3
|
+
#==========================================================================================#
|
|
4
|
+
# >>>>> ШАБЛОНЫ ВВОДА-ВЫВОДА <<<<< #
|
|
5
|
+
#==========================================================================================#
|
|
6
|
+
|
|
7
|
+
def Confirmation(text: str, question: str | None = None, yes: str | None = None, no: str | None = None) -> bool:
|
|
8
|
+
"""
|
|
9
|
+
Запрашивает подтверждение.
|
|
10
|
+
text – описание вопроса;
|
|
11
|
+
question – строка, обозначающая сам вопрос в используемом языке;
|
|
12
|
+
yes – строка, обозначающая согласие при вводе в консоль;
|
|
13
|
+
yes – строка, обозначающая отсутствие согласия при вводе в консоль.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# Ответ.
|
|
17
|
+
Response = None
|
|
18
|
+
# Если не заданы необязательные параметры, использовать стандартные.
|
|
19
|
+
if not question: question = "Confirm?"
|
|
20
|
+
if not yes: yes = "Y"
|
|
21
|
+
if not no: no = "N"
|
|
22
|
+
|
|
23
|
+
# Постоянно.
|
|
24
|
+
while True:
|
|
25
|
+
# Запрос подтверждения.
|
|
26
|
+
InputLine = input(f"{text}\n{question} [{yes}/{no}]: ").strip().lower()
|
|
27
|
+
# Проверка ответов.
|
|
28
|
+
if InputLine == yes.lower(): Response = True
|
|
29
|
+
if InputLine == no.lower(): Response = False
|
|
30
|
+
# Если ответ дан, остановить цикл.
|
|
31
|
+
if Response != None: break
|
|
32
|
+
|
|
33
|
+
return Response
|
|
File without changes
|
|
File without changes
|
|
@@ -1,101 +1,44 @@
|
|
|
1
|
-
import shutil
|
|
2
|
-
import html
|
|
3
|
-
import json
|
|
4
|
-
import sys
|
|
5
|
-
import os
|
|
6
|
-
import re
|
|
7
|
-
|
|
8
1
|
#==========================================================================================#
|
|
9
|
-
# >>>>> ФУНКЦИИ
|
|
2
|
+
# >>>>> ФУНКЦИИ ПРОВЕРКИ ДАННЫХ <<<<< #
|
|
10
3
|
#==========================================================================================#
|
|
11
4
|
|
|
12
|
-
def
|
|
5
|
+
def CheckForCyrillic(text: str) -> bool:
|
|
13
6
|
"""
|
|
14
|
-
Проверяет,
|
|
15
|
-
|
|
16
|
-
minor – идентификатор Minor-версии Python;
|
|
17
|
-
raise_exception – указывает, как поступать при несоответствии версии: выбрасывать исключение или возвращать значение.
|
|
7
|
+
Проверяет, имеются ли кирилические символы в строке.
|
|
8
|
+
text – проверяемая строка.
|
|
18
9
|
"""
|
|
19
10
|
|
|
20
|
-
#
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if sys.version_info < (major, minor):
|
|
25
|
-
|
|
26
|
-
# Если указано выбросить исключение.
|
|
27
|
-
if raise_exception == True:
|
|
28
|
-
# Выброс исключения.
|
|
29
|
-
raise RuntimeError(f"Python {major}.{minor} or newer is required.")
|
|
30
|
-
|
|
31
|
-
else:
|
|
32
|
-
# Переключение статуса проверки.
|
|
33
|
-
IsVersionCorrect = False
|
|
34
|
-
|
|
35
|
-
return IsVersionCorrect
|
|
36
|
-
|
|
37
|
-
def Cls():
|
|
38
|
-
"""Очищает консоль."""
|
|
39
|
-
|
|
40
|
-
os.system("cls" if os.name == "nt" else "clear")
|
|
11
|
+
# Русский алфавит в нижнем регистре.
|
|
12
|
+
Alphabet = set("абвгдеёжзийклмнопрстуфхцчшщъыьэюя")
|
|
13
|
+
# Состояние: содержит ли строка кирилические символы.
|
|
14
|
+
IsTextContainsCyrillicCharacters = not Alphabet.isdisjoint(text.lower())
|
|
41
15
|
|
|
42
|
-
|
|
43
|
-
"""
|
|
44
|
-
Создаёт каталоги в текущей корневой директории скрипта.
|
|
45
|
-
directories – список названий каталогов.
|
|
46
|
-
"""
|
|
47
|
-
|
|
48
|
-
# Для каждого названия каталога.
|
|
49
|
-
for Name in directories:
|
|
50
|
-
# Если каталог не существует, то создать его.
|
|
51
|
-
if os.path.exists(Name) == False: os.makedirs(Name)
|
|
16
|
+
return IsTextContainsCyrillicCharacters
|
|
52
17
|
|
|
53
|
-
def
|
|
18
|
+
def IsNotAlpha(text: str) -> bool:
|
|
54
19
|
"""
|
|
55
|
-
|
|
56
|
-
path – путь к каталогу.
|
|
20
|
+
Проверяет, состоит ли строка целиком из небуквенных символов.
|
|
57
21
|
"""
|
|
58
22
|
|
|
59
|
-
#
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
# Для каждого элемента.
|
|
63
|
-
for Item in FolderContent:
|
|
64
|
-
|
|
65
|
-
# Если элемент является каталогом.
|
|
66
|
-
if os.path.isdir(path + "/" + Item):
|
|
67
|
-
# Удаление каталога.
|
|
68
|
-
shutil.rmtree(path + "/" + Item)
|
|
23
|
+
# Результат проверки.
|
|
24
|
+
Result = True
|
|
69
25
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
os.remove(path + "/" + Item)
|
|
26
|
+
# Для каждого символа в строке.
|
|
27
|
+
for Character in text:
|
|
73
28
|
|
|
74
|
-
|
|
75
|
-
|
|
29
|
+
# Если символ является буквой.
|
|
30
|
+
if Character.isalpha():
|
|
31
|
+
# Изменение результата.
|
|
32
|
+
Result = False
|
|
33
|
+
# Прерывание цикла.
|
|
34
|
+
break
|
|
76
35
|
|
|
77
|
-
|
|
78
|
-
if sys.platform in ["linux", "linux2"]: os.system("sudo shutdown now")
|
|
79
|
-
# Если устройство работает под управлением ОС семейства Windows.
|
|
80
|
-
if sys.platform == "win32": os.system("shutdown /s")
|
|
36
|
+
return Result
|
|
81
37
|
|
|
82
38
|
#==========================================================================================#
|
|
83
|
-
# >>>>> ФУНКЦИИ ОБРАБОТКИ
|
|
39
|
+
# >>>>> ФУНКЦИИ ОБРАБОТКИ ДАННЫХ <<<<< #
|
|
84
40
|
#==========================================================================================#
|
|
85
41
|
|
|
86
|
-
def CheckForCyrillicPresence(text: str) -> bool:
|
|
87
|
-
"""
|
|
88
|
-
Проверяет, имеются ли кирилические символы в строке.
|
|
89
|
-
text – проверяемая строка.
|
|
90
|
-
"""
|
|
91
|
-
|
|
92
|
-
# Русский алфавит в нижнем регистре.
|
|
93
|
-
Alphabet = set("абвгдеёжзийклмнопрстуфхцчшщъыьэюя")
|
|
94
|
-
# Состояние: содержит ли строка кирилические символы.
|
|
95
|
-
IsTextContainsCyrillicCharacters = not Alphabet.isdisjoint(text.lower())
|
|
96
|
-
|
|
97
|
-
return IsTextContainsCyrillicCharacters
|
|
98
|
-
|
|
99
42
|
def ChunkList(value: list, length: int) -> list[list]:
|
|
100
43
|
"""
|
|
101
44
|
Разделяет список на фрагменты фиксированной длинны.
|
|
@@ -131,26 +74,6 @@ def ChunkList(value: list, length: int) -> list[list]:
|
|
|
131
74
|
|
|
132
75
|
return Result
|
|
133
76
|
|
|
134
|
-
def IsNotAlpha(text: str) -> bool:
|
|
135
|
-
"""
|
|
136
|
-
Проверяет, состоит ли строка целиком из небуквенных символов.
|
|
137
|
-
"""
|
|
138
|
-
|
|
139
|
-
# Результат проверки.
|
|
140
|
-
Result = True
|
|
141
|
-
|
|
142
|
-
# Для каждого символа в строке.
|
|
143
|
-
for Character in text:
|
|
144
|
-
|
|
145
|
-
# Если символ является буквой.
|
|
146
|
-
if Character.isalpha():
|
|
147
|
-
# Изменение результата.
|
|
148
|
-
Result = False
|
|
149
|
-
# Прерывание цикла.
|
|
150
|
-
break
|
|
151
|
-
|
|
152
|
-
return Result
|
|
153
|
-
|
|
154
77
|
def MergeDictionaries(base_dictionary: dict, mergeable_dictionary: dict, overwrite: bool = False) -> dict:
|
|
155
78
|
"""
|
|
156
79
|
Объединяет словари.
|
|
@@ -237,31 +160,4 @@ def Zerotify(value: any) -> any:
|
|
|
237
160
|
# Если значение логически интерпретируется в False, обнулить его.
|
|
238
161
|
if bool(value) == False: value = None
|
|
239
162
|
|
|
240
|
-
return value
|
|
241
|
-
|
|
242
|
-
#==========================================================================================#
|
|
243
|
-
# >>>>> ФУНКЦИИ РАБОТЫ С JSON <<<<< #
|
|
244
|
-
#==========================================================================================#
|
|
245
|
-
|
|
246
|
-
def ReadJSON(path: str) -> dict:
|
|
247
|
-
"""
|
|
248
|
-
Читает файл JSON и конвертирует его в словарь.
|
|
249
|
-
path – путь к файлу.
|
|
250
|
-
"""
|
|
251
|
-
|
|
252
|
-
# Словарь для преобразования.
|
|
253
|
-
JSON = dict()
|
|
254
|
-
# Открытие и чтение файла JSON.
|
|
255
|
-
with open(path, encoding = "utf-8") as FileRead: JSON = json.load(FileRead)
|
|
256
|
-
|
|
257
|
-
return JSON
|
|
258
|
-
|
|
259
|
-
def WriteJSON(path: str, dictionary: dict):
|
|
260
|
-
"""
|
|
261
|
-
Записывает стандартизированный JSON файл. Для отступов используются символы табуляции.
|
|
262
|
-
path – путь к файлу;
|
|
263
|
-
dictionary – словарь, конвертируемый в формат JSON.
|
|
264
|
-
"""
|
|
265
|
-
|
|
266
|
-
# Запись словаря в JSON файл.
|
|
267
|
-
with open(path, "w", encoding = "utf-8") as FileWrite: json.dump(dictionary, FileWrite, ensure_ascii = False, indent = '\t', separators = (",", ": "))
|
|
163
|
+
return value
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import shutil
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
#==========================================================================================#
|
|
5
|
+
# >>>>> ФУНКЦИИ РАБОТЫ С ФАЙЛАМИ И ДИРЕКТОРИЯМИ <<<<< #
|
|
6
|
+
#==========================================================================================#
|
|
7
|
+
|
|
8
|
+
def MakeRootDirectories(directories: list[str]):
|
|
9
|
+
"""
|
|
10
|
+
Создаёт каталоги в текущей корневой директории скрипта.
|
|
11
|
+
directories – список названий каталогов.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# Для каждого названия каталога.
|
|
15
|
+
for Name in directories:
|
|
16
|
+
# Если каталог не существует, то создать его.
|
|
17
|
+
if os.path.exists(Name) == False: os.makedirs(Name)
|
|
18
|
+
|
|
19
|
+
def RemoveDirectoryContent(path: str):
|
|
20
|
+
"""
|
|
21
|
+
Удаляет всё содержимое каталога.
|
|
22
|
+
path – путь к каталогу.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# Список содержимого в папке.
|
|
26
|
+
FolderContent = os.listdir(path)
|
|
27
|
+
|
|
28
|
+
# Для каждого элемента.
|
|
29
|
+
for Item in FolderContent:
|
|
30
|
+
|
|
31
|
+
# Если элемент является каталогом.
|
|
32
|
+
if os.path.isdir(path + "/" + Item):
|
|
33
|
+
# Удаление каталога.
|
|
34
|
+
shutil.rmtree(path + "/" + Item)
|
|
35
|
+
|
|
36
|
+
else:
|
|
37
|
+
# Удаление файла.
|
|
38
|
+
os.remove(path + "/" + Item)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
#==========================================================================================#
|
|
4
|
+
# >>>>> ФУНКЦИИ УПРОЩЁННОЙ РАБОТЫ С JSON <<<<< #
|
|
5
|
+
#==========================================================================================#
|
|
6
|
+
|
|
7
|
+
def ReadJSON(path: str) -> dict:
|
|
8
|
+
"""
|
|
9
|
+
Читает файл JSON и конвертирует его в словарь.
|
|
10
|
+
path – путь к файлу.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# Словарь для преобразования.
|
|
14
|
+
JSON = dict()
|
|
15
|
+
# Открытие и чтение файла JSON.
|
|
16
|
+
with open(path, encoding = "utf-8") as FileRead: JSON = json.load(FileRead)
|
|
17
|
+
|
|
18
|
+
return JSON
|
|
19
|
+
|
|
20
|
+
def WriteJSON(path: str, dictionary: dict):
|
|
21
|
+
"""
|
|
22
|
+
Записывает стандартизированный JSON файл. Для отступов используются символы табуляции.
|
|
23
|
+
path – путь к файлу;
|
|
24
|
+
dictionary – словарь, конвертируемый в формат JSON.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
# Запись словаря в JSON файл.
|
|
28
|
+
with open(path, "w", encoding = "utf-8") as FileWrite: json.dump(dictionary, FileWrite, ensure_ascii = False, indent = "\t", separators = (",", ": "))
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
#==========================================================================================#
|
|
5
|
+
# >>>>> ФУНКЦИИ РАБОТЫ С СИСТЕМОЙ <<<<< #
|
|
6
|
+
#==========================================================================================#
|
|
7
|
+
|
|
8
|
+
def CheckPythonMinimalVersion(major: int, minor: int, raise_exception: bool = True) -> bool:
|
|
9
|
+
"""
|
|
10
|
+
Проверяет, соответствует ли используемая версия Python минимальной требуемой.
|
|
11
|
+
major – идентификатор Major-версии Python;
|
|
12
|
+
minor – идентификатор Minor-версии Python;
|
|
13
|
+
raise_exception – указывает, как поступать при несоответствии версии: выбрасывать исключение или возвращать значение.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# Состояние: корректна ли версия.
|
|
17
|
+
IsVersionCorrect = True
|
|
18
|
+
|
|
19
|
+
# Если версия Python старше минимальной требуемой.
|
|
20
|
+
if sys.version_info < (major, minor):
|
|
21
|
+
|
|
22
|
+
# Если указано выбросить исключение.
|
|
23
|
+
if raise_exception == True:
|
|
24
|
+
# Выброс исключения.
|
|
25
|
+
raise RuntimeError(f"Python {major}.{minor} or newer is required.")
|
|
26
|
+
|
|
27
|
+
else:
|
|
28
|
+
# Переключение статуса проверки.
|
|
29
|
+
IsVersionCorrect = False
|
|
30
|
+
|
|
31
|
+
return IsVersionCorrect
|
|
32
|
+
|
|
33
|
+
def Cls():
|
|
34
|
+
"""Очищает консоль."""
|
|
35
|
+
|
|
36
|
+
os.system("cls" if os.name == "nt" else "clear")
|
|
37
|
+
|
|
38
|
+
def Shutdown():
|
|
39
|
+
"""Выключает устройство."""
|
|
40
|
+
|
|
41
|
+
# Если устройство работает под управлением ОС семейства Linux.
|
|
42
|
+
if sys.platform in ["linux", "linux2"]: os.system("sudo shutdown now")
|
|
43
|
+
# Если устройство работает под управлением ОС семейства Windows.
|
|
44
|
+
if sys.platform == "win32": os.system("shutdown /s")
|
|
File without changes
|
|
@@ -16,6 +16,12 @@ class UserData:
|
|
|
16
16
|
# >>>>> СВОЙСТВА ТОЛЬКО ДЛЯ ЧТЕНИЯ <<<<< #
|
|
17
17
|
#==========================================================================================#
|
|
18
18
|
|
|
19
|
+
@property
|
|
20
|
+
def expected_type(self) -> int:
|
|
21
|
+
"""Тип ожидаемого значения."""
|
|
22
|
+
|
|
23
|
+
return self.__Data["expected_type"]
|
|
24
|
+
|
|
19
25
|
@property
|
|
20
26
|
def id(self) -> int:
|
|
21
27
|
"""ID пользователя."""
|
|
@@ -56,6 +62,19 @@ class UserData:
|
|
|
56
62
|
# Запись локального файла.
|
|
57
63
|
WriteJSON(self.__StorageDirectory + f"/{self.__ID}.json", self.__Data)
|
|
58
64
|
|
|
65
|
+
def __SetProperty(self, property_type: str, key: str, value: any):
|
|
66
|
+
"""
|
|
67
|
+
Задаёт свойство пользователя.
|
|
68
|
+
property_type – ключ раздела хранения свойства;
|
|
69
|
+
key – ключ свойства;
|
|
70
|
+
value – значение.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
# Обновление данных.
|
|
74
|
+
self.__Data[property_type][key] = value
|
|
75
|
+
# Сохранение данных.
|
|
76
|
+
self.__SaveData()
|
|
77
|
+
|
|
59
78
|
#==========================================================================================#
|
|
60
79
|
# >>>>> ПУБЛИЧНЫЕ МЕТОДЫ <<<<< #
|
|
61
80
|
#==========================================================================================#
|
|
@@ -79,8 +98,10 @@ class UserData:
|
|
|
79
98
|
"username": None,
|
|
80
99
|
"language": None,
|
|
81
100
|
"is_premium": None,
|
|
101
|
+
"expected_type": None,
|
|
82
102
|
"permissions": [],
|
|
83
|
-
"data": {}
|
|
103
|
+
"data": {},
|
|
104
|
+
"temp": {}
|
|
84
105
|
}
|
|
85
106
|
|
|
86
107
|
# Если переданы данные в виде словаря.
|
|
@@ -129,6 +150,14 @@ class UserData:
|
|
|
129
150
|
# Сохранение данных.
|
|
130
151
|
self.__SaveData()
|
|
131
152
|
|
|
153
|
+
def clear_temp_properties(self):
|
|
154
|
+
"""Очищает временные свойства пользователя."""
|
|
155
|
+
|
|
156
|
+
# Сброс временных свойств.
|
|
157
|
+
self.__Data["temp"] = dict()
|
|
158
|
+
# Сохранение данных.
|
|
159
|
+
self.__SaveData()
|
|
160
|
+
|
|
132
161
|
def create_property(self, key: str, value: any, force: bool = True):
|
|
133
162
|
"""
|
|
134
163
|
Создаёт свойство пользователя и задаёт ему значение, если такового ещё не существует.
|
|
@@ -137,20 +166,20 @@ class UserData:
|
|
|
137
166
|
force – указывает, необходимо ли перезаписывать значение уже существующего ключа.
|
|
138
167
|
"""
|
|
139
168
|
|
|
140
|
-
# Если свойства не
|
|
141
|
-
if key not in self.__Data["data"].keys() or force:
|
|
142
|
-
# Создание свойства.
|
|
143
|
-
self.__Data["data"][key] = value
|
|
144
|
-
# Сохранение данных.
|
|
145
|
-
self.__SaveData()
|
|
169
|
+
# Если свойства не существует или включён режим перезаписи, создать его.
|
|
170
|
+
if key not in self.__Data["data"].keys() or force: self.__SetProperty("data", key, value)
|
|
146
171
|
|
|
147
172
|
def get_property(self, key: str) -> any:
|
|
148
173
|
"""
|
|
149
|
-
Возвращает значение свойства
|
|
174
|
+
Возвращает значение свойства пользователя, в том числе временного.
|
|
150
175
|
key – ключ свойства.
|
|
151
176
|
"""
|
|
152
177
|
|
|
153
|
-
|
|
178
|
+
# Получение значения из свойств пользователя.
|
|
179
|
+
if key in self.__Data["data"].keys(): return self.__Data["data"][key]
|
|
180
|
+
if key in self.__Data["temp"].keys(): return self.__Data["temp"][key]
|
|
181
|
+
|
|
182
|
+
raise KeyError(key)
|
|
154
183
|
|
|
155
184
|
def has_permissions(self, permissions: list[str] | str) -> bool:
|
|
156
185
|
"""
|
|
@@ -210,6 +239,17 @@ class UserData:
|
|
|
210
239
|
# Сохранение данных.
|
|
211
240
|
self.__SaveData()
|
|
212
241
|
|
|
242
|
+
def set_expected_type(self, type_name: str):
|
|
243
|
+
"""
|
|
244
|
+
Задаёт ожидаемый от пользователя тип данных.
|
|
245
|
+
type_name – название типа.
|
|
246
|
+
"""
|
|
247
|
+
|
|
248
|
+
# Установка ожидаемого типа.
|
|
249
|
+
self.__Data["expected_type"] = type_name
|
|
250
|
+
# Сохранение данных.
|
|
251
|
+
self.__SaveData()
|
|
252
|
+
|
|
213
253
|
def set_property(self, key: str, value: any):
|
|
214
254
|
"""
|
|
215
255
|
Обновляет значение существующего свойства пользователя.
|
|
@@ -217,12 +257,18 @@ class UserData:
|
|
|
217
257
|
value – значение.
|
|
218
258
|
"""
|
|
219
259
|
|
|
220
|
-
#
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
260
|
+
# Установка свойства пользователя.
|
|
261
|
+
self.__SetProperty("data", key, value)
|
|
262
|
+
|
|
263
|
+
def set_temp_property(self, key: str, value: any):
|
|
264
|
+
"""
|
|
265
|
+
Задаёт значение временного свойства пользователя.
|
|
266
|
+
key – ключ свойства;
|
|
267
|
+
value – значение.
|
|
268
|
+
"""
|
|
269
|
+
|
|
270
|
+
# Установка временного свойства пользователя.
|
|
271
|
+
self.__SetProperty("temp", key, value)
|
|
226
272
|
|
|
227
273
|
def update(self, user: User):
|
|
228
274
|
"""
|
|
@@ -678,7 +678,9 @@ class Terminalyzer:
|
|
|
678
678
|
if FreeParameters[Index] != None:
|
|
679
679
|
|
|
680
680
|
# Если параметр соответствует типу.
|
|
681
|
-
if self.__CheckArgumentsTypes(FreeParameters[Index], ArgumentsDescription[Index]["type"])
|
|
681
|
+
if self.__CheckArgumentsTypes(FreeParameters[Index], ArgumentsDescription[Index]["type"]):
|
|
682
|
+
# Если значение должно быть числом, провести преобразование.
|
|
683
|
+
if ArgumentsDescription[Index]["type"] == ArgumentsTypes.Number: FreeParameters[Index] = int(FreeParameters[Index])
|
|
682
684
|
# Сохранение параметра в качестве аргумента.
|
|
683
685
|
Values.append(FreeParameters[Index])
|
|
684
686
|
|
|
@@ -848,6 +850,8 @@ class Terminalyzer:
|
|
|
848
850
|
IsPositionActivated = True
|
|
849
851
|
# Проверка типа значения ключа.
|
|
850
852
|
self.__CheckArgumentsTypes(Keys[KeyName], KeysPositions[PositionIndex]["types"][KeyIndex])
|
|
853
|
+
# Если значение должно быть числом, провести преобразование.
|
|
854
|
+
if KeysPositions[PositionIndex]["types"][KeyIndex] == ArgumentsTypes.Number: Keys[KeyName] = int(Keys[KeyName])
|
|
851
855
|
|
|
852
856
|
# Если для ключа задан слой.
|
|
853
857
|
if KeysPositions[PositionIndex]["layout-index"] != None:
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dublib
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Коллекция модулей от DUB1401.
|
|
5
5
|
Author-email: DUB1401 <vlad.milosta@outlook.com>
|
|
6
6
|
License: This is free and unencumbered software released into the public domain.
|
|
@@ -55,11 +55,15 @@ Requires-Dist: pyTelegramBotAPI; extra == "telebot"
|
|
|
55
55
|
# dublib
|
|
56
56
|
**dublib** – это библиотека, поставляющая компоненты, требующиеся в проектах [@DUB1401](https://github.com/DUB1401), написанных на Python.
|
|
57
57
|
|
|
58
|
+
Данный набор модулей распространяется по Rolling-модели. Это значит, что разработчик не заботится об обратной совместимости с прошлыми релизами, потому рекомендуется привязывать ваш проект строго к определённой версии библиотеки.
|
|
59
|
+
|
|
60
|
+
Все компоненты поставляют лишь базовую документацию, необходимую для общего понимания принципов работы. Библиотека является самодокументируемой.
|
|
61
|
+
|
|
58
62
|
# Поставляемые компоненты
|
|
59
63
|
Библиотека включает следующие модули:
|
|
64
|
+
* [CLI](https://github.com/DUB1401/dublib/blob/main/docs/CLI.md)
|
|
60
65
|
* [Methods](https://github.com/DUB1401/dublib/blob/main/docs/Methods.md)
|
|
61
66
|
* [Polyglot](https://github.com/DUB1401/dublib/blob/main/docs/Polyglot.md)
|
|
62
|
-
* [StyledPrinter](https://github.com/DUB1401/dublib/blob/main/docs/StyledPrinter.md)
|
|
63
67
|
* [TelebotUtils](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
64
68
|
* [Terminalyzer](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
65
69
|
* [WebRequestor](https://github.com/DUB1401/dublib/blob/main/docs/WebRequestor.md)
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
LICENSE
|
|
2
2
|
README.md
|
|
3
3
|
pyproject.toml
|
|
4
|
-
src/dublib/Methods.py
|
|
5
4
|
src/dublib/Polyglot.py
|
|
6
|
-
src/dublib/StyledPrinter.py
|
|
7
5
|
src/dublib/TelebotUtils.py
|
|
8
6
|
src/dublib/Terminalyzer.py
|
|
9
7
|
src/dublib/WebRequestor.py
|
|
@@ -13,8 +11,16 @@ src/dublib.egg-info/SOURCES.txt
|
|
|
13
11
|
src/dublib.egg-info/dependency_links.txt
|
|
14
12
|
src/dublib.egg-info/requires.txt
|
|
15
13
|
src/dublib.egg-info/top_level.txt
|
|
16
|
-
src/dublib/
|
|
14
|
+
src/dublib/CLI/StyledPrinter.py
|
|
15
|
+
src/dublib/CLI/Templates.py
|
|
16
|
+
src/dublib/CLI/__init__.py
|
|
17
|
+
src/dublib/Exceptions/CLI.py
|
|
17
18
|
src/dublib/Exceptions/TelebotUtils.py
|
|
18
19
|
src/dublib/Exceptions/Terminalyzer.py
|
|
19
20
|
src/dublib/Exceptions/WebRequestor.py
|
|
20
|
-
src/dublib/Exceptions/__init__.py
|
|
21
|
+
src/dublib/Exceptions/__init__.py
|
|
22
|
+
src/dublib/Methods/Data.py
|
|
23
|
+
src/dublib/Methods/Filesystem.py
|
|
24
|
+
src/dublib/Methods/JSON.py
|
|
25
|
+
src/dublib/Methods/System.py
|
|
26
|
+
src/dublib/Methods/__init__.py
|
|
File without changes
|
|
File without changes
|
/dublib-0.6.2/src/dublib/Exceptions/StyledPrinter.py → /dublib-0.7.0/src/dublib/Exceptions/CLI.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|