nsarchive 3.0.0a1__py3-none-any.whl → 3.0.0a3__py3-none-any.whl
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.
- nsarchive/__init__.py +2 -5
- nsarchive/cls/base.py +131 -81
- nsarchive/cls/entities.py +175 -112
- nsarchive/instances/_economy.py +51 -8
- nsarchive/instances/_entities.py +60 -166
- nsarchive/instances/_republic.py +33 -7
- {nsarchive-3.0.0a1.dist-info → nsarchive-3.0.0a3.dist-info}/METADATA +1 -2
- nsarchive-3.0.0a3.dist-info/RECORD +15 -0
- nsarchive/cls/exceptions.py +0 -25
- nsarchive-3.0.0a1.dist-info/RECORD +0 -16
- {nsarchive-3.0.0a1.dist-info → nsarchive-3.0.0a3.dist-info}/LICENSE +0 -0
- {nsarchive-3.0.0a1.dist-info → nsarchive-3.0.0a3.dist-info}/WHEEL +0 -0
nsarchive/__init__.py
CHANGED
@@ -1,27 +1,24 @@
|
|
1
1
|
"""
|
2
2
|
nsarchive - API-wrapper pour récupérer des données liées à Nation.
|
3
3
|
|
4
|
-
Version:
|
4
|
+
Version: 3.0.0a3
|
5
5
|
License: GPL-3.0
|
6
6
|
Auteur : happex <110610727+okayhappex@users.noreply.github.com>
|
7
7
|
|
8
8
|
Dependencies:
|
9
9
|
- Python ^3.10
|
10
|
-
- supabase ^2.9.1
|
11
10
|
- pillow ^10.4
|
12
11
|
|
13
12
|
Le fichier README.md fournit des détails supplémentaires pour l'utilisation.
|
14
13
|
"""
|
15
14
|
|
16
|
-
# Import des types
|
15
|
+
# Import des types
|
17
16
|
from .cls.base import NSID
|
18
17
|
from .cls.archives import *
|
19
18
|
from .cls.entities import *
|
20
19
|
from .cls.republic import *
|
21
20
|
from .cls.economy import *
|
22
21
|
|
23
|
-
from .cls.exceptions import *
|
24
|
-
|
25
22
|
# Import des instances
|
26
23
|
from .instances._economy import EconomyInstance
|
27
24
|
from .instances._entities import EntityInstance
|
nsarchive/cls/base.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
import io
|
1
2
|
import json
|
3
|
+
import requests
|
2
4
|
import typing
|
3
|
-
|
4
|
-
from supabase import Client
|
5
|
+
import warnings
|
5
6
|
|
6
7
|
class NSID(str):
|
7
8
|
"""
|
@@ -43,134 +44,175 @@ class Instance:
|
|
43
44
|
"""
|
44
45
|
Instance qui servira de base à toutes les instances.
|
45
46
|
"""
|
46
|
-
def __init__(self, client: Client):
|
47
|
-
self.db = client
|
48
47
|
|
49
|
-
def
|
48
|
+
def __init__(self, url: str, token: str = None):
|
49
|
+
self.url = url
|
50
|
+
self.token = token
|
51
|
+
|
52
|
+
self.default_headers = {
|
53
|
+
"Authorization": f"Bearer {self.token}",
|
54
|
+
"Content-Type": "application/json",
|
55
|
+
}
|
56
|
+
|
57
|
+
def request_token(self, username: str, password: str) -> str | None:
|
58
|
+
res = requests.post(f"{self.url}/auth/login", json = {
|
59
|
+
"username": username,
|
60
|
+
"password": password
|
61
|
+
})
|
62
|
+
|
63
|
+
if res.status_code == 200:
|
64
|
+
return res.json()["token"]
|
65
|
+
elif res.status_code in (401, 403):
|
66
|
+
raise PermissionError(res.json()['message'])
|
67
|
+
else:
|
68
|
+
raise Exception(f"Error {res.status_code}: {res.json()['message']}")
|
69
|
+
|
70
|
+
def _get_item(self, endpoint: str, body: dict = None, headers: dict = None) -> dict:
|
50
71
|
"""
|
51
|
-
Récupère des données JSON
|
72
|
+
Récupère des données JSON depuis l'API
|
52
73
|
|
53
74
|
## Paramètres
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
75
|
+
endpoint: `str`:
|
76
|
+
Endpoint de l'URL
|
77
|
+
headers: `dict` (optional)
|
78
|
+
Headers à envoyer
|
79
|
+
body: `dict` (optional)
|
80
|
+
Données à envoyer
|
60
81
|
|
61
82
|
## Renvoie
|
62
83
|
- `list` de tous les élements correspondants
|
63
84
|
- `None` si aucune donnée n'est trouvée
|
64
85
|
"""
|
65
86
|
|
66
|
-
if
|
67
|
-
|
68
|
-
else:
|
69
|
-
res = self.db.from_(table).select("*").execute()
|
87
|
+
if not headers:
|
88
|
+
headers = self.default_headers
|
70
89
|
|
71
|
-
|
72
|
-
return res.data
|
73
|
-
else:
|
74
|
-
return None
|
90
|
+
res = requests.get(f"{self.url}/{endpoint}", headers = headers, json = body, timeout = 5)
|
75
91
|
|
76
|
-
|
77
|
-
|
92
|
+
if 200 <= res.status_code < 300:
|
93
|
+
return res.json()
|
94
|
+
elif res.status_code == 404:
|
95
|
+
return
|
96
|
+
elif res.status_code in (403, 401):
|
97
|
+
raise PermissionError(res.json()['message'])
|
98
|
+
else:
|
99
|
+
raise Exception(f"Error {res.status_code}: {res.json()['message']}")
|
78
100
|
|
79
|
-
|
80
|
-
|
101
|
+
def _get_by_ID(self, _class: str, id: NSID) -> dict:
|
102
|
+
_data = self._get_item(f"/model/{_class}/{id}")
|
81
103
|
|
82
104
|
return _data
|
83
105
|
|
84
|
-
def _put_in_db(self,
|
106
|
+
def _put_in_db(self, endpoint: str, body: dict, headers: dict = None, use_PUT: bool = False) -> None:
|
85
107
|
"""
|
86
|
-
Publie des données JSON dans une table
|
108
|
+
Publie des données JSON dans une table nation-db.
|
87
109
|
|
88
|
-
|
89
|
-
:
|
90
|
-
|
110
|
+
## Paramètres
|
111
|
+
endpoint: `str`
|
112
|
+
Endpoint de l'URL
|
113
|
+
body: `dict`
|
114
|
+
Données à envoyer
|
115
|
+
headers: `dict` (optionnel)
|
116
|
+
Headers à envoyer
|
91
117
|
"""
|
92
118
|
|
93
|
-
|
119
|
+
if not headers:
|
120
|
+
headers = headers
|
121
|
+
|
122
|
+
if use_PUT:
|
123
|
+
res = requests.put(f"{self.url}/{endpoint}", headers = headers, json = body)
|
124
|
+
else:
|
125
|
+
res = requests.post(f"{self.url}/{endpoint}", headers = headers, json = body)
|
94
126
|
|
95
|
-
|
127
|
+
if 200 <= res.status_code < 300:
|
128
|
+
return res.json()
|
129
|
+
else:
|
130
|
+
print(res.text)
|
131
|
+
res.raise_for_status()
|
96
132
|
|
97
|
-
def
|
133
|
+
def _delete(self, _class: str, ids: list[NSID]) -> None:
|
98
134
|
"""
|
99
|
-
Supprime
|
135
|
+
Supprime des données JSON dans une table nation-db.
|
100
136
|
|
101
137
|
## Paramètres
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
value: `str`
|
107
|
-
Valeur de la clé à vérifier pour trouver l'enregistrement à supprimer
|
108
|
-
|
109
|
-
## Renvoie
|
110
|
-
- `True` si la suppression a réussi
|
111
|
-
- `False` si aucune donnée n'a été trouvée ou si la suppression a échoué
|
138
|
+
_class: `str`
|
139
|
+
Classe des entités à supprimer
|
140
|
+
ids: `list[NSID]`
|
141
|
+
ID des entités à supprimer
|
112
142
|
"""
|
113
143
|
|
114
|
-
res =
|
144
|
+
res = requests.post(f"{self.url}/delete_{_class}", json = { "ids": ids })
|
115
145
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
def fetch(self, table: str, **query: typing.Any) -> list:
|
124
|
-
matches = []
|
125
|
-
|
126
|
-
for key, value in query.items():
|
127
|
-
entity = self._select_from_db(table, key, value)
|
146
|
+
if 200 <= res.status_code < 300:
|
147
|
+
return res.json()
|
148
|
+
elif res.status_code in (403, 401):
|
149
|
+
raise PermissionError(res.json()['message'])
|
150
|
+
else:
|
151
|
+
raise Exception(f"Error {res.status_code}: {res.json()['message']}")
|
128
152
|
|
129
|
-
|
130
|
-
|
153
|
+
def _delete_by_ID(self, _class: str, id: NSID):
|
154
|
+
warnings.showwarning("Method '_delete_by_id' is deprecated. Use '_delete' instead.")
|
155
|
+
self._delete(_class, id)
|
131
156
|
|
132
|
-
|
133
|
-
|
157
|
+
def fetch(self, _class: str, **query: typing.Any) -> list:
|
158
|
+
res = requests.get(f"{self.url}/fetch/{_class}", params = query)
|
134
159
|
|
135
|
-
if
|
136
|
-
|
160
|
+
if res.status_code == 200:
|
161
|
+
matches = res.json()
|
162
|
+
elif res.status_code in (401, 403):
|
163
|
+
matches = []
|
164
|
+
else:
|
165
|
+
res.raise_for_status()
|
137
166
|
|
138
|
-
|
167
|
+
return matches
|
139
168
|
|
140
|
-
return _res
|
141
169
|
|
142
|
-
def
|
170
|
+
def _upload_file(self, bucket: str, name: str, data: bytes, overwrite: bool = False, headers: dict = None) -> dict:
|
143
171
|
"""
|
144
|
-
Envoie un fichier dans un bucket
|
172
|
+
Envoie un fichier dans un bucket nation-db.
|
145
173
|
|
146
174
|
## Paramètres
|
147
|
-
bucket: `str
|
175
|
+
bucket: `str`
|
148
176
|
Nom du bucket où le fichier sera stocké
|
149
|
-
|
177
|
+
name: `str`
|
178
|
+
Nom du fichier dans le drive
|
179
|
+
data: `bytes`
|
150
180
|
Données à uploader
|
151
|
-
|
152
|
-
|
181
|
+
overwrite: `bool` (optional)
|
182
|
+
Overwrite ou non
|
183
|
+
headers: `dict` (optional)
|
184
|
+
Headers à envoyer
|
153
185
|
|
154
186
|
## Renvoie
|
155
187
|
- `dict` contenant les informations de l'upload si réussi
|
156
188
|
- `None` en cas d'échec
|
157
189
|
"""
|
158
190
|
|
159
|
-
|
191
|
+
if not headers:
|
192
|
+
headers = self.default_headers
|
193
|
+
headers['Content-Type'] = 'image/png'
|
160
194
|
|
161
|
-
|
162
|
-
|
195
|
+
body = {
|
196
|
+
"name": name,
|
197
|
+
"overwrite": json.dumps(overwrite)
|
198
|
+
}
|
163
199
|
|
164
|
-
|
200
|
+
file = ("file", "image/png", data)
|
165
201
|
|
166
|
-
|
167
|
-
print("Erreur lors de l'upload:", res["error"])
|
202
|
+
res = requests.put(f"{self.url}/upload_file/{bucket}", headers = headers, json = body, files = [ file ])
|
168
203
|
|
169
|
-
|
204
|
+
if res.status_code == 200:
|
205
|
+
return res.json()
|
206
|
+
elif res.status_code in (403, 401):
|
207
|
+
raise PermissionError(res.json()['message'])
|
208
|
+
elif res.status_code == 409:
|
209
|
+
raise FileExistsError(res.json()['message'])
|
210
|
+
else:
|
211
|
+
raise Exception(f"Error {res.status_code}: {res.json()['message']}")
|
170
212
|
|
171
|
-
def _download_from_storage(self, bucket: str, path: str) -> bytes:
|
213
|
+
def _download_from_storage(self, bucket: str, path: str, headers: dict = None) -> bytes:
|
172
214
|
"""
|
173
|
-
Télécharge un fichier depuis le stockage
|
215
|
+
Télécharge un fichier depuis le stockage nation-db.
|
174
216
|
|
175
217
|
## Paramètres
|
176
218
|
bucket: `str`\n
|
@@ -182,6 +224,14 @@ class Instance:
|
|
182
224
|
- Le fichier demandé en `bytes`
|
183
225
|
"""
|
184
226
|
|
185
|
-
|
227
|
+
if not headers:
|
228
|
+
headers = self.default_headers
|
186
229
|
|
187
|
-
|
230
|
+
res = requests.get(f"{self.url}/drive/{bucket}/{path}", headers = headers)
|
231
|
+
|
232
|
+
if res.status_code == 200:
|
233
|
+
return res.json()
|
234
|
+
elif res.status_code in (403, 401):
|
235
|
+
raise PermissionError(res.json()['message'])
|
236
|
+
else:
|
237
|
+
raise Exception(f"Error {res.status_code}: {res.json()['message']}")
|