libdev 0.78__tar.gz → 0.79__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.
- {libdev-0.78 → libdev-0.79}/PKG-INFO +16 -15
- libdev-0.79/README.md +22 -0
- {libdev-0.78 → libdev-0.79}/libdev/__init__.py +1 -1
- {libdev-0.78 → libdev-0.79}/libdev/cfg.py +8 -8
- libdev-0.79/libdev/check.py +180 -0
- libdev-0.79/libdev/codes.py +365 -0
- libdev-0.79/libdev/dev.py +21 -0
- {libdev-0.78 → libdev-0.79}/libdev/doc.py +2 -2
- libdev-0.79/libdev/fin.py +352 -0
- libdev-0.79/libdev/gen.py +38 -0
- {libdev-0.78 → libdev-0.79}/libdev/img.py +27 -12
- libdev-0.79/libdev/lang.py +122 -0
- {libdev-0.78 → libdev-0.79}/libdev/num.py +3 -3
- {libdev-0.78 → libdev-0.79}/libdev/req.py +22 -1
- {libdev-0.78 → libdev-0.79}/libdev/s3.py +21 -5
- {libdev-0.78 → libdev-0.79}/libdev/time.py +69 -74
- {libdev-0.78 → libdev-0.79}/libdev.egg-info/PKG-INFO +16 -15
- {libdev-0.78 → libdev-0.79}/libdev.egg-info/requires.txt +0 -1
- {libdev-0.78 → libdev-0.79}/setup.py +1 -2
- libdev-0.79/tests/test_cfg.py +36 -0
- libdev-0.79/tests/test_check.py +106 -0
- libdev-0.79/tests/test_codes.py +30 -0
- libdev-0.79/tests/test_dev.py +17 -0
- {libdev-0.78 → libdev-0.79}/tests/test_doc.py +2 -2
- {libdev-0.78 → libdev-0.79}/tests/test_gen.py +2 -0
- libdev-0.79/tests/test_img.py +42 -0
- libdev-0.79/tests/test_lang.py +78 -0
- {libdev-0.78 → libdev-0.79}/tests/test_req.py +1 -1
- libdev-0.79/tests/test_s3.py +26 -0
- libdev-0.78/README.md +0 -20
- libdev-0.78/libdev/check.py +0 -96
- libdev-0.78/libdev/codes.py +0 -363
- libdev-0.78/libdev/dev.py +0 -16
- libdev-0.78/libdev/fin.py +0 -352
- libdev-0.78/libdev/gen.py +0 -42
- libdev-0.78/libdev/lang.py +0 -124
- libdev-0.78/tests/test_cfg.py +0 -33
- libdev-0.78/tests/test_check.py +0 -93
- libdev-0.78/tests/test_codes.py +0 -28
- libdev-0.78/tests/test_dev.py +0 -17
- libdev-0.78/tests/test_img.py +0 -19
- libdev-0.78/tests/test_lang.py +0 -60
- libdev-0.78/tests/test_s3.py +0 -24
- {libdev-0.78 → libdev-0.79}/LICENSE +0 -0
- {libdev-0.78 → libdev-0.79}/libdev.egg-info/SOURCES.txt +0 -0
- {libdev-0.78 → libdev-0.79}/libdev.egg-info/dependency_links.txt +0 -0
- {libdev-0.78 → libdev-0.79}/libdev.egg-info/top_level.txt +0 -0
- {libdev-0.78 → libdev-0.79}/setup.cfg +0 -0
- {libdev-0.78 → libdev-0.79}/tests/test_num.py +0 -0
- {libdev-0.78 → libdev-0.79}/tests/test_time.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: libdev
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.79
|
|
4
4
|
Summary: Set of standard functions for development
|
|
5
5
|
Home-page: https://github.com/kosyachniy/lib
|
|
6
6
|
Author: Alexey Poloz
|
|
@@ -18,7 +18,6 @@ Classifier: Operating System :: OS Independent
|
|
|
18
18
|
Requires-Python: >=3.7, <4
|
|
19
19
|
Description-Content-Type: text/markdown
|
|
20
20
|
License-File: LICENSE
|
|
21
|
-
Requires-Dist: requests
|
|
22
21
|
Requires-Dist: aiohttp
|
|
23
22
|
Requires-Dist: python-dotenv==1.0.1
|
|
24
23
|
Requires-Dist: boto3==1.34.136
|
|
@@ -31,16 +30,18 @@ Development library — Set of standard functions for development
|
|
|
31
30
|
| [PyPI](https://pypi.org/project/libdev/)
|
|
32
31
|
|
|
33
32
|
## Submodules
|
|
34
|
-
Submodule | Description
|
|
35
|
-
|
|
36
|
-
` libdev.cfg ` | Configuration getting
|
|
37
|
-
` libdev.
|
|
38
|
-
` libdev.
|
|
39
|
-
` libdev.
|
|
40
|
-
` libdev.gen ` | Code & token generators
|
|
41
|
-
` libdev.codes ` | Ciphers: langs & flags / networks / user statuses
|
|
42
|
-
` libdev.
|
|
43
|
-
` libdev.
|
|
44
|
-
` libdev.
|
|
45
|
-
` libdev.
|
|
46
|
-
` libdev.
|
|
33
|
+
Stream | Submodule | Description
|
|
34
|
+
---|---|---
|
|
35
|
+
System | ` libdev.cfg ` | Configuration getting
|
|
36
|
+
| ` libdev.req ` | AsyncIO requests (AIOHTTP wrapper)
|
|
37
|
+
Data Format | ` libdev.num ` | Numeric conversions & handlers
|
|
38
|
+
| ` libdev.time ` | Time processing
|
|
39
|
+
Transforms | ` libdev.gen ` | Code & token generators
|
|
40
|
+
| ` libdev.codes ` | Ciphers: langs & flags / networks / user statuses
|
|
41
|
+
| ` libdev.check ` | Validation functions
|
|
42
|
+
Fields | ` libdev.dev ` | Development tools
|
|
43
|
+
| ` libdev.fin ` | Financial codes and tools
|
|
44
|
+
| ` libdev.lang ` | Natural language formatters
|
|
45
|
+
Files | ` libdev.doc ` | Documents handlers
|
|
46
|
+
| ` libdev.s3 ` | S3 file server functions
|
|
47
|
+
| ` libdev.img ` | Image processing
|
libdev-0.79/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# LibDev
|
|
2
|
+
Development library — Set of standard functions for development
|
|
3
|
+
|
|
4
|
+
[GitHub](https://github.com/kosyachniy/lib)
|
|
5
|
+
| [PyPI](https://pypi.org/project/libdev/)
|
|
6
|
+
|
|
7
|
+
## Submodules
|
|
8
|
+
Stream | Submodule | Description
|
|
9
|
+
---|---|---
|
|
10
|
+
System | ` libdev.cfg ` | Configuration getting
|
|
11
|
+
| ` libdev.req ` | AsyncIO requests (AIOHTTP wrapper)
|
|
12
|
+
Data Format | ` libdev.num ` | Numeric conversions & handlers
|
|
13
|
+
| ` libdev.time ` | Time processing
|
|
14
|
+
Transforms | ` libdev.gen ` | Code & token generators
|
|
15
|
+
| ` libdev.codes ` | Ciphers: langs & flags / networks / user statuses
|
|
16
|
+
| ` libdev.check ` | Validation functions
|
|
17
|
+
Fields | ` libdev.dev ` | Development tools
|
|
18
|
+
| ` libdev.fin ` | Financial codes and tools
|
|
19
|
+
| ` libdev.lang ` | Natural language formatters
|
|
20
|
+
Files | ` libdev.doc ` | Documents handlers
|
|
21
|
+
| ` libdev.s3 ` | S3 file server functions
|
|
22
|
+
| ` libdev.img ` | Image processing
|
|
@@ -8,20 +8,20 @@ import json
|
|
|
8
8
|
from dotenv import load_dotenv
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
if os.path.isfile(
|
|
12
|
-
with open(
|
|
11
|
+
if os.path.isfile("sets.json"):
|
|
12
|
+
with open("sets.json", "r", encoding="utf-8") as file:
|
|
13
13
|
sets = json.loads(file.read())
|
|
14
14
|
else:
|
|
15
15
|
sets = {}
|
|
16
16
|
|
|
17
|
-
if os.path.isfile(
|
|
17
|
+
if os.path.isfile(".env"):
|
|
18
18
|
load_dotenv()
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def cfg(name, default=None):
|
|
22
|
-
"""
|
|
22
|
+
"""Get config value by key"""
|
|
23
23
|
|
|
24
|
-
keys = name.split(
|
|
24
|
+
keys = name.split(".")
|
|
25
25
|
data = sets
|
|
26
26
|
|
|
27
27
|
for key in keys:
|
|
@@ -31,7 +31,7 @@ def cfg(name, default=None):
|
|
|
31
31
|
else:
|
|
32
32
|
return data
|
|
33
33
|
|
|
34
|
-
name = name.replace(
|
|
34
|
+
name = name.replace(".", "_").upper()
|
|
35
35
|
value = os.getenv(name, default)
|
|
36
36
|
|
|
37
37
|
if value:
|
|
@@ -44,9 +44,9 @@ def cfg(name, default=None):
|
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
def set_cfg(name, value):
|
|
47
|
-
"""
|
|
47
|
+
"""Set config value"""
|
|
48
48
|
|
|
49
|
-
array_name = name.split(
|
|
49
|
+
array_name = name.split(".")
|
|
50
50
|
dictionary = {}
|
|
51
51
|
tmp_dict = {}
|
|
52
52
|
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Checking functionality
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from typing import Union
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
PATTERN_PHONE = r"\(?\+?[0-9\s\-\(\)./]{7,30}"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def check_phone(value: Union[str, int]) -> bool:
|
|
13
|
+
"""Check phone validity"""
|
|
14
|
+
if isinstance(value, int):
|
|
15
|
+
value = str(value)
|
|
16
|
+
return re.match(PATTERN_PHONE, value) is not None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def rm_phone(value: Union[str, int]) -> str:
|
|
20
|
+
"""Remove phone number"""
|
|
21
|
+
return re.sub(PATTERN_PHONE, "", value).strip()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def fake_phone(value: str) -> bool:
|
|
25
|
+
"""Check a phone for a test format"""
|
|
26
|
+
|
|
27
|
+
if value is None:
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
value = str(value)
|
|
31
|
+
|
|
32
|
+
return any(
|
|
33
|
+
fake in value
|
|
34
|
+
for fake in (
|
|
35
|
+
"00000",
|
|
36
|
+
"11111",
|
|
37
|
+
"22222",
|
|
38
|
+
"33333",
|
|
39
|
+
"44444",
|
|
40
|
+
"55555",
|
|
41
|
+
"66666",
|
|
42
|
+
"77777",
|
|
43
|
+
"88888",
|
|
44
|
+
"99999",
|
|
45
|
+
"12345",
|
|
46
|
+
"98765",
|
|
47
|
+
#'2345', '3456', '4567', '5678', '6789',
|
|
48
|
+
# '8765', '7654', '6543', '5432', '4321',
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def fake_login(value: str) -> bool:
|
|
54
|
+
"""Check a login / name for a test format"""
|
|
55
|
+
|
|
56
|
+
if value is None:
|
|
57
|
+
return False
|
|
58
|
+
|
|
59
|
+
value = value.lower()
|
|
60
|
+
|
|
61
|
+
return any(
|
|
62
|
+
fake in value
|
|
63
|
+
for fake in (
|
|
64
|
+
"test",
|
|
65
|
+
"тест",
|
|
66
|
+
"check",
|
|
67
|
+
"demo",
|
|
68
|
+
"asd",
|
|
69
|
+
"asf",
|
|
70
|
+
"qwe",
|
|
71
|
+
"sdf",
|
|
72
|
+
"sfg",
|
|
73
|
+
"sfd",
|
|
74
|
+
"hgf",
|
|
75
|
+
"gfd",
|
|
76
|
+
"dgf",
|
|
77
|
+
"qaz",
|
|
78
|
+
"wsx",
|
|
79
|
+
"edc",
|
|
80
|
+
"rfv",
|
|
81
|
+
"qwd",
|
|
82
|
+
"lalala",
|
|
83
|
+
"lolkek",
|
|
84
|
+
"0000",
|
|
85
|
+
"1111",
|
|
86
|
+
"2222",
|
|
87
|
+
"3333",
|
|
88
|
+
"4444",
|
|
89
|
+
"5555",
|
|
90
|
+
"6666",
|
|
91
|
+
"7777",
|
|
92
|
+
"8888",
|
|
93
|
+
"9999",
|
|
94
|
+
"1234",
|
|
95
|
+
"9876", # '1212', '2323'
|
|
96
|
+
"ыва",
|
|
97
|
+
"фыв",
|
|
98
|
+
"йцу",
|
|
99
|
+
"aaaa",
|
|
100
|
+
"bbb",
|
|
101
|
+
"ccc",
|
|
102
|
+
"rrr",
|
|
103
|
+
"zzz",
|
|
104
|
+
"ааа",
|
|
105
|
+
"ббб",
|
|
106
|
+
"ввв",
|
|
107
|
+
"ггг",
|
|
108
|
+
"ддд",
|
|
109
|
+
"еее",
|
|
110
|
+
"ёёё",
|
|
111
|
+
"жжж",
|
|
112
|
+
"ззз",
|
|
113
|
+
"иии",
|
|
114
|
+
"ййй",
|
|
115
|
+
"ккк",
|
|
116
|
+
"ллл",
|
|
117
|
+
"ммм",
|
|
118
|
+
"ннн",
|
|
119
|
+
"ооо",
|
|
120
|
+
"ппп",
|
|
121
|
+
"ррр",
|
|
122
|
+
"ссс",
|
|
123
|
+
"ттт",
|
|
124
|
+
"ууу",
|
|
125
|
+
"ффф",
|
|
126
|
+
"ххх",
|
|
127
|
+
"ццц",
|
|
128
|
+
"ччч",
|
|
129
|
+
"шшш",
|
|
130
|
+
"щщщ",
|
|
131
|
+
"ъъъ",
|
|
132
|
+
"ыыы",
|
|
133
|
+
"ььь",
|
|
134
|
+
"эээ",
|
|
135
|
+
"ююю",
|
|
136
|
+
"яяя",
|
|
137
|
+
)
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def check_mail(value: str) -> bool:
|
|
142
|
+
"""Check mail validity"""
|
|
143
|
+
if value is None:
|
|
144
|
+
return False
|
|
145
|
+
return re.match(r".{1,64}@.{1,63}\..{1,15}", value) is not None
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def fake_mail(value: str) -> bool:
|
|
149
|
+
"""Check a mail for a test format"""
|
|
150
|
+
|
|
151
|
+
if value is None:
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
fake = (
|
|
155
|
+
not check_mail(value)
|
|
156
|
+
or fake_login(value)
|
|
157
|
+
or not re.search(r"@[a-zA-Z]+\.", value)
|
|
158
|
+
)
|
|
159
|
+
return fake
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def check_url(data: str) -> bool:
|
|
163
|
+
"""Check url validity"""
|
|
164
|
+
if data is None:
|
|
165
|
+
return False
|
|
166
|
+
# pylint: disable=line-too-long
|
|
167
|
+
return (
|
|
168
|
+
re.match(
|
|
169
|
+
r"^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$",
|
|
170
|
+
data,
|
|
171
|
+
)
|
|
172
|
+
is not None
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def get_last_url(data: str) -> str:
|
|
177
|
+
"""Get the last part of a URL"""
|
|
178
|
+
if data is None:
|
|
179
|
+
return None
|
|
180
|
+
return re.sub(r".*/(.+?)/?$", r"\1", data)
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Database ciphers
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from .cfg import cfg
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# NOTE: ISO 639-1
|
|
9
|
+
LOCALES = (
|
|
10
|
+
"en", # English (UK) / English
|
|
11
|
+
"ru", # Russian / Русский
|
|
12
|
+
"zh", # Chinese / 中文
|
|
13
|
+
"es", # Spanish / Español
|
|
14
|
+
"de", # German / Deutsch
|
|
15
|
+
"fr", # French / Français
|
|
16
|
+
"ja", # Japanese / 日本語
|
|
17
|
+
"pt", # Portuguese / Português
|
|
18
|
+
"it", # Italian / Italiano
|
|
19
|
+
"pl", # Polish / Polski
|
|
20
|
+
"tr", # Turkish / Türkçe
|
|
21
|
+
"nl", # Dutch / Nederlands
|
|
22
|
+
"cs", # Czech / Čeština
|
|
23
|
+
"ko", # Korean / 한국어
|
|
24
|
+
"vi", # Vietnamese / Việt ngữ
|
|
25
|
+
"fa", # Persian / فارسی
|
|
26
|
+
"ar", # Arabic / العربية
|
|
27
|
+
"el", # Greek / Ελληνικά
|
|
28
|
+
"hu", # Hungarian / Magyar
|
|
29
|
+
"sv", # Swedish / Svenska
|
|
30
|
+
"ro", # Romanian / Română
|
|
31
|
+
"sk", # Slovak / Slovenčina
|
|
32
|
+
"id", # Indonesian / Bahasa Indonesia
|
|
33
|
+
"da", # Danish / Dansk
|
|
34
|
+
"th", # Thai / ไทย
|
|
35
|
+
"fi", # Finnish / Suomi
|
|
36
|
+
"bg", # Bulgarian / Български език
|
|
37
|
+
"uk", # Ukrainian / Українська
|
|
38
|
+
"he", # Hebrew / עברית
|
|
39
|
+
"no", # Norwegian / Norsk
|
|
40
|
+
# 'nb', # Norwegian (Bokmål)
|
|
41
|
+
"hr", # Croatian / Hrvatski jezik
|
|
42
|
+
"sr", # Serbian / Српски језик
|
|
43
|
+
"lt", # Lithuanian / Lietuvių kalba
|
|
44
|
+
"sl", # Slovenian (Slovene) / Slovenščina
|
|
45
|
+
# 'nn', # Norwegian (Nynorsk)
|
|
46
|
+
"ca", # Catalan / Català
|
|
47
|
+
"lv", # Latvian / Latviešu valoda
|
|
48
|
+
"hi", # Hindi / हिन्दी
|
|
49
|
+
"et", # Estonian / Eesti keel
|
|
50
|
+
"az", # Azerbaijani / Azərbaycan dili
|
|
51
|
+
"so", # Somali / Af Soomaali
|
|
52
|
+
"af", # Afrikaans / Afrikaans
|
|
53
|
+
# Malaysian Malay / Bahasa Malaysia
|
|
54
|
+
"ms", # Malay / Bahasa Melayu
|
|
55
|
+
"jv", # Javanese / Basa Jawa
|
|
56
|
+
"su", # Sundanese / Basa Sunda
|
|
57
|
+
"bs", # Bosnian / Bosanski jezik
|
|
58
|
+
"ny", # Chichewa / Chichewa
|
|
59
|
+
"cy", # Welsh / Cymraeg
|
|
60
|
+
"eo", # Esperanto / Esperanto
|
|
61
|
+
"eu", # Basque / Euskara
|
|
62
|
+
"ga", # Irish / Gaeilge
|
|
63
|
+
"gl", # Galician / Galego
|
|
64
|
+
"xh", # Xhosa / isiXhosa
|
|
65
|
+
"zu", # Zulu / isiZulu
|
|
66
|
+
"is", # Icelandic / Íslenska
|
|
67
|
+
"sw", # Swahili / Kiswahili
|
|
68
|
+
"ht", # Haitian Creole / Kreyòl Ayisyen
|
|
69
|
+
"ku", # Kurdish / Kurdî
|
|
70
|
+
"la", # Latin / Latīna
|
|
71
|
+
"lb", # Luxembourgish / Lëtzebuergesch
|
|
72
|
+
"mg", # Malagasy / Malagasy
|
|
73
|
+
"mt", # Maltese / Malti
|
|
74
|
+
"mi", # Maori / Māori
|
|
75
|
+
"uz", # Uzbek / O'zbek tili
|
|
76
|
+
# Sesotho / Sesotho
|
|
77
|
+
"sq", # Albanian / Shqip
|
|
78
|
+
"tl", # Tagalog / Tagalog
|
|
79
|
+
"tt", # Tatar / Tatarça
|
|
80
|
+
"yo", # Yoruba / Yorùbá
|
|
81
|
+
"be", # Belarusian / Беларуская мова
|
|
82
|
+
"ky", # Kyrgyz / Кыр
|
|
83
|
+
"kk", # Kazakh / Қазақ тілі
|
|
84
|
+
"mk", # Macedonian / Македонски јазик
|
|
85
|
+
"mn", # Mongolian / Монгол хэл
|
|
86
|
+
"tg", # Tajik / Тоҷикӣ
|
|
87
|
+
"ka", # Georgian / ქართული
|
|
88
|
+
"hy", # Armenian / Հայերեն
|
|
89
|
+
"yi", # Yiddish / ייִדיש
|
|
90
|
+
"ug", # Uyghur / ئۇيغۇرچە
|
|
91
|
+
"ur", # Urdu / اردو
|
|
92
|
+
"ps", # Pashto / پښتو
|
|
93
|
+
"ne", # Nepali / नेपाली
|
|
94
|
+
"mr", # Marathi / मराठी
|
|
95
|
+
"bn", # Bengali / বাংলা
|
|
96
|
+
"pa", # Punjabi / ਪੰਜਾਬੀ
|
|
97
|
+
"gu", # Gujarati / ગુજરાતી
|
|
98
|
+
"or", # Oriya / ଓଡ଼ିଆ
|
|
99
|
+
"ta", # Tamil / தமிழ்
|
|
100
|
+
"te", # Telugu / తెలుగు
|
|
101
|
+
"kn", # Kannada / ಕನ್ನಡ
|
|
102
|
+
"ml", # Malayalam / മലയാളം
|
|
103
|
+
"si", # Sinhala / සිංහල
|
|
104
|
+
"lo", # Lao / ພາສາລາວ
|
|
105
|
+
"my", # Burmese / ဗမာစာ
|
|
106
|
+
"km", # Khmer / ភាសាខ្មែរ
|
|
107
|
+
# 'aa', # Afar
|
|
108
|
+
# 'ab', # Abkhazian
|
|
109
|
+
# 'ae', # Avestan
|
|
110
|
+
# 'ak', # Akan
|
|
111
|
+
# 'am', # Amharic
|
|
112
|
+
# 'an', # Aragonese
|
|
113
|
+
# 'as', # Assamese
|
|
114
|
+
# 'av', # Avaric
|
|
115
|
+
# 'ay', # Aymara
|
|
116
|
+
# 'ba', # Bashkir
|
|
117
|
+
# 'bh', # Bihari languages
|
|
118
|
+
# 'bi', # Bislama
|
|
119
|
+
# 'bm', # Bambara
|
|
120
|
+
# 'bo', # Tibetan
|
|
121
|
+
# 'br', # Breton
|
|
122
|
+
# 'ce', # Chechen
|
|
123
|
+
# 'ch', # Chamorro
|
|
124
|
+
# 'co', # Corsican
|
|
125
|
+
# 'cr', # Cree
|
|
126
|
+
# 'cu', # Church Slavic; Old Slavonic; Church Slavonic;
|
|
127
|
+
# Old Bulgarian; Old Church Slavonic
|
|
128
|
+
# 'cv', # Chuvash
|
|
129
|
+
# 'dv', # Divehi; Dhivehi; Maldivian
|
|
130
|
+
# 'dz', # Dzongkha
|
|
131
|
+
# 'ee', # Ewe
|
|
132
|
+
# 'ff', # Fulah
|
|
133
|
+
# 'fj', # Fijian
|
|
134
|
+
# 'fo', # Faroese
|
|
135
|
+
# 'fy', # Western Frisian
|
|
136
|
+
# 'gd', # Gaelic; Scottish Gaelic
|
|
137
|
+
# 'gn', # Guarani
|
|
138
|
+
# 'gv', # Manx
|
|
139
|
+
# 'ha', # Hausa
|
|
140
|
+
# 'ho', # Hiri Motu
|
|
141
|
+
# 'hz', # Herero
|
|
142
|
+
# 'ia', # Interlingua (International Auxiliary Language Association)
|
|
143
|
+
# 'ie', # Interlingue; Occidental
|
|
144
|
+
# 'ig', # Igbo
|
|
145
|
+
# 'ii', # Sichuan Yi; Nuosu
|
|
146
|
+
# 'ik', # Inupiaq
|
|
147
|
+
# 'io', # Ido
|
|
148
|
+
# 'iu', # Inuktitut
|
|
149
|
+
# 'kg', # Kongo
|
|
150
|
+
# 'ki', # Kikuyu; Gikuyu
|
|
151
|
+
# 'kj', # Kuanyama; Kwanyama
|
|
152
|
+
# 'kl', # Kalaallisut; Greenlandic
|
|
153
|
+
# 'kr', # Kanuri
|
|
154
|
+
# 'ks', # Kashmiri
|
|
155
|
+
# 'kv', # Komi
|
|
156
|
+
# 'kw', # Cornish
|
|
157
|
+
# 'lg', # Ganda
|
|
158
|
+
# 'li', # Limburgan; Limburger; Limburgish
|
|
159
|
+
# 'ln', # Lingala
|
|
160
|
+
# 'lu', # Luba-Katanga
|
|
161
|
+
# 'mh', # Marshallese
|
|
162
|
+
# 'na', # Nauru
|
|
163
|
+
# 'nd', # Ndebele, North; North Ndebele
|
|
164
|
+
# 'ng', # Ndonga
|
|
165
|
+
# 'nr', # Ndebele, South; South Ndebele
|
|
166
|
+
# 'nv', # Navajo; Navaho
|
|
167
|
+
# 'oc', # Occitan (post 1500)
|
|
168
|
+
# 'oj', # Ojibwa
|
|
169
|
+
# 'om', # Oromo
|
|
170
|
+
# 'os', # Ossetian; Ossetic
|
|
171
|
+
# 'pi', # Pali
|
|
172
|
+
# 'qu', # Quechua
|
|
173
|
+
# 'rm', # Romansh
|
|
174
|
+
# 'rn', # Rundi
|
|
175
|
+
# 'rw', # Kinyarwanda
|
|
176
|
+
# 'sa', # Sanskrit
|
|
177
|
+
# 'sc', # Sardinian
|
|
178
|
+
# 'sd', # Sindhi
|
|
179
|
+
# 'se', # Northern Sami
|
|
180
|
+
# 'sg', # Sango
|
|
181
|
+
# 'sm', # Samoan
|
|
182
|
+
# 'sn', # Shona
|
|
183
|
+
# 'ss', # Swati
|
|
184
|
+
# 'st', # Sotho, Southern
|
|
185
|
+
# 'ti', # Tigrinya
|
|
186
|
+
# 'tk', # Turkmen
|
|
187
|
+
# 'tn', # Tswana
|
|
188
|
+
# 'to', # Tonga (Tonga Islands)
|
|
189
|
+
# 'ts', # Tsonga
|
|
190
|
+
# 'tw', # Twi
|
|
191
|
+
# 'ty', # Tahitian
|
|
192
|
+
# 've', # Venda
|
|
193
|
+
# 'vo', # Volapük
|
|
194
|
+
# 'wa', # Walloon
|
|
195
|
+
# 'wo', # Wolof
|
|
196
|
+
# 'za', # Zhuang; Chuang
|
|
197
|
+
# 'us', # English (US) / English
|
|
198
|
+
# 'zh', # Traditional Chinese / 繁體中文
|
|
199
|
+
)
|
|
200
|
+
FLAGS = (
|
|
201
|
+
"🇬🇧", # English (UK) / English
|
|
202
|
+
"🇷🇺", # Russian / Русский
|
|
203
|
+
"🇨🇳", # Chinese / 中文
|
|
204
|
+
"🇪🇸", # Spanish / Español
|
|
205
|
+
"🇩🇪", # German / Deutsch
|
|
206
|
+
"🇫🇷", # French / Français
|
|
207
|
+
"🇯🇵", # Japanese / 日本語
|
|
208
|
+
"🇵🇹", # Portuguese / Português
|
|
209
|
+
"🇮🇹", # Italian / Italiano
|
|
210
|
+
"🇵🇱", # Polish / Polski
|
|
211
|
+
"🇹🇷", # Turkish / Türkçe
|
|
212
|
+
"🇳🇱", # Dutch / Nederlands
|
|
213
|
+
"🇨🇿", # Czech / Čeština
|
|
214
|
+
"🇰🇷", # Korean / 한국어
|
|
215
|
+
"🇻🇳", # Vietnamese / Việt ngữ
|
|
216
|
+
"🇮🇷", # Persian / فارسی
|
|
217
|
+
"🇦🇪", # Arabic / العربية # TODO: by country
|
|
218
|
+
"🇬🇷", # Greek / Ελληνικά
|
|
219
|
+
"🇭🇺", # Hungarian / Magyar
|
|
220
|
+
"🇸🇪", # Swedish / Svenska
|
|
221
|
+
"🇷🇴", # Romanian / Română
|
|
222
|
+
"🇸🇰", # Slovak / Slovenčina
|
|
223
|
+
"🇮🇩", # Indonesian / Bahasa Indonesia
|
|
224
|
+
"🇩🇰", # Danish / Dansk
|
|
225
|
+
"🇹🇭", # Thai / ไทย
|
|
226
|
+
"🇫🇮", # Finnish / Suomi
|
|
227
|
+
"🇧🇬", # Bulgarian / Български език
|
|
228
|
+
"🇺🇦", # Ukrainian / Українська
|
|
229
|
+
"🇮🇱", # Hebrew / עברית
|
|
230
|
+
"🇳🇴", # Norwegian / Norsk
|
|
231
|
+
# '🇳🇴', # Norwegian (Bokmål)
|
|
232
|
+
"🇭🇷", # Croatian / Hrvatski jezik
|
|
233
|
+
"🇷🇸", # Serbian / Српски језик
|
|
234
|
+
"🇱🇹", # Lithuanian / Lietuvių kalba
|
|
235
|
+
"🇸🇮", # Slovenian (Slovene) / Slovenščina
|
|
236
|
+
# '🇳🇴', # Norwegian (Nynorsk)
|
|
237
|
+
"🇦🇩", # Catalan / Català
|
|
238
|
+
"🇱🇻", # Latvian / Latviešu valoda
|
|
239
|
+
"🇮🇳", # Hindi / हिन्दी
|
|
240
|
+
"🇪🇪", # Estonian / Eesti keel
|
|
241
|
+
"🇦🇿", # Azerbaijani / Azərbaycan dili
|
|
242
|
+
"🇸🇴", # Somali / Af Soomaali
|
|
243
|
+
"🇿🇦", # Afrikaans / Afrikaans # FIXME
|
|
244
|
+
# Malaysian Malay / Bahasa Malaysia
|
|
245
|
+
"🇲🇾", # Malay / Bahasa Melayu
|
|
246
|
+
"🇮🇩", # Javanese / Basa Jawa
|
|
247
|
+
"🇮🇩", # Sundanese / Basa Sunda
|
|
248
|
+
"🇧🇦", # Bosnian / Bosanski jezik
|
|
249
|
+
"🇲🇼", # Chichewa / Chichewa
|
|
250
|
+
"🏴", # Welsh / Cymraeg
|
|
251
|
+
"🏳️", # Esperanto / Esperanto # FIXME
|
|
252
|
+
"🇪🇸", # Basque / Euskara
|
|
253
|
+
"🇮🇪", # Irish / Gaeilge
|
|
254
|
+
"🇪🇸", # Galician / Galego
|
|
255
|
+
"🇿🇦", # Xhosa / isiXhosa # FIXME
|
|
256
|
+
"🇿🇦", # Zulu / isiZulu
|
|
257
|
+
"🇮🇸", # Icelandic / Íslenska
|
|
258
|
+
"🇹🇿", # Swahili / Kiswahili
|
|
259
|
+
"🇭🇹", # Haitian Creole / Kreyòl Ayisyen
|
|
260
|
+
"🇮🇶", # Kurdish / Kurdî # FIXME
|
|
261
|
+
"🏳️", # Latin / Latīna # FIXME
|
|
262
|
+
"🇱🇺", # Luxembourgish / Lëtzebuergesch
|
|
263
|
+
"🇲🇬", # Malagasy / Malagasy
|
|
264
|
+
"🇲🇹", # Maltese / Malti
|
|
265
|
+
"🇳🇿", # Maori / Māori
|
|
266
|
+
"🇺🇿", # Uzbek / O'zbek tili
|
|
267
|
+
# Sesotho / Sesotho
|
|
268
|
+
"🇦🇱", # Albanian / Shqip
|
|
269
|
+
"🇵🇭", # Tagalog / Tagalog
|
|
270
|
+
"🇷🇺", # Tatar / Tatarça
|
|
271
|
+
"🇳🇬", # Yoruba / Yorùbá
|
|
272
|
+
"🇧🇾", # Belarusian / Беларуская мова
|
|
273
|
+
"🇰🇬", # Kyrgyz / Кыр
|
|
274
|
+
"🇰🇿", # Kazakh / Қазақ тілі
|
|
275
|
+
"🇲🇰", # Macedonian / Македонски јазик
|
|
276
|
+
"🇲🇳", # Mongolian / Монгол хэл
|
|
277
|
+
"🇹🇯", # Tajik / Тоҷикӣ
|
|
278
|
+
"🇬🇪", # Georgian / ქართული
|
|
279
|
+
"🇦🇲", # Armenian / Հայերեն
|
|
280
|
+
"🇮🇱", # Yiddish / ייִדיש # FIXME
|
|
281
|
+
"🇨🇳", # Uyghur / ئۇيغۇرچە
|
|
282
|
+
"🇵🇰", # Urdu / اردو
|
|
283
|
+
"🇦🇫", # Pashto / پښتو
|
|
284
|
+
"🇳🇵", # Nepali / नेपाली
|
|
285
|
+
"🇮🇳", # Marathi / मराठी
|
|
286
|
+
"🇧🇩", # Bengali / বাংলা
|
|
287
|
+
"🇵🇰", # Punjabi / ਪੰਜਾਬੀ
|
|
288
|
+
"🇮🇳", # Gujarati / ગુજરાતી
|
|
289
|
+
"🇮🇳", # Oriya / ଓଡ଼ିଆ
|
|
290
|
+
"🇮🇳", # Tamil / தமிழ்
|
|
291
|
+
"🇮🇳", # Telugu / తెలుగు
|
|
292
|
+
"🇮🇳", # Kannada / ಕನ್ನಡ
|
|
293
|
+
"🇮🇳", # Malayalam / മലയാളം
|
|
294
|
+
"🇱🇰", # Sinhala / සිංහල
|
|
295
|
+
"🇱🇦", # Lao / ພາສາລາວ
|
|
296
|
+
"🇲🇲", # Burmese / ဗမာစာ
|
|
297
|
+
"🇰🇭", # Khmer / ភាសាខ្មែរ
|
|
298
|
+
# '🇺🇸', # English (US) / English
|
|
299
|
+
# '🇨🇳', # Traditional Chinese / 繁體中文
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
NETWORKS = (
|
|
303
|
+
"", # Console
|
|
304
|
+
"web", # Web-interface
|
|
305
|
+
"tg", # Telegram
|
|
306
|
+
"vk", # VKontakte
|
|
307
|
+
"g", # Google
|
|
308
|
+
"fb", # Facebook
|
|
309
|
+
"a", # Apple
|
|
310
|
+
"in", # LinkedIn
|
|
311
|
+
"ig", # Instagram
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
STATUSES = (
|
|
315
|
+
"removed",
|
|
316
|
+
"disabled",
|
|
317
|
+
"active",
|
|
318
|
+
)
|
|
319
|
+
USER_STATUSES = (
|
|
320
|
+
"removed", # deleted # not specified # Does not exist
|
|
321
|
+
"blocked", # archive # Does not have access to resources
|
|
322
|
+
"guest", # normal
|
|
323
|
+
"authorized", # registered # confirmed # Save personal data & progress
|
|
324
|
+
"editor", # curator # View reviews, add verified posts
|
|
325
|
+
"verified", # Delete reviews, edit posts, add categories
|
|
326
|
+
"moderator", # View & block users, delete posts, edit & delete categories
|
|
327
|
+
"admin", # Change permissions
|
|
328
|
+
"owner", # Can't be blocked
|
|
329
|
+
)
|
|
330
|
+
DEFAULT_LOCALE = LOCALES.index(cfg("locale", "en"))
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def get_network(code):
|
|
334
|
+
"""Get network code by cipher"""
|
|
335
|
+
|
|
336
|
+
if code is None:
|
|
337
|
+
return 0
|
|
338
|
+
|
|
339
|
+
if code in NETWORKS:
|
|
340
|
+
return NETWORKS.index(code)
|
|
341
|
+
|
|
342
|
+
if code in range(len(LOCALES)):
|
|
343
|
+
return code
|
|
344
|
+
|
|
345
|
+
return 0
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def get_locale(code):
|
|
349
|
+
"""Get language code by cipher"""
|
|
350
|
+
|
|
351
|
+
if code is None:
|
|
352
|
+
return DEFAULT_LOCALE
|
|
353
|
+
|
|
354
|
+
if code in LOCALES:
|
|
355
|
+
return LOCALES.index(code)
|
|
356
|
+
|
|
357
|
+
if code in range(len(LOCALES)):
|
|
358
|
+
return code
|
|
359
|
+
|
|
360
|
+
return DEFAULT_LOCALE
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def get_flag(code):
|
|
364
|
+
"""Get flag by language"""
|
|
365
|
+
return FLAGS[get_locale(code)]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Development tools
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def check_public_ip(ip):
|
|
9
|
+
"""Check if the IP address is public"""
|
|
10
|
+
|
|
11
|
+
if not ip:
|
|
12
|
+
return None
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
None
|
|
16
|
+
if re.match(
|
|
17
|
+
r"^(172\.(1[6-9]\.|2[0-9]\.|3[0-1]\.)|192\.168\.|10\.|127\.)",
|
|
18
|
+
ip,
|
|
19
|
+
)
|
|
20
|
+
else ip
|
|
21
|
+
)
|