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 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: 2.0.0
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 et des exceptions
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 _select_from_db(self, table: str, key: str = None, value: str = None) -> list:
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 d'une table Supabase en fonction de l'ID.
72
+ Récupère des données JSON depuis l'API
52
73
 
53
74
  ## Paramètres
54
- table: `str`:\n
55
- Nom de la base
56
- key: `str`\n
57
- Clé à vérifier
58
- value: `str`\n
59
- Valeur de la clé à vérifier
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 key and value:
67
- res = self.db.from_(table).select("*").eq(key, value).execute()
68
- else:
69
- res = self.db.from_(table).select("*").execute()
87
+ if not headers:
88
+ headers = self.default_headers
70
89
 
71
- if res.data:
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
- def _get_by_ID(self, table: str, id: NSID) -> dict:
77
- _data = self._select_from_db(table, 'id', id)
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
- if _data is not None:
80
- _data = _data[0]
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, table: str, data: dict) -> None:
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 Supabase en utilisant le client Supabase.
108
+ Publie des données JSON dans une table nation-db.
87
109
 
88
- :param table: Nom de la table dans laquelle les données doivent être insérées
89
- :param data: Dictionnaire contenant les données à publier
90
- :return: Résultat de l'insertion
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
- res = self.db.from_(table).upsert(data).execute()
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
- return res
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 _delete_from_db(self, table: str, key: str, value: str):
133
+ def _delete(self, _class: str, ids: list[NSID]) -> None:
98
134
  """
99
- Supprime un enregistrement d'une table Supabase en fonction d'une clé et de sa valeur.
135
+ Supprime des données JSON dans une table nation-db.
100
136
 
101
137
  ## Paramètres
102
- table: `str`
103
- Nom de la table dans laquelle les données doivent être supprimées
104
- key: `str`
105
- Clé à vérifier (par exemple "id" ou autre clé unique)
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 = self.db.from_(table).delete().eq(key, value).execute()
144
+ res = requests.post(f"{self.url}/delete_{_class}", json = { "ids": ids })
115
145
 
116
- return res
117
-
118
- def _delete_by_ID(self, table: str, id: NSID):
119
- res = self._delete_from_db(table, 'id', id)
120
-
121
- return res
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
- if entity is not None:
130
- matches.append(entity)
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
- if query == {}:
133
- matches = [ self._select_from_db(table) ]
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 not matches or (len(matches) != len(query) and query != {}):
136
- return []
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
- _res = [ item for item in matches[0] if all(item in match for match in matches[1:]) ]
167
+ return matches
139
168
 
140
- return _res
141
169
 
142
- def _upload_to_storage(self, bucket: str, data: bytes, path: str, overwrite: bool = False, options: dict = {'content-type': 'image/png'}) -> dict:
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 Supabase.
172
+ Envoie un fichier dans un bucket nation-db.
145
173
 
146
174
  ## Paramètres
147
- bucket: `str`\n
175
+ bucket: `str`
148
176
  Nom du bucket où le fichier sera stocké
149
- data: `bytes`\n
177
+ name: `str`
178
+ Nom du fichier dans le drive
179
+ data: `bytes`
150
180
  Données à uploader
151
- path: `str`\n
152
- Chemin dans le bucket où le fichier sera stocké
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
- options["upsert"] = json.dumps(overwrite)
191
+ if not headers:
192
+ headers = self.default_headers
193
+ headers['Content-Type'] = 'image/png'
160
194
 
161
- if len(data) > 5 * 1000 ** 3:
162
- raise ValueError("La limite d'un fichier à upload est de 1Mo")
195
+ body = {
196
+ "name": name,
197
+ "overwrite": json.dumps(overwrite)
198
+ }
163
199
 
164
- res = self.db.storage.from_(bucket).upload(path, data, options)
200
+ file = ("file", "image/png", data)
165
201
 
166
- if res.json().get("error"):
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
- return res
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 Supabase.
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
- res = self.db.storage.from_(bucket).download(path)
227
+ if not headers:
228
+ headers = self.default_headers
186
229
 
187
- return res
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']}")