reyserver 1.1.43__py3-none-any.whl → 1.1.45__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,17 @@
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 reykit.rbase import CoroutineFunctionSimple, Base, ConfigMeta
16
17
 
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
18
+ from . import rserver
21
19
 
22
20
 
23
21
  __all__ = (
24
22
  'ServerBase',
25
- 'ServerAPI',
26
- 'create_lifespan'
23
+ 'ServerConfig',
24
+ 'create_lifespan',
25
+ 'create_depend_sess'
27
26
  )
28
27
 
29
28
 
@@ -33,11 +32,14 @@ class ServerBase(Base):
33
32
  """
34
33
 
35
34
 
36
- class ServerAPI(ServerBase):
35
+ class ServerConfig(ServerBase, metaclass=ConfigMeta):
37
36
  """
38
- Server API type.
37
+ Config type.
39
38
  """
40
39
 
40
+ server: 'rserver.Server'
41
+ 'Server instance.'
42
+
41
43
 
42
44
  def create_lifespan(
43
45
  before: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
@@ -86,34 +88,31 @@ def create_lifespan(
86
88
  return lifespan
87
89
 
88
90
 
89
- # def create_depend_conn(db: DatabaseEngineAsync):
90
- # """
91
- # Create dependencie function of asynchronous database connection.
91
+ def create_depend_sess(database: str):
92
+ """
93
+ Create dependencie function of asynchronous database session.
92
94
 
93
- # Parameters
94
- # ----------
95
- # db : Asynchronous database instance.
96
- # """
95
+ Parameters
96
+ ----------
97
+ database : Database name.
97
98
 
99
+ Returns
100
+ -------
101
+ Dependencie function.
102
+ """
98
103
 
99
- # @asynccontextmanager
100
- # async def lifespan(app: FastAPI):
101
- # """
102
- # Server lifespan manager.
103
104
 
104
- # Parameters
105
- # ----------
106
- # app : Server APP.
107
- # """
105
+ async def depend_sess():
106
+ """
107
+ Dependencie function of asynchronous database session.
108
+ """
108
109
 
109
- # # Before.
110
- # for task in before:
111
- # await task()
112
- # yield
110
+ # Parameter.
111
+ engine = ServerConfig.server.db[database]
113
112
 
114
- # # After.
115
- # for task in after:
116
- # await after()
113
+ # Context.
114
+ async with engine.orm.session() as sess:
115
+ yield sess
117
116
 
118
117
 
119
- # return lifespan
118
+ return depend_sess
reyserver/rclient.py CHANGED
@@ -9,7 +9,10 @@
9
9
  """
10
10
 
11
11
 
12
- from rbase import ServerBase
12
+ from reykit.ros import File, get_md5
13
+ from reykit.rnet import join_url, request
14
+
15
+ from .rbase import ServerBase
13
16
 
14
17
 
15
18
  __all__ = (
@@ -36,7 +39,61 @@ class ServerClient(ServerBase):
36
39
  self.url = url
37
40
 
38
41
 
39
- def upload_file(self): ...
42
+ def upload_file(
43
+ self,
44
+ source: str | bytes,
45
+ name: str | None = None,
46
+ note: str | None = None
47
+ ) -> int:
48
+ """
49
+ Upload file.
50
+
51
+ Parameters
52
+ ----------
53
+ source : File path or file bytes.
54
+ name : File name.
55
+ - `None`: Automatic set.
56
+ `parameter 'file' is 'str'`: Use path file name.
57
+ `parameter 'file' is 'bytes'`: No name.
58
+ - `str`: Use this name.
59
+ note : File note.
60
+
61
+ Returns
62
+ -------
63
+ File ID.
64
+ """
65
+
66
+ # Handle parameter.
67
+ url = join_url(self.url, 'file', 'upload')
68
+ match source:
69
+
70
+ ## File path.
71
+ case str():
72
+ file = File(source)
73
+ file_bytes = file.bytes
74
+ file_name = file.name_suffix
75
+
76
+ ## File bytes.
77
+ case bytes() | bytearray():
78
+ if type(source) == bytearray:
79
+ source = bytes(source)
80
+ file_bytes = source
81
+ file_name = None
82
+
83
+ ## File name.
84
+ if name is not None:
85
+ file_name = name
86
+
87
+ # Upload.
88
+ data = {'name': file_name, 'note': note}
89
+ files = {'file': file_bytes}
90
+ response = request(url, data=data, files=files, check=True)
91
+
92
+ ## Extract.
93
+ response_json = response.json()
94
+ file_id = response_json['file_id']
95
+
96
+ return file_id
40
97
 
41
98
 
42
99
  def download_file(self): ...
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
+ name: Annotated[str, Form()],
61
+ note: Annotated[str, Form()],
62
+ sess: Annotated[rorm.DatabaseORMSessionAsync, Depends(depend_sess_file)]
63
+ ):
64
+ """
65
+ Upload file.
130
66
 
131
- # Upload.
132
- file_path = file_store.index(file_md5)
67
+ Parameters
68
+ ----------
69
+ file : File instance.
70
+ note : File note.
71
+ sess : Asynchronous database session.
72
+ """
133
73
 
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)
74
+ # Handle parameter.
75
+ file_store = FileStore(ServerConfig.server.api_file_dir)
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=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() -> 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
 
@@ -76,7 +80,7 @@ class Server(ServerBase):
76
80
  self.app = FastAPI(
77
81
  dependencies=depend,
78
82
  lifespan=lifespan,
79
- debug=True
83
+ # debug=True
80
84
  )
81
85
 
82
86
  ## Static.
@@ -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') -> 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='/file')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reyserver
3
- Version: 1.1.43
3
+ Version: 1.1.45
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=khBk6N0G33hstiisDWtz4Tdg1tvnFrGszOynBtnKxsI,2305
4
+ reyserver/rclient.py,sha256=OjY_OEH_USrJK8TuCevXG6jNPVbM0lN-xMBozB7kSM8,2195
5
+ reyserver/rfile.py,sha256=wf56tItty7Jbjcwvh1yMgcX2jlSSXAYbTDKnA5dI8Yw,7459
6
+ reyserver/rserver.py,sha256=SfGs0W6StFtRtJ_UYI_avlL99euw7VvP55248mSOjLw,3387
7
+ reyserver-1.1.45.dist-info/METADATA,sha256=N4nGN_EC1Czdd7Q5DIHr4mxM3NNiPQCgjDenIZJ25yg,1658
8
+ reyserver-1.1.45.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
9
+ reyserver-1.1.45.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
10
+ reyserver-1.1.45.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,,