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.
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/PKG-INFO +1 -1
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/pyproject.toml +1 -1
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/_module_info.py +1 -1
- mainshortcuts2-2.3.0/src/MainShortcuts2/api/base.py +35 -0
- mainshortcuts2-2.3.0/src/MainShortcuts2/api/gigachat.py +65 -0
- mainshortcuts2-2.3.0/src/MainShortcuts2/api/russian_trusted_root_ca_pem.crt +33 -0
- mainshortcuts2-2.3.0/src/MainShortcuts2/api/russian_trusted_sub_ca_pem.crt +41 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/dir.py +11 -5
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/path.py +3 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/term.py +6 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/utils.py +27 -4
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/README.md +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/__init__.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/__main__.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/advanced.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/cfg.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/core.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/dict.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/file.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/json.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/list.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/proc.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/regex.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/special_chars.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/str.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/types.py +0 -0
- {mainshortcuts2-2.2.3 → mainshortcuts2-2.3.0}/src/MainShortcuts2/win.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
name = "MainShortcuts2"
|
|
2
|
-
version = "2.
|
|
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
|
-
|
|
54
|
+
path = _check(path)
|
|
55
|
+
r = []
|
|
56
56
|
kw["func"] = func
|
|
57
57
|
kw["links"] = links
|
|
58
58
|
kw["type"] = type
|
|
59
|
-
|
|
60
|
-
|
|
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
|
|
@@ -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.
|
|
377
|
+
if os.path.exists(self.lock.path):
|
|
377
378
|
os.unlink(self.lock.path)
|
|
378
|
-
self.fd = os.open(self.
|
|
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
|
-
|
|
402
|
-
if self.lock.
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|