MainShortcuts2 2.2.3__tar.gz → 2.3.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.
Files changed (27) hide show
  1. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/PKG-INFO +1 -1
  2. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/pyproject.toml +1 -1
  3. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/_module_info.py +1 -1
  4. mainshortcuts2-2.3.0/src/MainShortcuts2/api/base.py +35 -0
  5. mainshortcuts2-2.3.0/src/MainShortcuts2/api/gigachat.py +65 -0
  6. mainshortcuts2-2.3.0/src/MainShortcuts2/api/russian_trusted_root_ca_pem.crt +33 -0
  7. mainshortcuts2-2.3.0/src/MainShortcuts2/api/russian_trusted_sub_ca_pem.crt +41 -0
  8. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/dir.py +11 -5
  9. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/path.py +3 -0
  10. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/term.py +6 -0
  11. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/utils.py +27 -4
  12. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/README.md +0 -0
  13. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/__init__.py +0 -0
  14. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/__main__.py +0 -0
  15. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/advanced.py +0 -0
  16. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/cfg.py +0 -0
  17. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/core.py +0 -0
  18. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/dict.py +0 -0
  19. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/file.py +0 -0
  20. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/json.py +0 -0
  21. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/list.py +0 -0
  22. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/proc.py +0 -0
  23. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/regex.py +0 -0
  24. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/special_chars.py +0 -0
  25. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/str.py +0 -0
  26. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/types.py +0 -0
  27. {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/win.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: MainShortcuts2
3
- Version: 2.2.3
3
+ Version: 2.3.0
4
4
  Summary: Сокращение и улучшение функций
5
5
  Home-page: https://github.com/MainPlay-TG/MainShortcuts2.py
6
6
  Author: MainPlay TG
@@ -1,5 +1,5 @@
1
1
  [tool.poetry]
2
- version = "2.2.3"
2
+ version = "2.3.0"
3
3
  name = "MainShortcuts2"
4
4
  description = "Сокращение и улучшение функций"
5
5
  authors = [ "MainPlay TG <xbox.roman6666666666@gmail.com>",]
@@ -1,2 +1,2 @@
1
1
  name = "MainShortcuts2"
2
- version = "2.2.3"
2
+ version = "2.3.0"
@@ -0,0 +1,35 @@
1
+ import requests
2
+
3
+
4
+ class Base:
5
+ def __init__(self, session: requests.Session = None):
6
+ self._headers = {}
7
+ self._http = requests.Session() if session is None else session
8
+ self._params = {}
9
+ self._url_data = {}
10
+ self._url = "https://example.com/api/{method}"
11
+
12
+ @property
13
+ def http(self) -> requests.Session:
14
+ return self._http
15
+
16
+ def _request(self, http_method: str, api_method: str, *, headers: dict[str, str] = None, params: dict[str, str] = None, raise_for_status: bool = True, url_data: dict[str, str] = None, **kw):
17
+ _headers = self._headers.copy()
18
+ _params = self._params.copy()
19
+ _url_data = self._url_data.copy()
20
+ _url_data["method"] = api_method
21
+ _headers.update({} if headers is None else headers)
22
+ _params.update({} if params is None else params)
23
+ _url_data.update({} if url_data is None else url_data)
24
+ kw["headers"] = _headers
25
+ kw["method"] = http_method
26
+ kw["params"] = _params
27
+ kw["url"] = self._url.format(**_url_data)
28
+ result = self.http.request(**kw)
29
+ if raise_for_status:
30
+ result.raise_for_status()
31
+ return result
32
+
33
+ def request(self, *args, **kwargs) -> requests.Response:
34
+ """Отправить запрос к API"""
35
+ return self._request(*args, **kwargs)
@@ -0,0 +1,65 @@
1
+ import os
2
+ from .base import Base, requests
3
+ from datetime import timedelta
4
+ from time import time
5
+ CERT_PATH = os.path.dirname(__file__) + "/russian_trusted_root_ca_pem.crt"
6
+
7
+
8
+ class GigaChat(Base):
9
+ def __init__(self, auth_data: str, client_id: str, *,
10
+ cert_path: str = None,
11
+ **kw):
12
+ Base.__init__(self, **kw)
13
+ self._access_token = {"expire_at": 0, "kw": None, "token": None}
14
+ self._auth_data: str = auth_data
15
+ self._client_id: str = client_id
16
+ self._url = "https://gigachat.devices.sberbank.ru/api/v1/{method}"
17
+ self.http.verify = CERT_PATH if cert_path is None else cert_path
18
+
19
+ @property
20
+ def access_token(self) -> str:
21
+ if True: # TODO Сделать проверку истёк ли токен доступа. Пока что каждый раз новый токен
22
+ if self._access_token["kw"] is None: # Если изменились данные для авторизации
23
+ kw = {}
24
+ kw["data"] = {}
25
+ kw["headers"] = {}
26
+ kw["stream"] = False
27
+ kw["url"] = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth"
28
+ kw["data"]["scope"] = "GIGACHAT_API_PERS"
29
+ kw["headers"]["Authorization"] = "Basic: " + self.auth_data
30
+ kw["headers"]["Content-Type"] = "application/x-www-form-urlencoded"
31
+ kw["headers"]["RqUID"] = self.client_id
32
+ self._access_token["kw"] = kw
33
+ else:
34
+ kw = self._access_token["kw"]
35
+ with self.http.post(**kw) as resp: # Получить новый токен
36
+ resp.raise_for_status()
37
+ json = resp.json()
38
+ self._access_token["expire_at"] = json["expires_at"] / 1000
39
+ self._access_token["token"] = json["access_token"]
40
+ return self._access_token["token"]
41
+
42
+ @property
43
+ def auth_data(self) -> str:
44
+ return self._auth_data
45
+
46
+ @auth_data.setter
47
+ def auth_data(self, v: str):
48
+ self._access_token["kw"] = None
49
+ self._auth_data = v
50
+
51
+ @property
52
+ def client_id(self) -> str:
53
+ return self._client_id
54
+
55
+ @client_id.setter
56
+ def client_id(self, v: str):
57
+ self._access_token["kw"] = None
58
+ self._client_id = v
59
+
60
+ def request(self, http_method: str, api_method: str, **kw):
61
+ self._headers["Authorization"] = "Bearer " + self.access_token
62
+ kw["api_method"] = api_method
63
+ kw["http_method"] = http_method
64
+ return self._request(**kw).json()
65
+ # TODO Добавить методы
@@ -0,0 +1,33 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFwjCCA6qgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwcDELMAkGA1UEBhMCUlUx
3
+ PzA9BgNVBAoMNlRoZSBNaW5pc3RyeSBvZiBEaWdpdGFsIERldmVsb3BtZW50IGFu
4
+ ZCBDb21tdW5pY2F0aW9uczEgMB4GA1UEAwwXUnVzc2lhbiBUcnVzdGVkIFJvb3Qg
5
+ Q0EwHhcNMjIwMzAxMjEwNDE1WhcNMzIwMjI3MjEwNDE1WjBwMQswCQYDVQQGEwJS
6
+ VTE/MD0GA1UECgw2VGhlIE1pbmlzdHJ5IG9mIERpZ2l0YWwgRGV2ZWxvcG1lbnQg
7
+ YW5kIENvbW11bmljYXRpb25zMSAwHgYDVQQDDBdSdXNzaWFuIFRydXN0ZWQgUm9v
8
+ dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMfFOZ8pUAL3+r2n
9
+ qqE0Zp52selXsKGFYoG0GM5bwz1bSFtCt+AZQMhkWQheI3poZAToYJu69pHLKS6Q
10
+ XBiwBC1cvzYmUYKMYZC7jE5YhEU2bSL0mX7NaMxMDmH2/NwuOVRj8OImVa5s1F4U
11
+ zn4Kv3PFlDBjjSjXKVY9kmjUBsXQrIHeaqmUIsPIlNWUnimXS0I0abExqkbdrXbX
12
+ YwCOXhOO2pDUx3ckmJlCMUGacUTnylyQW2VsJIyIGA8V0xzdaeUXg0VZ6ZmNUr5Y
13
+ Ber/EAOLPb8NYpsAhJe2mXjMB/J9HNsoFMBFJ0lLOT/+dQvjbdRZoOT8eqJpWnVD
14
+ U+QL/qEZnz57N88OWM3rabJkRNdU/Z7x5SFIM9FrqtN8xewsiBWBI0K6XFuOBOTD
15
+ 4V08o4TzJ8+Ccq5XlCUW2L48pZNCYuBDfBh7FxkB7qDgGDiaftEkZZfApRg2E+M9
16
+ G8wkNKTPLDc4wH0FDTijhgxR3Y4PiS1HL2Zhw7bD3CbslmEGgfnnZojNkJtcLeBH
17
+ BLa52/dSwNU4WWLubaYSiAmA9IUMX1/RpfpxOxd4Ykmhz97oFbUaDJFipIggx5sX
18
+ ePAlkTdWnv+RWBxlJwMQ25oEHmRguNYf4Zr/Rxr9cS93Y+mdXIZaBEE0KS2iLRqa
19
+ OiWBki9IMQU4phqPOBAaG7A+eP8PAgMBAAGjZjBkMB0GA1UdDgQWBBTh0YHlzlpf
20
+ BKrS6badZrHF+qwshzAfBgNVHSMEGDAWgBTh0YHlzlpfBKrS6badZrHF+qwshzAS
21
+ BgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
22
+ AAOCAgEAALIY1wkilt/urfEVM5vKzr6utOeDWCUczmWX/RX4ljpRdgF+5fAIS4vH
23
+ tmXkqpSCOVeWUrJV9QvZn6L227ZwuE15cWi8DCDal3Ue90WgAJJZMfTshN4OI8cq
24
+ W9E4EG9wglbEtMnObHlms8F3CHmrw3k6KmUkWGoa+/ENmcVl68u/cMRl1JbW2bM+
25
+ /3A+SAg2c6iPDlehczKx2oa95QW0SkPPWGuNA/CE8CpyANIhu9XFrj3RQ3EqeRcS
26
+ AQQod1RNuHpfETLU/A2gMmvn/w/sx7TB3W5BPs6rprOA37tutPq9u6FTZOcG1Oqj
27
+ C/B7yTqgI7rbyvox7DEXoX7rIiEqyNNUguTk/u3SZ4VXE2kmxdmSh3TQvybfbnXV
28
+ 4JbCZVaqiZraqc7oZMnRoWrXRG3ztbnbes/9qhRGI7PqXqeKJBztxRTEVj8ONs1d
29
+ WN5szTwaPIvhkhO3CO5ErU2rVdUr89wKpNXbBODFKRtgxUT70YpmJ46VVaqdAhOZ
30
+ D9EUUn4YaeLaS8AjSF/h7UkjOibNc4qVDiPP+rkehFWM66PVnP1Msh93tc+taIfC
31
+ EYVMxjh8zNbFuoc7fzvvrFILLe7ifvEIUqSVIC/AzplM/Jxw7buXFeGP1qVCBEHq
32
+ 391d/9RAfaZ12zkwFsl+IKwE/OZxW8AHa9i1p4GO0YSNuczzEm4=
33
+ -----END CERTIFICATE-----
@@ -0,0 +1,41 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIHQjCCBSqgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwcDELMAkGA1UEBhMCUlUx
3
+ PzA9BgNVBAoMNlRoZSBNaW5pc3RyeSBvZiBEaWdpdGFsIERldmVsb3BtZW50IGFu
4
+ ZCBDb21tdW5pY2F0aW9uczEgMB4GA1UEAwwXUnVzc2lhbiBUcnVzdGVkIFJvb3Qg
5
+ Q0EwHhcNMjIwMzAyMTEyNTE5WhcNMjcwMzA2MTEyNTE5WjBvMQswCQYDVQQGEwJS
6
+ VTE/MD0GA1UECgw2VGhlIE1pbmlzdHJ5IG9mIERpZ2l0YWwgRGV2ZWxvcG1lbnQg
7
+ YW5kIENvbW11bmljYXRpb25zMR8wHQYDVQQDDBZSdXNzaWFuIFRydXN0ZWQgU3Vi
8
+ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9YPqBKOk19NFymrE
9
+ wehzrhBEgT2atLezpduB24mQ7CiOa/HVpFCDRZzdxqlh8drku408/tTmWzlNH/br
10
+ HuQhZ/miWKOf35lpKzjyBd6TPM23uAfJvEOQ2/dnKGGJbsUo1/udKSvxQwVHpVv3
11
+ S80OlluKfhWPDEXQpgyFqIzPoxIQTLZ0deirZwMVHarZ5u8HqHetRuAtmO2ZDGQn
12
+ vVOJYAjls+Hiueq7Lj7Oce7CQsTwVZeP+XQx28PAaEZ3y6sQEt6rL06ddpSdoTMp
13
+ BnCqTbxW+eWMyjkIn6t9GBtUV45yB1EkHNnj2Ex4GwCiN9T84QQjKSr+8f0psGrZ
14
+ vPbCbQAwNFJjisLixnjlGPLKa5vOmNwIh/LAyUW5DjpkCx004LPDuqPpFsKXNKpa
15
+ L2Dm6uc0x4Jo5m+gUTVORB6hOSzWnWDj2GWfomLzzyjG81DRGFBpco/O93zecsIN
16
+ 3SL2Ysjpq1zdoS01CMYxie//9zWvYwzI25/OZigtnpCIrcd2j1Y6dMUFQAzAtHE+
17
+ qsXflSL8HIS+IJEFIQobLlYhHkoE3avgNx5jlu+OLYe0dF0Ykx1PGNjbwqvTX37R
18
+ Cn32NMjlotW2QcGEZhDKj+3urZizp5xdTPZitA+aEjZM/Ni71VOdiOP0igbw6asZ
19
+ 2fxdozZ1TnSSYNYvNATwthNmZysCAwEAAaOCAeUwggHhMBIGA1UdEwEB/wQIMAYB
20
+ Af8CAQAwDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTR4XENCy2BTm6KSo9MI7NM
21
+ XqtpCzAfBgNVHSMEGDAWgBTh0YHlzlpfBKrS6badZrHF+qwshzCBxwYIKwYBBQUH
22
+ AQEEgbowgbcwOwYIKwYBBQUHMAKGL2h0dHA6Ly9yb3N0ZWxlY29tLnJ1L2NkcC9y
23
+ b290Y2Ffc3NsX3JzYTIwMjIuY3J0MDsGCCsGAQUFBzAChi9odHRwOi8vY29tcGFu
24
+ eS5ydC5ydS9jZHAvcm9vdGNhX3NzbF9yc2EyMDIyLmNydDA7BggrBgEFBQcwAoYv
25
+ aHR0cDovL3JlZXN0ci1wa2kucnUvY2RwL3Jvb3RjYV9zc2xfcnNhMjAyMi5jcnQw
26
+ gbAGA1UdHwSBqDCBpTA1oDOgMYYvaHR0cDovL3Jvc3RlbGVjb20ucnUvY2RwL3Jv
27
+ b3RjYV9zc2xfcnNhMjAyMi5jcmwwNaAzoDGGL2h0dHA6Ly9jb21wYW55LnJ0LnJ1
28
+ L2NkcC9yb290Y2Ffc3NsX3JzYTIwMjIuY3JsMDWgM6Axhi9odHRwOi8vcmVlc3Ry
29
+ LXBraS5ydS9jZHAvcm9vdGNhX3NzbF9yc2EyMDIyLmNybDANBgkqhkiG9w0BAQsF
30
+ AAOCAgEARBVzZls79AdiSCpar15dA5Hr/rrT4WbrOfzlpI+xrLeRPrUG6eUWIW4v
31
+ Sui1yx3iqGLCjPcKb+HOTwoRMbI6ytP/ndp3TlYua2advYBEhSvjs+4vDZNwXr/D
32
+ anbwIWdurZmViQRBDFebpkvnIvru/RpWud/5r624Wp8voZMRtj/cm6aI9LtvBfT9
33
+ cfzhOaexI/99c14dyiuk1+6QhdwKaCRTc1mdfNQmnfWNRbfWhWBlK3h4GGE9JK33
34
+ Gk8ZS8DMrkdAh0xby4xAQ/mSWAfWrBmfzlOqGyoB1U47WTOeqNbWkkoAP2ys94+s
35
+ Jg4NTkiDVtXRF6nr6fYi0bSOvOFg0IQrMXO2Y8gyg9ARdPJwKtvWX8VPADCYMiWH
36
+ h4n8bZokIrImVKLDQKHY4jCsND2HHdJfnrdL2YJw1qFskNO4cSNmZydw0Wkgjv9k
37
+ F+KxqrDKlB8MZu2Hclph6v/CZ0fQ9YuE8/lsHZ0Qc2HyiSMnvjgK5fDc3TD4fa8F
38
+ E8gMNurM+kV8PT8LNIM+4Zs+LKEV8nqRWBaxkIVJGekkVKO8xDBOG/aN62AZKHOe
39
+ GcyIdu7yNMMRihGVZCYr8rYiJoKiOzDqOkPkLOPdhtVlgnhowzHDxMHND/E2WA5p
40
+ ZHuNM/m0TXt2wTTPL7JH2YC0gPz/BvvSzjksgzU5rLbRyUKQkgU=
41
+ -----END CERTIFICATE-----
@@ -34,7 +34,7 @@ def create(path: PATH_TYPES, force: bool = False, **kw):
34
34
 
35
35
  def _list_filter(path: Path, *, exts: Iterable[str], func: Callable[[Path], bool], links: bool, type: str):
36
36
  if not exts is None:
37
- if not path.ext in exts:
37
+ if not path.ext.lower() in exts:
38
38
  return False
39
39
  if not func is None:
40
40
  if not func(path):
@@ -50,14 +50,20 @@ def _list_filter(path: Path, *, exts: Iterable[str], func: Callable[[Path], bool
50
50
 
51
51
  def list(path: PATH_TYPES = ".", *, exts: Iterable[str] = None, func: Callable[[Path], bool] = None, links: bool = None, type: str = None) -> list[Path]:
52
52
  """Список содержимого папки"""
53
- r = []
54
53
  kw = {}
55
- kw["exts"] = None if exts is None else builtins.list(exts)
54
+ path = _check(path)
55
+ r = []
56
56
  kw["func"] = func
57
57
  kw["links"] = links
58
58
  kw["type"] = type
59
- for i in os.listdir(_check(path)):
60
- i = Path(_check(path) + "/" + i)
59
+ if exts is None:
60
+ kw["exts"] = None
61
+ else:
62
+ kw["exts"] = []
63
+ for i in exts:
64
+ kw["exts"].append((i if i.startswith(".") else "." + i).lower())
65
+ for i in os.listdir(path):
66
+ i = Path(path + "/" + i)
61
67
  if _list_filter(i, **kw):
62
68
  r.append(i)
63
69
  return r
@@ -55,6 +55,9 @@ class Path:
55
55
  self.rn = self.rename
56
56
  self.use_cache = use_cache
57
57
 
58
+ def __fspath__(self) -> str:
59
+ return self.path
60
+
58
61
  def reload(self, full: bool = False):
59
62
  """Удаление кешированной информации"""
60
63
  if full:
@@ -115,4 +115,10 @@ def clear():
115
115
  _clear()
116
116
 
117
117
 
118
+ def set_title(title: str):
119
+ """Установить заголовок окна"""
120
+ # Не работает на bpython: AssertionError
121
+ print("\u001b]2;" + title + "\u0007", end="")
122
+
123
+
118
124
  cls = clear
@@ -365,6 +365,7 @@ class OnlyOneInstance:
365
365
  def __init__(self, name: str = "main", lock_path: str = None):
366
366
  import tempfile
367
367
  self.name: str = name
368
+ self.running = False
368
369
  if lock_path is None:
369
370
  lock_path = tempfile.gettempdir() + "/" + ms.MAIN_FILE.replace(":", "").replace("/", "_") + "." + name + ".lock"
370
371
  self.lock = ms.path.Path(lock_path, use_cache=False)
@@ -373,9 +374,9 @@ class OnlyOneInstance:
373
374
 
374
375
  def _enter():
375
376
  try:
376
- if self.lock.exists:
377
+ if os.path.exists(self.lock.path):
377
378
  os.unlink(self.lock.path)
378
- self.fd = os.open(self.lockfile, flags)
379
+ self.fd = os.open(self.lock.path, flags)
379
380
  except OSError as err:
380
381
  if err.errno == 13:
381
382
  raise OnlyOneInstanceError()
@@ -398,8 +399,8 @@ class OnlyOneInstance:
398
399
 
399
400
  def _exit():
400
401
  fcntl.lockf(self.fp, fcntl.LOCK_UN)
401
- os.close(self.fp)
402
- if self.lock.exists:
402
+ self.fp.close()
403
+ if os.path.exists(self.lock.path):
403
404
  os.unlink(self.lock.path)
404
405
  self._enter = _enter
405
406
  self._exit = _exit
@@ -429,5 +430,27 @@ class OnlyOneInstance:
429
430
  pass
430
431
 
431
432
 
433
+ def multi_and(*values: bool) -> bool:
434
+ for i in values:
435
+ if not i:
436
+ return False
437
+ return True
438
+
439
+
440
+ def multi_or(*values: bool) -> bool:
441
+ for i in values:
442
+ if i:
443
+ return True
444
+ return False
445
+
446
+
447
+ def is_int(value: float) -> bool:
448
+ return value == int(value)
449
+
450
+
451
+ def get_self_module(__name__: str):
452
+ return sys.modules[__name__]
453
+
454
+
432
455
  download_file = sync_download_file
433
456
  request = sync_request
File without changes