reyserver 1.1.43__py3-none-any.whl → 1.1.44__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.
reyserver/__init__.py CHANGED
@@ -15,3 +15,6 @@ rclient : Client methods.
15
15
  rfile : File methods.
16
16
  rserver : Server methods.
17
17
  """
18
+
19
+
20
+ from .rserver import Server
reyserver/rbase.py CHANGED
@@ -12,18 +12,18 @@
12
12
  from typing import Sequence
13
13
  from inspect import iscoroutinefunction
14
14
  from contextlib import asynccontextmanager
15
- from fastapi import FastAPI, Depends
15
+ from fastapi import FastAPI
16
+ from reydb import DatabaseAsync
17
+ from reykit.rbase import CoroutineFunctionSimple, Base, ConfigMeta, throw
16
18
 
17
- from reydb import DatabaseEngineAsync
18
- from reydb.rconn import DatabaseConnectionAsync
19
- from reydb.rorm import DatabaseORMSessionAsync
20
- from reykit.rbase import CoroutineFunctionSimple, Base, is_iterable
19
+ import rserver
21
20
 
22
21
 
23
22
  __all__ = (
24
23
  'ServerBase',
25
- 'ServerAPI',
26
- 'create_lifespan'
24
+ 'ServerConfig',
25
+ 'create_lifespan',
26
+ 'create_depend_sess'
27
27
  )
28
28
 
29
29
 
@@ -33,11 +33,14 @@ class ServerBase(Base):
33
33
  """
34
34
 
35
35
 
36
- class ServerAPI(ServerBase):
36
+ class ServerConfig(ServerBase, metaclass=ConfigMeta):
37
37
  """
38
- Server API type.
38
+ Config type.
39
39
  """
40
40
 
41
+ server: 'rserver.Server'
42
+ 'Server instance.'
43
+
41
44
 
42
45
  def create_lifespan(
43
46
  before: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
@@ -86,34 +89,31 @@ def create_lifespan(
86
89
  return lifespan
87
90
 
88
91
 
89
- # def create_depend_conn(db: DatabaseEngineAsync):
90
- # """
91
- # Create dependencie function of asynchronous database connection.
92
+ def create_depend_sess(database: str):
93
+ """
94
+ Create dependencie function of asynchronous database session.
92
95
 
93
- # Parameters
94
- # ----------
95
- # db : Asynchronous database instance.
96
- # """
96
+ Parameters
97
+ ----------
98
+ database : Database name.
97
99
 
100
+ Returns
101
+ -------
102
+ Dependencie function.
103
+ """
98
104
 
99
- # @asynccontextmanager
100
- # async def lifespan(app: FastAPI):
101
- # """
102
- # Server lifespan manager.
103
105
 
104
- # Parameters
105
- # ----------
106
- # app : Server APP.
107
- # """
106
+ async def depend_sess():
107
+ """
108
+ Dependencie function of asynchronous database session.
109
+ """
108
110
 
109
- # # Before.
110
- # for task in before:
111
- # await task()
112
- # yield
111
+ # Parameter.
112
+ engine = ServerConfig.server.db[database]
113
113
 
114
- # # After.
115
- # for task in after:
116
- # await after()
114
+ # Context.
115
+ async with engine.orm.session() as sess:
116
+ yield sess
117
117
 
118
118
 
119
- # return lifespan
119
+ return depend_sess
reyserver/rclient.py CHANGED
@@ -9,7 +9,7 @@
9
9
  """
10
10
 
11
11
 
12
- from rbase import ServerBase
12
+ from .rbase import ServerBase
13
13
 
14
14
 
15
15
  __all__ = (
reyserver/rfile.py CHANGED
@@ -11,16 +11,16 @@
11
11
 
12
12
  from typing import Annotated
13
13
  from fastapi import APIRouter, Form, File, UploadFile, Depends
14
- from reydb import rorm, DatabaseEngineAsync
14
+ from reydb import rorm
15
15
  from reykit.ros import FileStore, get_md5
16
16
 
17
- from .rbase import ServerAPI
17
+ from .rbase import ServerConfig, create_depend_sess
18
18
 
19
19
 
20
20
  __all__ = (
21
21
  'DatabaseORMTableInfo',
22
22
  'DatabaseORMTableData',
23
- 'ServerAPIFile'
23
+ 'build_file_db'
24
24
  )
25
25
 
26
26
 
@@ -50,232 +50,179 @@ class DatabaseORMTableData(rorm.Model, table=True):
50
50
  path: str = rorm.Field(rorm.types.VARCHAR(4095), not_null=True, comment='File disk storage path.')
51
51
 
52
52
 
53
- class ServerAPIFile(ServerAPI):
54
- """
55
- Server File API type.
56
- Can create database used `self.build_db` method.
57
- """
58
-
59
-
60
- def __init__(
61
- self,
62
- db_engine: DatabaseEngineAsync,
63
- path: str = 'file'
64
- ) -> None:
65
- """
66
- Build instance attributes.
67
-
68
- Parameters
69
- ----------
70
- db_engine : Asynchronous database instance.
71
- path: File store directory.
72
- """
73
-
74
- # Build.
75
- self.db_engine = db_engine
76
- self.path = path
77
-
78
- ## Router.
79
- self.router = self.__create_router()
80
-
81
- ## Build Database.
82
- self.build_db()
83
-
84
-
85
- async def depend_sess(self):
86
- """
87
- Dependencie function of asynchronous database session.
88
- """
89
-
90
- # Context.
91
- async with self.db_engine.orm.session() as sess:
92
- yield sess
93
-
94
-
95
- def __create_router(self) -> APIRouter:
96
- """
97
- Add APIs to router.
98
-
99
- Returns
100
- -------
101
- Router.
102
- """
103
-
104
- # Parameter.
105
- router = APIRouter()
106
-
53
+ file_router = APIRouter()
54
+ depend_sess_file = create_depend_sess('file')
107
55
 
108
- @router.post('/upload')
109
- async def upload(
110
- file: Annotated[UploadFile, File()],
111
- note: Annotated[str, Form()],
112
- sess: Annotated[rorm.DatabaseORMSessionAsync, Depends(self.depend_sess)]
113
- ):
114
- """
115
- Upload file.
116
56
 
117
- Parameters
118
- ----------
119
- file : File instance.
120
- note : File note.
121
- sess : Asynchronous database session.
122
- """
123
-
124
- # Handle parameter.
125
- file_store = FileStore(self.path)
126
- file_name = file.filename
127
- file_bytes = await file.read()
128
- file_md5 = get_md5(file_bytes)
129
- file_size = len(file_bytes)
57
+ @file_router.post('/upload')
58
+ async def upload(
59
+ file: Annotated[UploadFile, File()],
60
+ note: Annotated[str, Form()],
61
+ sess: Annotated[rorm.DatabaseORMSessionAsync, Depends(depend_sess_file)]
62
+ ):
63
+ """
64
+ Upload file.
130
65
 
131
- # Upload.
132
- file_path = file_store.index(file_md5)
66
+ Parameters
67
+ ----------
68
+ file : File instance.
69
+ note : File note.
70
+ sess : Asynchronous database session.
71
+ """
133
72
 
134
- ## Data.
135
- if file_path is None:
136
- file_path = file_store.store(file_bytes)
137
- table_data = DatabaseORMTableData(
138
- md5=file_md5,
139
- size=file_size,
140
- path=file_path
141
- )
142
- await sess.add(table_data)
73
+ # Handle parameter.
74
+ file_store = FileStore(ServerConfig.server.api_file_dir)
75
+ file_name = file.filename
76
+ file_bytes = await file.read()
77
+ file_md5 = get_md5(file_bytes)
78
+ file_size = len(file_bytes)
79
+
80
+ # Upload.
81
+ file_path = file_store.index(file_md5)
82
+
83
+ ## Data.
84
+ if file_path is None:
85
+ file_path = file_store.store(file_bytes)
86
+ table_data = DatabaseORMTableData(
87
+ md5=file_md5,
88
+ size=file_size,
89
+ path=file_path
90
+ )
91
+ await sess.add(table_data)
92
+
93
+ ## Information.
94
+ table_info = DatabaseORMTableInfo(
95
+ md5=file_md5,
96
+ name=file_name,
97
+ note=note
98
+ )
99
+ await sess.add(table_info)
100
+
101
+ # Get ID.
102
+ await sess.flush()
103
+ file_id = table_info.file_id
104
+
105
+ return {'file_id': file_id}
106
+
107
+
108
+ def build_file_db(self) -> None:
109
+ """
110
+ Check and build `file` database tables.
111
+ """
143
112
 
144
- ## Information.
145
- table_info = DatabaseORMTableInfo(
146
- md5=file_md5,
147
- name=file_name,
148
- note=note
113
+ # Set parameter.
114
+ engine = ServerConfig.server.db.file
115
+ database = engine.database
116
+
117
+ ## Table.
118
+ tables = [DatabaseORMTableInfo, DatabaseORMTableData]
119
+
120
+ ## View.
121
+ views = [
122
+ {
123
+ 'path': 'data_info',
124
+ 'select': (
125
+ 'SELECT `b`.`last_time`, `a`.`md5`, `a`.`size`, `b`.`names`, `b`.`notes`\n'
126
+ f'FROM `{database}`.`data` AS `a`\n'
127
+ 'LEFT JOIN (\n'
128
+ ' SELECT\n'
129
+ ' `md5`,\n'
130
+ " GROUP_CONCAT(DISTINCT(`name`) ORDER BY `create_time` DESC SEPARATOR ' | ') AS `names`,\n"
131
+ " GROUP_CONCAT(DISTINCT(`note`) ORDER BY `create_time` DESC SEPARATOR ' | ') AS `notes`,\n"
132
+ ' MAX(`create_time`) as `last_time`\n'
133
+ f' FROM `{database}`.`info`\n'
134
+ ' GROUP BY `md5`\n'
135
+ ' ORDER BY `last_time` DESC\n'
136
+ ') AS `b`\n'
137
+ 'ON `a`.`md5` = `b`.`md5`\n'
138
+ 'ORDER BY `last_time` DESC'
149
139
  )
150
- await sess.add(table_info)
151
-
152
- # Get ID.
153
- await sess.flush()
154
- file_id = table_info.file_id
155
-
156
- return {'file_id': file_id}
157
-
158
-
159
- return router
160
-
161
-
162
- def build_db(self) -> None:
163
- """
164
- Check and build database tables.
165
- """
166
-
167
- # Set parameter.
168
- database = self.db_engine.database
169
-
170
- ## Table.
171
- tables = [DatabaseORMTableInfo, DatabaseORMTableData]
172
-
173
- ## View.
174
- views = [
175
- {
176
- 'path': 'data_info',
177
- 'select': (
178
- 'SELECT `b`.`last_time`, `a`.`md5`, `a`.`size`, `b`.`names`, `b`.`notes`\n'
179
- f'FROM `{database}`.`data` AS `a`\n'
180
- 'LEFT JOIN (\n'
181
- ' SELECT\n'
182
- ' `md5`,\n'
183
- " GROUP_CONCAT(DISTINCT(`name`) ORDER BY `create_time` DESC SEPARATOR ' | ') AS `names`,\n"
184
- " GROUP_CONCAT(DISTINCT(`note`) ORDER BY `create_time` DESC SEPARATOR ' | ') AS `notes`,\n"
185
- ' MAX(`create_time`) as `last_time`\n'
186
- f' FROM `{database}`.`info`\n'
187
- ' GROUP BY `md5`\n'
188
- ' ORDER BY `last_time` DESC\n'
189
- ') AS `b`\n'
190
- 'ON `a`.`md5` = `b`.`md5`\n'
191
- 'ORDER BY `last_time` DESC'
192
- )
193
- }
194
- ]
195
-
196
- ## View stats.
197
- views_stats = [
198
- {
199
- 'path': 'stats',
200
- 'items': [
201
- {
202
- 'name': 'count',
203
- 'select': (
204
- 'SELECT COUNT(1)\n'
205
- f'FROM `{database}`.`info`'
206
- ),
207
- 'comment': 'File information count.'
208
- },
209
- {
210
- 'name': 'past_day_count',
211
- 'select': (
212
- 'SELECT COUNT(1)\n'
213
- f'FROM `{database}`.`info`\n'
214
- 'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) = 0'
215
- ),
216
- 'comment': 'File information count in the past day.'
217
- },
218
- {
219
- 'name': 'past_week_count',
220
- 'select': (
221
- 'SELECT COUNT(1)\n'
222
- f'FROM `{database}`.`info`\n'
223
- 'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) <= 6'
224
- ),
225
- 'comment': 'File information count in the past week.'
226
- },
227
- {
228
- 'name': 'past_month_count',
229
- 'select': (
230
- 'SELECT COUNT(1)\n'
231
- f'FROM `{database}`.`info`\n'
232
- 'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) <= 29'
233
- ),
234
- 'comment': 'File information count in the past month.'
235
- },
236
- {
237
- 'name': 'data_count',
238
- 'select': (
239
- 'SELECT COUNT(1)\n'
240
- f'FROM `{database}`.`data`'
241
- ),
242
- 'comment': 'File data unique count.'
243
- },
244
- {
245
- 'name': 'total_size',
246
- 'select': (
247
- 'SELECT FORMAT(SUM(`size`), 0)\n'
248
- f'FROM `{database}`.`data`'
249
- ),
250
- 'comment': 'File total byte size.'
251
- },
252
- {
253
- 'name': 'avg_size',
254
- 'select': (
255
- 'SELECT FORMAT(AVG(`size`), 0)\n'
256
- f'FROM `{database}`.`data`'
257
- ),
258
- 'comment': 'File average byte size.'
259
- },
260
- {
261
- 'name': 'max_size',
262
- 'select': (
263
- 'SELECT FORMAT(MAX(`size`), 0)\n'
264
- f'FROM `{database}`.`data`'
265
- ),
266
- 'comment': 'File maximum byte size.'
267
- },
268
- {
269
- 'name': 'last_time',
270
- 'select': (
271
- 'SELECT MAX(`create_time`)\n'
272
- f'FROM `{database}`.`info`'
273
- ),
274
- 'comment': 'File last record create time.'
275
- }
276
- ]
277
- }
278
- ]
279
-
280
- # Build.
281
- self.db_engine.sync_database.build.build(tables=tables, views=views, views_stats=views_stats, skip=True)
140
+ }
141
+ ]
142
+
143
+ ## View stats.
144
+ views_stats = [
145
+ {
146
+ 'path': 'stats',
147
+ 'items': [
148
+ {
149
+ 'name': 'count',
150
+ 'select': (
151
+ 'SELECT COUNT(1)\n'
152
+ f'FROM `{database}`.`info`'
153
+ ),
154
+ 'comment': 'File information count.'
155
+ },
156
+ {
157
+ 'name': 'past_day_count',
158
+ 'select': (
159
+ 'SELECT COUNT(1)\n'
160
+ f'FROM `{database}`.`info`\n'
161
+ 'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) = 0'
162
+ ),
163
+ 'comment': 'File information count in the past day.'
164
+ },
165
+ {
166
+ 'name': 'past_week_count',
167
+ 'select': (
168
+ 'SELECT COUNT(1)\n'
169
+ f'FROM `{database}`.`info`\n'
170
+ 'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) <= 6'
171
+ ),
172
+ 'comment': 'File information count in the past week.'
173
+ },
174
+ {
175
+ 'name': 'past_month_count',
176
+ 'select': (
177
+ 'SELECT COUNT(1)\n'
178
+ f'FROM `{database}`.`info`\n'
179
+ 'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) <= 29'
180
+ ),
181
+ 'comment': 'File information count in the past month.'
182
+ },
183
+ {
184
+ 'name': 'data_count',
185
+ 'select': (
186
+ 'SELECT COUNT(1)\n'
187
+ f'FROM `{database}`.`data`'
188
+ ),
189
+ 'comment': 'File data unique count.'
190
+ },
191
+ {
192
+ 'name': 'total_size',
193
+ 'select': (
194
+ 'SELECT FORMAT(SUM(`size`), 0)\n'
195
+ f'FROM `{database}`.`data`'
196
+ ),
197
+ 'comment': 'File total byte size.'
198
+ },
199
+ {
200
+ 'name': 'avg_size',
201
+ 'select': (
202
+ 'SELECT FORMAT(AVG(`size`), 0)\n'
203
+ f'FROM `{database}`.`data`'
204
+ ),
205
+ 'comment': 'File average byte size.'
206
+ },
207
+ {
208
+ 'name': 'max_size',
209
+ 'select': (
210
+ 'SELECT FORMAT(MAX(`size`), 0)\n'
211
+ f'FROM `{database}`.`data`'
212
+ ),
213
+ 'comment': 'File maximum byte size.'
214
+ },
215
+ {
216
+ 'name': 'last_time',
217
+ 'select': (
218
+ 'SELECT MAX(`create_time`)\n'
219
+ f'FROM `{database}`.`info`'
220
+ ),
221
+ 'comment': 'File last record create time.'
222
+ }
223
+ ]
224
+ }
225
+ ]
226
+
227
+ # Build.
228
+ engine.sync_engine.build.build(tables=tables, views=views, views_stats=views_stats, skip=True)
reyserver/rserver.py CHANGED
@@ -9,18 +9,15 @@
9
9
  """
10
10
 
11
11
 
12
- from typing import Literal
12
+ from collections.abc import Sequence
13
13
  from inspect import iscoroutinefunction
14
- from collections.abc import Sequence, Callable, Coroutine
14
+ from uvicorn import run as uvicorn_run
15
15
  from fastapi import FastAPI, Depends
16
- from fastapi.middleware.gzip import GZipMiddleware
17
16
  from fastapi.staticfiles import StaticFiles
18
- from uvicorn import run as uvicorn_run
19
- from contextlib import asynccontextmanager
20
- from reykit.rbase import CoroutineFunctionSimple
17
+ from reydb import DatabaseAsync
18
+ from reykit.rbase import CoroutineFunctionSimple, Singleton, throw
21
19
 
22
- from .rbase import ServerBase, create_lifespan
23
- from .rfile import ServerAPIFile
20
+ from .rbase import ServerBase, ServerConfig, create_lifespan
24
21
 
25
22
 
26
23
  __all__ = (
@@ -28,15 +25,17 @@ __all__ = (
28
25
  )
29
26
 
30
27
 
31
- class Server(ServerBase):
28
+ class Server(ServerBase, Singleton):
32
29
  """
33
- Server type.
30
+ Server type, singleton mode.
34
31
  Based on `fastapi` and `uvicorn` package.
32
+ Can view document api '/docs', '/redoc', '/openapi.json'.
35
33
  """
36
34
 
37
35
 
38
36
  def __init__(
39
37
  self,
38
+ db: DatabaseAsync,
40
39
  public: str | None = None,
41
40
  depend: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
42
41
  before: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
@@ -49,15 +48,18 @@ class Server(ServerBase):
49
48
 
50
49
  Parameters
51
50
  ----------
51
+ db : Asynchronous database.
52
52
  public : Public directory.
53
53
  depend : Global api dependencies.
54
54
  before : Execute before server start.
55
55
  after : Execute after server end.
56
+ ssl_cert : SSL certificate file path.
57
+ ssl_key : SSL key file path.
56
58
  """
57
59
 
58
60
  # Parameter.
59
61
  if type(ssl_cert) != type(ssl_key):
60
- raise
62
+ throw(AssertionError, ssl_cert, ssl_key)
61
63
  lifespan = create_lifespan(before, after)
62
64
  if depend is None:
63
65
  depend = ()
@@ -69,6 +71,8 @@ class Server(ServerBase):
69
71
  ]
70
72
 
71
73
  # Build.
74
+ ServerConfig.server = self
75
+ self.db = db
72
76
  self.ssl_cert = ssl_cert
73
77
  self.ssl_key = ssl_key
74
78
 
@@ -84,15 +88,15 @@ class Server(ServerBase):
84
88
  subapp = StaticFiles(directory=public, html=True)
85
89
  self.app.mount('/', subapp)
86
90
 
87
- ## Middleware.
88
- # self.app.add_middleware(GZipMiddleware)
89
- # self.app.add_middleware(TrustedHostMiddleware)
90
- # self.app.add_middleware(HTTPSRedirectMiddleware)
91
+ ## API.
92
+
93
+ ### File.
94
+ self.api_file_dir: str
91
95
 
92
96
 
93
97
  def run(self) -> None:
94
98
  """
95
- Run.
99
+ Run server.
96
100
  """
97
101
 
98
102
  # Run.
@@ -110,7 +114,21 @@ class Server(ServerBase):
110
114
  return {'message': 'test'}
111
115
 
112
116
 
113
- def add_api_file(self, db):
117
+ def add_api_file(self, file_dir: str = 'file', prefix='/file') -> None:
118
+ """
119
+ Add file API.
120
+
121
+ Parameters
122
+ ----------
123
+ file_dir : File API store directory path.
124
+ prefix : File API path prefix.
125
+ """
126
+
127
+ from .rfile import file_router, build_file_db
128
+
129
+ # Build database.
130
+ build_file_db()
114
131
 
115
- api = ServerAPIFile(db)
116
- self.app.include_router(api.router, prefix='/file')
132
+ # Add.
133
+ self.api_file_dir = file_dir
134
+ self.app.include_router(file_router, prefix=prefix)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reyserver
3
- Version: 1.1.43
3
+ Version: 1.1.44
4
4
  Summary: Backend server method set.
5
5
  Project-URL: homepage, https://github.com/reyxbo/reyserver/
6
6
  Author-email: Rey <reyxbo@163.com>
@@ -0,0 +1,10 @@
1
+ reyserver/__init__.py,sha256=JmDkcdP7oxmehE53rRRL_zhxmPinAbJRONpQp5qhsGI,340
2
+ reyserver/rall.py,sha256=6vqacf9erEfVfK5sgGJMDXD1h4ebt5gDN7NrPdtELms,248
3
+ reyserver/rbase.py,sha256=PXqgNMVZfy8JEziX_GlMNAel_usmwN7s9ssJEJXdTRM,2338
4
+ reyserver/rclient.py,sha256=rrqTPT_Y8zY9KIoPALKcIFUADg8HTa2YH9782tfGp3c,642
5
+ reyserver/rfile.py,sha256=JhHQSvJRa4Hq3qsHCE_UwoS0QPHtk7mw60KcC0YFe8E,7464
6
+ reyserver/rserver.py,sha256=sbuCkCF1-B2ZcYctapU3PrcqyLaETcumgipA_vYhGgQ,3400
7
+ reyserver-1.1.44.dist-info/METADATA,sha256=GJ4qp0xSxiku6Yp9FZrkaY-qQxCfVHuG_JM0RKfZJIc,1658
8
+ reyserver-1.1.44.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
9
+ reyserver-1.1.44.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
10
+ reyserver-1.1.44.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- reyserver/__init__.py,sha256=pkrC_rbWwOScD1laT_5d_5qz1QZeLLu-qBqgWPqtvjI,307
2
- reyserver/rall.py,sha256=6vqacf9erEfVfK5sgGJMDXD1h4ebt5gDN7NrPdtELms,248
3
- reyserver/rbase.py,sha256=DYIQDlV7VOJHXgOExKP-I726nVoFSMWYDbf7UJWCMBQ,2402
4
- reyserver/rclient.py,sha256=QICmY52XSFTf16G-z0IsiO1jsXXWKIOdhpufYbfxkO0,641
5
- reyserver/rfile.py,sha256=8KOJcCBjNjgfma1Q_tTyWI6wGLUcfGlo1DkqTv2mZBE,9244
6
- reyserver/rserver.py,sha256=M9pNnZy6tENu8B0hphcsMA0nHI8lHlR6gKbZ6YAfYrM,2939
7
- reyserver-1.1.43.dist-info/METADATA,sha256=XjtSDclS4UBbXh55dn--OWtnQsg6ECH0HcI0JPyi2Ig,1658
8
- reyserver-1.1.43.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
9
- reyserver-1.1.43.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
10
- reyserver-1.1.43.dist-info/RECORD,,