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.
Files changed (50) hide show
  1. {libdev-0.78 → libdev-0.79}/PKG-INFO +16 -15
  2. libdev-0.79/README.md +22 -0
  3. {libdev-0.78 → libdev-0.79}/libdev/__init__.py +1 -1
  4. {libdev-0.78 → libdev-0.79}/libdev/cfg.py +8 -8
  5. libdev-0.79/libdev/check.py +180 -0
  6. libdev-0.79/libdev/codes.py +365 -0
  7. libdev-0.79/libdev/dev.py +21 -0
  8. {libdev-0.78 → libdev-0.79}/libdev/doc.py +2 -2
  9. libdev-0.79/libdev/fin.py +352 -0
  10. libdev-0.79/libdev/gen.py +38 -0
  11. {libdev-0.78 → libdev-0.79}/libdev/img.py +27 -12
  12. libdev-0.79/libdev/lang.py +122 -0
  13. {libdev-0.78 → libdev-0.79}/libdev/num.py +3 -3
  14. {libdev-0.78 → libdev-0.79}/libdev/req.py +22 -1
  15. {libdev-0.78 → libdev-0.79}/libdev/s3.py +21 -5
  16. {libdev-0.78 → libdev-0.79}/libdev/time.py +69 -74
  17. {libdev-0.78 → libdev-0.79}/libdev.egg-info/PKG-INFO +16 -15
  18. {libdev-0.78 → libdev-0.79}/libdev.egg-info/requires.txt +0 -1
  19. {libdev-0.78 → libdev-0.79}/setup.py +1 -2
  20. libdev-0.79/tests/test_cfg.py +36 -0
  21. libdev-0.79/tests/test_check.py +106 -0
  22. libdev-0.79/tests/test_codes.py +30 -0
  23. libdev-0.79/tests/test_dev.py +17 -0
  24. {libdev-0.78 → libdev-0.79}/tests/test_doc.py +2 -2
  25. {libdev-0.78 → libdev-0.79}/tests/test_gen.py +2 -0
  26. libdev-0.79/tests/test_img.py +42 -0
  27. libdev-0.79/tests/test_lang.py +78 -0
  28. {libdev-0.78 → libdev-0.79}/tests/test_req.py +1 -1
  29. libdev-0.79/tests/test_s3.py +26 -0
  30. libdev-0.78/README.md +0 -20
  31. libdev-0.78/libdev/check.py +0 -96
  32. libdev-0.78/libdev/codes.py +0 -363
  33. libdev-0.78/libdev/dev.py +0 -16
  34. libdev-0.78/libdev/fin.py +0 -352
  35. libdev-0.78/libdev/gen.py +0 -42
  36. libdev-0.78/libdev/lang.py +0 -124
  37. libdev-0.78/tests/test_cfg.py +0 -33
  38. libdev-0.78/tests/test_check.py +0 -93
  39. libdev-0.78/tests/test_codes.py +0 -28
  40. libdev-0.78/tests/test_dev.py +0 -17
  41. libdev-0.78/tests/test_img.py +0 -19
  42. libdev-0.78/tests/test_lang.py +0 -60
  43. libdev-0.78/tests/test_s3.py +0 -24
  44. {libdev-0.78 → libdev-0.79}/LICENSE +0 -0
  45. {libdev-0.78 → libdev-0.79}/libdev.egg-info/SOURCES.txt +0 -0
  46. {libdev-0.78 → libdev-0.79}/libdev.egg-info/dependency_links.txt +0 -0
  47. {libdev-0.78 → libdev-0.79}/libdev.egg-info/top_level.txt +0 -0
  48. {libdev-0.78 → libdev-0.79}/setup.cfg +0 -0
  49. {libdev-0.78 → libdev-0.79}/tests/test_num.py +0 -0
  50. {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.78
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.num ` | Numeric conversions & handlers
38
- ` libdev.time ` | Time processing
39
- ` libdev.lang ` | Natural language formatters
40
- ` libdev.gen ` | Code & token generators
41
- ` libdev.codes ` | Ciphers: langs & flags / networks / user statuses
42
- ` libdev.dev ` | Development tools
43
- ` libdev.fin ` | Financial codes and tools
44
- ` libdev.check ` | Checking functions
45
- ` libdev.doc ` | Documents handlers
46
- ` libdev.s3 ` | S3 file server functions
33
+ Stream | Submodule | Description
34
+ ---|---|---
35
+ System | ` libdev.cfg ` | Configuration getting
36
+ &nbsp; | ` libdev.req ` | AsyncIO requests (AIOHTTP wrapper)
37
+ Data Format | ` libdev.num ` | Numeric conversions & handlers
38
+ &nbsp; | ` libdev.time ` | Time processing
39
+ Transforms | ` libdev.gen ` | Code & token generators
40
+ &nbsp; | ` libdev.codes ` | Ciphers: langs & flags / networks / user statuses
41
+ &nbsp; | ` libdev.check ` | Validation functions
42
+ Fields | ` libdev.dev ` | Development tools
43
+ &nbsp; | ` libdev.fin ` | Financial codes and tools
44
+ &nbsp; | ` libdev.lang ` | Natural language formatters
45
+ Files | ` libdev.doc ` | Documents handlers
46
+ &nbsp; | ` libdev.s3 ` | S3 file server functions
47
+ &nbsp; | ` 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
+ &nbsp; | ` libdev.req ` | AsyncIO requests (AIOHTTP wrapper)
12
+ Data Format | ` libdev.num ` | Numeric conversions & handlers
13
+ &nbsp; | ` libdev.time ` | Time processing
14
+ Transforms | ` libdev.gen ` | Code & token generators
15
+ &nbsp; | ` libdev.codes ` | Ciphers: langs & flags / networks / user statuses
16
+ &nbsp; | ` libdev.check ` | Validation functions
17
+ Fields | ` libdev.dev ` | Development tools
18
+ &nbsp; | ` libdev.fin ` | Financial codes and tools
19
+ &nbsp; | ` libdev.lang ` | Natural language formatters
20
+ Files | ` libdev.doc ` | Documents handlers
21
+ &nbsp; | ` libdev.s3 ` | S3 file server functions
22
+ &nbsp; | ` libdev.img ` | Image processing
@@ -2,6 +2,6 @@
2
2
  Initializing the Python package
3
3
  """
4
4
 
5
- __version__ = "0.78"
5
+ __version__ = "0.79"
6
6
 
7
7
  __all__ = ("__version__",)
@@ -8,20 +8,20 @@ import json
8
8
  from dotenv import load_dotenv
9
9
 
10
10
 
11
- if os.path.isfile('sets.json'):
12
- with open('sets.json', 'r', encoding='utf-8') as file:
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('.env'):
17
+ if os.path.isfile(".env"):
18
18
  load_dotenv()
19
19
 
20
20
 
21
21
  def cfg(name, default=None):
22
- """ Get config value by key """
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('.', '_').upper()
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
- """ Set config value """
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
+ )