vortexpy 4.0.23__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.
Files changed (87) hide show
  1. vortex/DataWrapTuple.py +27 -0
  2. vortex/DeferUtil.py +224 -0
  3. vortex/Jsonable.py +304 -0
  4. vortex/Payload.py +115 -0
  5. vortex/PayloadEndpoint.py +216 -0
  6. vortex/PayloadEndpointTest.py +164 -0
  7. vortex/PayloadEnvelope.py +166 -0
  8. vortex/PayloadFilterKeys.py +15 -0
  9. vortex/PayloadIO.py +152 -0
  10. vortex/PayloadPriority.py +11 -0
  11. vortex/PayloadResponse.py +173 -0
  12. vortex/PayloadResponseTest.py +39 -0
  13. vortex/PayloadTest.py +136 -0
  14. vortex/PerformTestActionTuple.py +30 -0
  15. vortex/SerialiseUtil.py +273 -0
  16. vortex/TestTuple.py +61 -0
  17. vortex/Tuple.py +968 -0
  18. vortex/TupleAction.py +72 -0
  19. vortex/TupleActionVortex.py +5 -0
  20. vortex/TupleDataForTest.py +25 -0
  21. vortex/TuplePerfTest.py +71 -0
  22. vortex/TuplePolymorphicTupleTypeFieldArgTest.py +74 -0
  23. vortex/TupleRestfulTest.py +140 -0
  24. vortex/TupleSelector.py +105 -0
  25. vortex/TupleTest.py +127 -0
  26. vortex/VortexABC.py +55 -0
  27. vortex/VortexClientHttp.py +308 -0
  28. vortex/VortexClientHttpTest.py +71 -0
  29. vortex/VortexClientTcp.py +355 -0
  30. vortex/VortexClientWebsocketFactory.py +383 -0
  31. vortex/VortexConnectionABC.py +88 -0
  32. vortex/VortexFactory.py +932 -0
  33. vortex/VortexPayloadProtocol.py +180 -0
  34. vortex/VortexServer.py +367 -0
  35. vortex/VortexServerConnection.py +127 -0
  36. vortex/VortexServerHttpResource.py +193 -0
  37. vortex/VortexServerTcp.py +104 -0
  38. vortex/VortexServerWebsocket.py +287 -0
  39. vortex/VortexTcpMemoryLeakPayloadTest.py +611 -0
  40. vortex/VortexTcpMemoryLeakRawTest.py +87 -0
  41. vortex/VortexTest.py +22 -0
  42. vortex/VortexUtil.py +314 -0
  43. vortex/VortexWritePushProducer.py +321 -0
  44. vortex/__init__.py +10 -0
  45. vortex/data_loader/TupleDataLiveLockManager.py +383 -0
  46. vortex/data_loader/TupleDataLoader.py +326 -0
  47. vortex/data_loader/TupleDataLoaderDelegate.py +90 -0
  48. vortex/data_loader/TupleDataLoaderTupleABC.py +10 -0
  49. vortex/data_loader/TupleDataLoaderTuples.py +53 -0
  50. vortex/data_loader/__init__.py +0 -0
  51. vortex/event_bus/TupleChangeEventABC.py +15 -0
  52. vortex/event_bus/TupleChangeEventBus.py +192 -0
  53. vortex/event_bus/TupleChangeEventBusObserverABC.py +11 -0
  54. vortex/event_bus/__init__.py +0 -0
  55. vortex/handler/TupleActionProcessor.py +270 -0
  56. vortex/handler/TupleActionProcessorProxy.py +218 -0
  57. vortex/handler/TupleActionProcessorTestHandler.py +27 -0
  58. vortex/handler/TupleDataActionClient.py +67 -0
  59. vortex/handler/TupleDataObservableCache.py +201 -0
  60. vortex/handler/TupleDataObservableHandler.py +371 -0
  61. vortex/handler/TupleDataObservableProxyHandler.py +340 -0
  62. vortex/handler/TupleDataObservableTestHandler.py +60 -0
  63. vortex/handler/TupleDataObserverClient.py +158 -0
  64. vortex/handler/VortexJSTupleLoaderTestHandler.py +42 -0
  65. vortex/handler/__init__.py +0 -0
  66. vortex/restful/GzippedDataHttpClient.py +170 -0
  67. vortex/restful/GzippedDataHttpClientTest.py +103 -0
  68. vortex/restful/GzippedPayloadHttpClient.py +181 -0
  69. vortex/restful/RestfulHttpClient.py +107 -0
  70. vortex/restful/RestfulHttpClientTest.py +60 -0
  71. vortex/restful/RestfulResource.py +153 -0
  72. vortex/restful/RestfulResourceTest.py +100 -0
  73. vortex/restful/__init__.py +0 -0
  74. vortex/rpc/RPC.py +446 -0
  75. vortex/rpc/RPCTest.py +12 -0
  76. vortex/rpc/__init__.py +0 -0
  77. vortex/sqla_orm/OrmCrudHandler.py +431 -0
  78. vortex/sqla_orm/TupleProviderForDb.py +42 -0
  79. vortex/sqla_orm/VortexTupleJson.py +24 -0
  80. vortex/sqla_orm/__init__.py +0 -0
  81. vortex/storage/TupleStorageSqlite.py +359 -0
  82. vortex/storage/__init__.py +0 -0
  83. vortexpy-4.0.23.dist-info/LICENSE +21 -0
  84. vortexpy-4.0.23.dist-info/METADATA +43 -0
  85. vortexpy-4.0.23.dist-info/RECORD +87 -0
  86. vortexpy-4.0.23.dist-info/WHEEL +5 -0
  87. vortexpy-4.0.23.dist-info/top_level.txt +1 -0
@@ -0,0 +1,359 @@
1
+ import logging
2
+ import sqlite3
3
+ from collections import namedtuple
4
+ from datetime import datetime
5
+ from pathlib import Path
6
+ from typing import Optional
7
+ from typing import Union
8
+
9
+ import pytz
10
+ from twisted.internet import defer
11
+ from twisted.internet.defer import Deferred
12
+ from twisted.internet.defer import DeferredSemaphore
13
+ from twisted.internet.defer import inlineCallbacks
14
+
15
+ from vortex.DeferUtil import deferToThreadWrapWithLogger
16
+ from vortex.Payload import Payload
17
+ from vortex.Tuple import Tuple
18
+ from vortex.TupleSelector import TupleSelector
19
+
20
+ # ------------------------------------------------------------------------------
21
+
22
+ CREATE_TABLE_SQL = """CREATE TABLE IF NOT EXISTS tuples
23
+ (
24
+ tupleSelector TEXT,
25
+ dateTime REAL,
26
+ payload TEXT,
27
+ PRIMARY KEY (tupleSelector)
28
+ )"""
29
+
30
+ DROP_TABLE_SQL = """DROP TABLE IF NOT EXISTS tuples"""
31
+
32
+ DELETE_BY_SELECTOR_SQL = """DELETE
33
+ FROM tuples
34
+ WHERE tupleSelector = ?"""
35
+
36
+ DELETE_BY_DATE_SQL = """DELETE
37
+ FROM tuples
38
+ WHERE dateTime < ?"""
39
+
40
+ INSERT_SQL = """INSERT OR REPLACE INTO tuples
41
+ (tupleSelector, dateTime, payload)
42
+ VALUES (?, ?, ?)"""
43
+
44
+ SELECT_SQL = """SELECT payload
45
+ FROM tuples
46
+ WHERE tupleSelector = ?"""
47
+
48
+ SELECT_ALL_PAYLOADS_SQL = """SELECT payload from tuples"""
49
+
50
+ # ------------------------------------------------------------------------------
51
+
52
+ TupleStorageBatchSaveArguments = namedtuple(
53
+ "TupleStorageBatchSaveArguments", ["tupleSelector", "encodedPayload"]
54
+ )
55
+
56
+
57
+ # ------------------------------------------------------------------------------
58
+
59
+
60
+ class TupleStorageSqlite:
61
+ TRANSACTIONS_BEFORE_VACUUM = 50
62
+
63
+ def __init__(self, databaseDirectory: Path, databaseName: str):
64
+ databaseDirectory = databaseDirectory.expanduser()
65
+ self._databaseDirectory = databaseDirectory
66
+ self._databaseName = databaseName.lower().replace(".sqlite", "")
67
+ self._databasePath = (
68
+ databaseDirectory / f"{databaseName.lower()}.sqlite"
69
+ )
70
+
71
+ self._logger = logging.getLogger(f"{__name__} DB={self._databaseName}")
72
+
73
+ self._isDbOpen = False
74
+ self._transactionSemaphore = DeferredSemaphore(tokens=1)
75
+
76
+ self._transactionsSinceVacuum = 0
77
+
78
+ @property
79
+ def databasePath(self) -> Path:
80
+ return self._databasePath
81
+
82
+ def open(self) -> Deferred:
83
+ return self._transactionSemaphore.run(
84
+ deferToThreadWrapWithLogger(self._logger)(self._openBlocking)
85
+ )
86
+
87
+ def _openBlocking(self):
88
+ self._closeBlocking()
89
+ self._isDbOpen = False
90
+ try:
91
+ with sqlite3.connect(self._databasePath) as conn:
92
+ conn.execute(CREATE_TABLE_SQL)
93
+ conn.commit()
94
+ self._isDbOpen = True
95
+ except sqlite3.Error as e:
96
+ self._isDbOpen = False
97
+ raise
98
+
99
+ def isOpen(self) -> Deferred:
100
+ return defer.succeed(self._isDbOpen)
101
+
102
+ def _isOpenBlocking(self) -> bool:
103
+ return self._isDbOpen
104
+
105
+ def close(self) -> Deferred:
106
+ return self._transactionSemaphore.run(
107
+ deferToThreadWrapWithLogger(self._logger)(self._closeBlocking)
108
+ )
109
+
110
+ def _closeBlocking(self):
111
+ self._isDbOpen = False
112
+
113
+ def truncateStorage(self) -> Deferred:
114
+ return self._transactionSemaphore.run(
115
+ deferToThreadWrapWithLogger(self._logger)(
116
+ self._truncateStorageBlocking
117
+ )
118
+ )
119
+
120
+ def _truncateStorageBlocking(self):
121
+ self._closeBlocking()
122
+ self._databasePath.unlink(missing_ok=True)
123
+ self._openBlocking()
124
+
125
+ def snapshotToPath(self, path: Path) -> Deferred:
126
+ return self._transactionSemaphore.run(
127
+ deferToThreadWrapWithLogger(self._logger)(
128
+ self._snapshotToPathBlocking
129
+ ),
130
+ path=path,
131
+ )
132
+
133
+ def _snapshotToPathBlocking(self, path: Path):
134
+ assert self._isOpenBlocking(), "Database is not open"
135
+ path.unlink(missing_ok=True)
136
+ self._db.execute("VACUUM main INTO '%s'" % path)
137
+
138
+ def loadTuplesAndAggregateAllTuples(self, batchSize=250) -> Deferred:
139
+ return self._transactionSemaphore.run(
140
+ deferToThreadWrapWithLogger(self._logger)(
141
+ self._loadTuplesAndAggregateAllTuplesBlocking
142
+ ),
143
+ batchSize=batchSize,
144
+ )
145
+
146
+ def _loadTuplesAndAggregateAllTuplesBlocking(
147
+ self, batchSize: int
148
+ ) -> list[Tuple]:
149
+ startTime = datetime.now(pytz.UTC)
150
+
151
+ tuples = []
152
+
153
+ with sqlite3.connect(self._databasePath) as conn:
154
+ # Perform the transaction
155
+ cur = conn.cursor()
156
+ cur.execute(SELECT_ALL_PAYLOADS_SQL)
157
+ while True:
158
+ fetchStartTime = datetime.now(pytz.UTC)
159
+ rows = cur.fetchmany(batchSize)
160
+ if not rows:
161
+ break
162
+ newTuples = []
163
+ for row in rows:
164
+ newTuples.extend(
165
+ Payload().fromEncodedPayload(row[0]).tuples
166
+ )
167
+
168
+ tuples.extend(newTuples)
169
+
170
+ self._logger.debug(
171
+ "PROGRESS loadTuplesAndAggregateAllTuples"
172
+ " took %s for %s rows, %s tuples, total tuples = %s",
173
+ datetime.now(pytz.UTC) - fetchStartTime,
174
+ len(rows),
175
+ len(newTuples),
176
+ len(tuples),
177
+ )
178
+
179
+ self._logger.debug(
180
+ "FINISHED loadTuplesAndAggregateAllTuples took %s for %s tuples",
181
+ datetime.now(pytz.UTC) - startTime,
182
+ len(tuples),
183
+ )
184
+
185
+ return tuples
186
+
187
+ @inlineCallbacks
188
+ def loadTuples(self, tupleSelector: TupleSelector) -> Deferred:
189
+ startTime = datetime.now(pytz.UTC)
190
+
191
+ encodedPayload = yield self.loadTuplesEncoded(tupleSelector)
192
+ if not encodedPayload:
193
+ return []
194
+
195
+ payload = yield Payload().fromEncodedPayloadDefer(encodedPayload)
196
+
197
+ self._logger.debug(
198
+ "loadTuples took %s for %s tuples for %s",
199
+ datetime.now(pytz.UTC) - startTime,
200
+ len(payload.tuples),
201
+ tupleSelector,
202
+ )
203
+
204
+ return payload.tuples
205
+
206
+ def loadTuplesEncoded(self, tupleSelector: TupleSelector) -> Deferred:
207
+ return self._transactionSemaphore.run(
208
+ deferToThreadWrapWithLogger(self._logger)(
209
+ self._loadTuplesEncodedBlocking
210
+ ),
211
+ tupleSelector=tupleSelector,
212
+ )
213
+
214
+ def _loadTuplesEncodedBlocking(
215
+ self, tupleSelector: Union[TupleSelector, str]
216
+ ) -> Optional[bytes]:
217
+ tupleSelectorStr = (
218
+ tupleSelector
219
+ if isinstance(tupleSelector, str)
220
+ else tupleSelector.toJsonStr()
221
+ )
222
+
223
+ # Make sure the database is open
224
+ assert self._isOpenBlocking(), "Database is not open"
225
+
226
+ with sqlite3.connect(self._databasePath) as conn:
227
+ # Perform the transaction
228
+ cur = conn.cursor()
229
+ cur.execute(SELECT_SQL, (tupleSelectorStr,))
230
+ rows = cur.fetchall()
231
+ return rows[0][0] if rows else None
232
+
233
+ @inlineCallbacks
234
+ def saveTuples(
235
+ self, tupleSelector: TupleSelector, tuples: list[Tuple]
236
+ ) -> Deferred:
237
+ startTime = datetime.now(pytz.UTC)
238
+
239
+ encodedPayload = yield Payload(tuples=tuples).toEncodedPayloadDefer()
240
+ yield self.saveTuplesEncoded(tupleSelector, encodedPayload)
241
+
242
+ self._logger.debug(
243
+ "saveTuples took %s for %s tuples for %s",
244
+ datetime.now(pytz.UTC) - startTime,
245
+ len(tuples),
246
+ tupleSelector,
247
+ )
248
+
249
+ @inlineCallbacks
250
+ def saveTuplesEncoded(
251
+ self, tupleSelector: Union[TupleSelector, str], encodedPayload: bytes
252
+ ) -> Deferred:
253
+ tupleSelectorStr = (
254
+ tupleSelector
255
+ if isinstance(tupleSelector, str)
256
+ else tupleSelector.toJsonStr()
257
+ )
258
+
259
+ dateInt = round(datetime.now(pytz.UTC).timestamp() * 1000)
260
+ params = [(tupleSelectorStr, dateInt, encodedPayload)]
261
+ yield self._transaction(INSERT_SQL, params)
262
+
263
+ @inlineCallbacks
264
+ def batchSaveTuplesEncoded(
265
+ self, data: list[TupleStorageBatchSaveArguments]
266
+ ) -> Deferred:
267
+ if not data:
268
+ return
269
+
270
+ dateInt = round(datetime.now(pytz.UTC).timestamp() * 1000)
271
+ params = [
272
+ (
273
+ (
274
+ d.tupleSelector
275
+ if isinstance(d.tupleSelector, str)
276
+ else d.tupleSelector.toJsonStr()
277
+ ),
278
+ dateInt,
279
+ d.encodedPayload,
280
+ )
281
+ for d in data
282
+ ]
283
+ yield self._transaction(INSERT_SQL, params)
284
+
285
+ @inlineCallbacks
286
+ def batchDeleteTuples(
287
+ self, tupleSelectors: list[Union[TupleSelector, str]]
288
+ ) -> Deferred:
289
+ params = [
290
+ (
291
+ (
292
+ tupleSelector
293
+ if isinstance(tupleSelector, str)
294
+ else tupleSelector.toJsonStr()
295
+ ), # This comma creates the tuple required for parameters
296
+ )
297
+ for tupleSelector in tupleSelectors
298
+ ]
299
+
300
+ yield self._transaction(DELETE_BY_SELECTOR_SQL, params)
301
+
302
+ @inlineCallbacks
303
+ def deleteTuples(
304
+ self, tupleSelector: Union[TupleSelector, str]
305
+ ) -> Deferred:
306
+ tupleSelectorStr = (
307
+ tupleSelector
308
+ if isinstance(tupleSelector, str)
309
+ else tupleSelector.toJsonStr()
310
+ )
311
+
312
+ yield self._transaction(DELETE_BY_SELECTOR_SQL, [(tupleSelectorStr,)])
313
+
314
+ @inlineCallbacks
315
+ def deleteOldTuples(self, deleteDataBeforeDate: datetime) -> Deferred:
316
+ dateInt = round(
317
+ deleteDataBeforeDate.astimezone(pytz.UTC).timestamp() * 1000
318
+ )
319
+
320
+ yield self._transaction(DELETE_BY_DATE_SQL, [(dateInt,)])
321
+
322
+ def _transaction(
323
+ self, sql: str, params: Optional[list[tuple]] = None
324
+ ) -> Deferred:
325
+ return self._transactionSemaphore.run(
326
+ deferToThreadWrapWithLogger(self._logger)(
327
+ self._transactionBlocking
328
+ ),
329
+ sql=sql,
330
+ params=params,
331
+ )
332
+
333
+ def _transactionBlocking(
334
+ self, sql: str, params: Optional[list[tuple]] = None
335
+ ):
336
+ if not params:
337
+ params = []
338
+
339
+ # Make sure the input data is correct.
340
+ assert isinstance(params, list), "Parameters should be a list of tuples"
341
+ assert not len(params) or isinstance(
342
+ params[0], tuple
343
+ ), "Parameters should be a list of tuples"
344
+
345
+ # Make sure the database is open
346
+ assert self._isOpenBlocking(), "Database is not open"
347
+
348
+ # Perform the transaction
349
+
350
+ with sqlite3.connect(self._databasePath) as conn:
351
+ cur = conn.cursor()
352
+ cur.executemany(sql, params)
353
+ conn.commit()
354
+
355
+ self._transactionsSinceVacuum += 1
356
+
357
+ if self._transactionsSinceVacuum > self.TRANSACTIONS_BEFORE_VACUUM:
358
+ conn.execute("VACUUM")
359
+ self._transactionsSinceVacuum = 0
File without changes
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,43 @@
1
+ Metadata-Version: 2.2
2
+ Name: vortexpy
3
+ Version: 4.0.23
4
+ Summary: Synertys observable, routable, data serialisation and transport code.
5
+ Author-email: Synerty <contact@synerty.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2016
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/Synerty/vortexpy
29
+ Project-URL: Download, https://github.com/Synerty/vortexpy/tarball/3.4.6
30
+ Keywords: vortex,observable,http,compressed,synerty
31
+ Classifier: Programming Language :: Python :: 3.5
32
+ License-File: LICENSE
33
+ Requires-Dist: SQLAlchemy>=2.0
34
+ Requires-Dist: GeoAlchemy2
35
+ Requires-Dist: txwebsocket>=1.1.0
36
+ Requires-Dist: autobahn[twisted]
37
+ Requires-Dist: vcversioner
38
+ Requires-Dist: six
39
+ Requires-Dist: pytz
40
+ Requires-Dist: reactivex>=4.0.4
41
+ Requires-Dist: ddt>=1.6.0
42
+ Requires-Dist: psutil
43
+ Requires-Dist: txhttputil>=1.2.0
@@ -0,0 +1,87 @@
1
+ vortex/DataWrapTuple.py,sha256=l3FvZv8i2abVuR-Jmnhl1cXtdr5A416xGEhMPjETmVk,551
2
+ vortex/DeferUtil.py,sha256=ehuONrO74YPSm5WXLhSx_1zrbbebEXHBIwypEEfx8iI,6169
3
+ vortex/Jsonable.py,sha256=_bUm6oxZWjyb_VDMmDYBWby7Jrb5l3WlX3im3oS11FA,9564
4
+ vortex/Payload.py,sha256=Mf3q9Zvj1klSGMuXCPzbd0QiST8r9D9nqSiHobdHImI,3674
5
+ vortex/PayloadEndpoint.py,sha256=UgDvqXYTj9Zs8GGHJGrcKhoxYhmmosz8sKLnefu8lQA,6602
6
+ vortex/PayloadEndpointTest.py,sha256=IRic7ITwGfCGohdxDF3lvurfDMy-HgL9M4ZGq6uJVIY,4636
7
+ vortex/PayloadEnvelope.py,sha256=DrYoerNBkOnYpUa1TpVERQkP4V6adGkREzyCd6CNo6U,4912
8
+ vortex/PayloadFilterKeys.py,sha256=wC0ARGbnwGTZA-bwWq0aDdK1fmNRnUYCgcKfZUQXRCQ,319
9
+ vortex/PayloadIO.py,sha256=4_RzfQa3H44hLIfqkosIvcrscDKydunCXjQOvBHfTBk,4500
10
+ vortex/PayloadPriority.py,sha256=4WyH0TpwfX607K3JfrfgQ4iGJ2zBGVbw96Yfcivo6Ds,213
11
+ vortex/PayloadResponse.py,sha256=Lxa4TtiQ5MSfZCOeM964E_nKOLRDPGNebbKt1u5Y_qc,5356
12
+ vortex/PayloadResponseTest.py,sha256=bmuqiHv-qRU6YD2RCNtNFNc9TvzZ4SJ3WD4e_O7aft0,1290
13
+ vortex/PayloadTest.py,sha256=EIi2YJcqfUBjbdYKEIPDlpmqggJrocdjCl3aE8UlzAU,4360
14
+ vortex/PerformTestActionTuple.py,sha256=xnCaGoGO9qFD4SP3E7S8uORRBTttqORppRSmoF3QFgs,713
15
+ vortex/SerialiseUtil.py,sha256=M_R4k-FaGF-DyQXvwYJS_XAo21st0SphVs_zi5rhneM,6480
16
+ vortex/TestTuple.py,sha256=k5lauJ0vraWu5DIFqSWFrNEq5uOGuIS9XNnmYWmOPQw,1597
17
+ vortex/Tuple.py,sha256=WzVXtzfW0xTmu7u1dSN4yYE_rzZusdRu5FDZwLxsOLw,30566
18
+ vortex/TupleAction.py,sha256=Fr65HDi_8iHPdshkFxNZ4V3u0-xvZqHRJt_2a5KSiCA,1956
19
+ vortex/TupleActionVortex.py,sha256=uNVHvqWyLLJkACyfBixkduRjs3qudGBp7PL3-1T9D8U,187
20
+ vortex/TupleDataForTest.py,sha256=cH9ebUHIppIADWxbL9_Ky2c1ZTjDf30Hyb7vCQas4as,606
21
+ vortex/TuplePerfTest.py,sha256=oOlAAgOiiFrNJIHlCuAYa2wxXLPu7Dg7A-p702uxn7Y,1623
22
+ vortex/TuplePolymorphicTupleTypeFieldArgTest.py,sha256=TaRtSaDsbXu4rGP29K14m2F4BVdlR8GJ6T3Ydvvj2Xg,2207
23
+ vortex/TupleRestfulTest.py,sha256=KlBRd_t7ornbWjSu3GOCZScJ55eGb_nRcII1COmlOoU,3978
24
+ vortex/TupleSelector.py,sha256=55h0EIEJqLYaJn1ZvOT0WrV_mKF4ETW2DjgvDwMiqyw,2997
25
+ vortex/TupleTest.py,sha256=D9488Xpz_AqCZ3EIFpV3hnKEjqaym2gpgV3fDbrPMqA,3866
26
+ vortex/VortexABC.py,sha256=Vr2FZaPt7QLaP3W4INxNrrhKZRYvN9ptacDsBhSs9YA,1350
27
+ vortex/VortexClientHttp.py,sha256=--Cv0nMu-yV1pmHh4M_U3NKPQgnFa-uI9ZWUIiVMSFI,8710
28
+ vortex/VortexClientHttpTest.py,sha256=r1-qBx0nfTc6y9am3POFeI2cTofHetWueOPGqEFTe3U,1790
29
+ vortex/VortexClientTcp.py,sha256=KAKvusE8qsgjPBlSB13F-c1dZNdJAWACjpYBXm5HuZo,10800
30
+ vortex/VortexClientWebsocketFactory.py,sha256=6cr5GQc8qedDxiGHl6cig1YjY4XAScNcMyOjJeL9Hlc,11752
31
+ vortex/VortexConnectionABC.py,sha256=2qnu5Rv0UWyqkndMbdEUXgAbTB9R3DaEtOcdBe6-ov4,2057
32
+ vortex/VortexFactory.py,sha256=Gf2_loIlNR0iYhn6b-wB6q42L0lxDX1E80z8z0WjAic,33086
33
+ vortex/VortexPayloadProtocol.py,sha256=HmiqVmXjICddqT0uk5D6emyTkfORixtuV2Y-NNEYq6s,5586
34
+ vortex/VortexServer.py,sha256=gp5KqHph5tg70LJaTeiOtY4oF5SCHnuU5Zpm3d5KiVw,11607
35
+ vortex/VortexServerConnection.py,sha256=TpU4MnVlHKiu4UG5jW8EHMuwYU3QsM98AH9e_endc8I,3758
36
+ vortex/VortexServerHttpResource.py,sha256=0PNE3C7hjTNdTIA3kkmb6rDEZ4c-EO2yNbUmNXik5Lw,5834
37
+ vortex/VortexServerTcp.py,sha256=7p2Bwk-akiPofZVtYRxKvQcxDy2UpbeRV1xm-KfaDaw,3081
38
+ vortex/VortexServerWebsocket.py,sha256=yp7CwvYg9YdqFzqXqTjyR4CozRUPpjJvn4FHmEQUiAc,9335
39
+ vortex/VortexTcpMemoryLeakPayloadTest.py,sha256=88mliRzSCxbytMyH-6fhXVbQ1hHVFuvu_8er0PuYs4E,19710
40
+ vortex/VortexTcpMemoryLeakRawTest.py,sha256=6mcIsQyA8eMkx6LLn_8ORxBYejAb-JfeeFktiLysq-M,2327
41
+ vortex/VortexTest.py,sha256=-4zGv5PlteklFdI26VMtsN69xmkc_Grijxyz7zJZiw0,548
42
+ vortex/VortexUtil.py,sha256=FI_rmzGR2EN3ogmJZtqNhPeLIKc_OHGY-t09V5zyzHo,9770
43
+ vortex/VortexWritePushProducer.py,sha256=RlQvywwW8FoEzYPR0QQSyY7SZYaHaSewjGNGSEmqlXM,10495
44
+ vortex/__init__.py,sha256=bFGstg784xtzBRw3ie2STPvzLM_fEaqBg6WPXHFH6_w,195
45
+ vortex/data_loader/TupleDataLiveLockManager.py,sha256=TjZz89VaAtqOc_JT8eW7BP4iNW4x2SCE_XdOlGahbvk,12887
46
+ vortex/data_loader/TupleDataLoader.py,sha256=32EvaK61A_mfwMYO_TNKEREYV4HdA-UbQPP_Ie-QNIo,11548
47
+ vortex/data_loader/TupleDataLoaderDelegate.py,sha256=YhoNIrQvC2S399aNXhwFhQPgfJntCM30KWrEA1xejrE,2609
48
+ vortex/data_loader/TupleDataLoaderTupleABC.py,sha256=qYm-nFbGubXMFm1PBdJ5zO3tWYfyUrc3bzBIKTUO_0U,177
49
+ vortex/data_loader/TupleDataLoaderTuples.py,sha256=PH4yR5-uZXPWrPNgfxguhw8u25lyvL4K_ZJblAkU9hg,1696
50
+ vortex/data_loader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ vortex/event_bus/TupleChangeEventABC.py,sha256=x79SH_dLrR3Al4Sbeb5XcPfJz5oLkBIkHH9EK0fncRc,325
52
+ vortex/event_bus/TupleChangeEventBus.py,sha256=-0X4fHEYd6VPV67-gcvSqTS9V8dW0O6tWtafcZjsxGg,6122
53
+ vortex/event_bus/TupleChangeEventBusObserverABC.py,sha256=GNpIMyO81AYIOC1zco61pLVKWUenSse9__VtTdrBbFE,358
54
+ vortex/event_bus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ vortex/handler/TupleActionProcessor.py,sha256=5K6nbl-zbMMIwZpbTdVSR1jKWgEQHECfQ4-a-3BrJu0,8353
56
+ vortex/handler/TupleActionProcessorProxy.py,sha256=9CIp0WfTK6Cdadj8Eioy2nldzi6arILZA6k08cPRdO0,7290
57
+ vortex/handler/TupleActionProcessorTestHandler.py,sha256=n7DIOF5-Bp9RSa1zNDB2_wfBA1qtsOQ5HDXIlE3ACxc,933
58
+ vortex/handler/TupleDataActionClient.py,sha256=eEOsXlilpgYUjMKBhXMJEXu3eAg2R7hZrMQILXeylGU,2112
59
+ vortex/handler/TupleDataObservableCache.py,sha256=jfmnF_xAN-JaT1_1jJGDFrBTqKwjSbOi614qL6CR9as,6202
60
+ vortex/handler/TupleDataObservableHandler.py,sha256=ZCRuzdhTjzO2yLe3pM3i7nNXAN34JIql2FLWLBHRHiA,12671
61
+ vortex/handler/TupleDataObservableProxyHandler.py,sha256=PPqNb-73FkCXbksEV2Vgqvl5LRbIdE2FxXNxjrhHnc8,11648
62
+ vortex/handler/TupleDataObservableTestHandler.py,sha256=HoVH30ZelMc-108KZSVLm70FdwlKNUoiOBfOC9sQAcc,1969
63
+ vortex/handler/TupleDataObserverClient.py,sha256=2JgQOP_oND11mj4n87MiFHe51PVdqZI3cwn7b_8xmUs,5552
64
+ vortex/handler/VortexJSTupleLoaderTestHandler.py,sha256=cgLrRWokYgXhYiwF2L8E5fTYQRUstXHcdZsNZh5nDSk,1438
65
+ vortex/handler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
+ vortex/restful/GzippedDataHttpClient.py,sha256=NDvgGuraZ8LVHEYwnd28H_z-TL0P9sAGrD7VwhgE-uI,5153
67
+ vortex/restful/GzippedDataHttpClientTest.py,sha256=S1AtPBXkTvqGfgiw-iIhy3urexlRyPUUqMj41GGxurs,3304
68
+ vortex/restful/GzippedPayloadHttpClient.py,sha256=vPwOHep0dHuywOHAJ6_sPLx7KAOfSYEmxHh7MkwrpJU,5636
69
+ vortex/restful/RestfulHttpClient.py,sha256=Vyr8yM4YZg4YviAiFWu5Vw05flJUPDfo8gXat7MtpPE,3007
70
+ vortex/restful/RestfulHttpClientTest.py,sha256=rm7BXbheYqwUDI_OKIVWmJkQOliNTupFUGh6F1DVfFc,1662
71
+ vortex/restful/RestfulResource.py,sha256=2-BRAgO6jd6_DgI9dZBkhejO6TkXgTQ3DiYGc625eFo,4958
72
+ vortex/restful/RestfulResourceTest.py,sha256=nxDrFFgAqYlz0k96XKlBcpnFqbbtNRYrexdWpwv8bd8,3292
73
+ vortex/restful/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
+ vortex/rpc/RPC.py,sha256=yYLXXPgtSzk2nxZghF_kDsMCjW7AA1drId9dX70BQZw,13497
75
+ vortex/rpc/RPCTest.py,sha256=kfTsDRsqsoXPHLSqr4Qohl3zKYM3_6k43o6Us0k_zgA,387
76
+ vortex/rpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ vortex/sqla_orm/OrmCrudHandler.py,sha256=2Z2ys4ByCj2Qs3Fww30RlqbKTseIuADfMcIpMo-oFgo,13698
78
+ vortex/sqla_orm/TupleProviderForDb.py,sha256=oWrt85TdWalZH3e1xF_MIhPVaBi6uv1QKfXIL8mYbIg,1414
79
+ vortex/sqla_orm/VortexTupleJson.py,sha256=1Vjs12Hc2hFArHdpHK1p-EIVw2Xjp5NIYd0HaRlVZwc,636
80
+ vortex/sqla_orm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ vortex/storage/TupleStorageSqlite.py,sha256=kCiwXzD_EMjiatH-OKHC76BhcIsBFfJUOMr8kcXxh8w,11237
82
+ vortex/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ vortexpy-4.0.23.dist-info/LICENSE,sha256=pEbyGaq-NmeFBES71fEbfpMYibTV2_O8B0_gDyXxEkw,1057
84
+ vortexpy-4.0.23.dist-info/METADATA,sha256=qa7_ThLdnFUULG2X2LgYBAWCd7X4gjxMczIBmuUaKcU,1971
85
+ vortexpy-4.0.23.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
86
+ vortexpy-4.0.23.dist-info/top_level.txt,sha256=3xfbSD7kw8xKl0jk4GNHsOPKbhubstfWHPl6bxHciRQ,7
87
+ vortexpy-4.0.23.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (75.8.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ vortex