aiomisc 17.5.30__py3-none-any.whl → 17.6.1__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.
- aiomisc/aggregate.py +5 -12
- aiomisc/backoff.py +1 -1
- aiomisc/entrypoint.py +5 -2
- aiomisc/log.py +100 -71
- aiomisc/service/dns/store.py +20 -1
- aiomisc/service/dns/zone.py +32 -9
- aiomisc/service/uvicorn.py +1 -1
- aiomisc/timeout.py +1 -1
- aiomisc/version.py +2 -2
- {aiomisc-17.5.30.dist-info → aiomisc-17.6.1.dist-info}/METADATA +3 -3
- {aiomisc-17.5.30.dist-info → aiomisc-17.6.1.dist-info}/RECORD +15 -15
- {aiomisc-17.5.30.dist-info → aiomisc-17.6.1.dist-info}/WHEEL +1 -1
- aiomisc_log/__init__.py +0 -1
- {aiomisc-17.5.30.dist-info → aiomisc-17.6.1.dist-info}/COPYING +0 -0
- {aiomisc-17.5.30.dist-info → aiomisc-17.6.1.dist-info}/entry_points.txt +0 -0
aiomisc/aggregate.py
CHANGED
@@ -6,14 +6,7 @@ from asyncio import CancelledError, Event, Future, Lock, wait_for
|
|
6
6
|
from dataclasses import dataclass
|
7
7
|
from inspect import Parameter
|
8
8
|
from typing import (
|
9
|
-
Any,
|
10
|
-
Callable,
|
11
|
-
Coroutine,
|
12
|
-
Generic,
|
13
|
-
Iterable,
|
14
|
-
List,
|
15
|
-
Optional,
|
16
|
-
Protocol,
|
9
|
+
Any, Callable, Coroutine, Generic, Iterable, List, Optional, Protocol,
|
17
10
|
TypeVar,
|
18
11
|
)
|
19
12
|
|
@@ -245,7 +238,7 @@ class Aggregator(AggregatorAsync[V, R], Generic[V, R]):
|
|
245
238
|
|
246
239
|
|
247
240
|
def aggregate(
|
248
|
-
leeway_ms: float, max_count: Optional[int] = None
|
241
|
+
leeway_ms: float, max_count: Optional[int] = None,
|
249
242
|
) -> Callable[[AggregateFunc[V, R]], Callable[[V], Coroutine[Any, Any, R]]]:
|
250
243
|
"""
|
251
244
|
Parametric decorator that aggregates multiple
|
@@ -276,7 +269,7 @@ def aggregate(
|
|
276
269
|
:return:
|
277
270
|
"""
|
278
271
|
def decorator(
|
279
|
-
func: AggregateFunc[V, R]
|
272
|
+
func: AggregateFunc[V, R],
|
280
273
|
) -> Callable[[V], Coroutine[Any, Any, R]]:
|
281
274
|
aggregator = Aggregator(
|
282
275
|
func, max_count=max_count, leeway_ms=leeway_ms,
|
@@ -289,7 +282,7 @@ def aggregate_async(
|
|
289
282
|
leeway_ms: float, max_count: Optional[int] = None,
|
290
283
|
) -> Callable[
|
291
284
|
[AggregateAsyncFunc[V, R]],
|
292
|
-
Callable[[V], Coroutine[Any, Any, R]]
|
285
|
+
Callable[[V], Coroutine[Any, Any, R]],
|
293
286
|
]:
|
294
287
|
"""
|
295
288
|
Same as ``aggregate``, but with ``func`` arguments of type ``Arg``
|
@@ -302,7 +295,7 @@ def aggregate_async(
|
|
302
295
|
:return:
|
303
296
|
"""
|
304
297
|
def decorator(
|
305
|
-
func: AggregateAsyncFunc[V, R]
|
298
|
+
func: AggregateAsyncFunc[V, R],
|
306
299
|
) -> Callable[[V], Coroutine[Any, Any, R]]:
|
307
300
|
aggregator = AggregatorAsync(
|
308
301
|
func, max_count=max_count, leeway_ms=leeway_ms,
|
aiomisc/backoff.py
CHANGED
@@ -89,7 +89,7 @@ def asyncbackoff(
|
|
89
89
|
exceptions += asyncio.TimeoutError,
|
90
90
|
|
91
91
|
def decorator(
|
92
|
-
func: Callable[P, Coroutine[Any, Any, T]]
|
92
|
+
func: Callable[P, Coroutine[Any, Any, T]],
|
93
93
|
) -> Callable[P, Coroutine[Any, Any, T]]:
|
94
94
|
if attempt_timeout is not None:
|
95
95
|
func = timeout(attempt_timeout)(func)
|
aiomisc/entrypoint.py
CHANGED
@@ -6,8 +6,8 @@ import sys
|
|
6
6
|
import threading
|
7
7
|
from concurrent.futures import Executor
|
8
8
|
from typing import (
|
9
|
-
Any, Callable, Coroutine, FrozenSet, MutableSet, Optional, Set,
|
10
|
-
TypeVar, Union,
|
9
|
+
Any, Callable, Coroutine, FrozenSet, Iterable, MutableSet, Optional, Set,
|
10
|
+
Tuple, TypeVar, Union,
|
11
11
|
)
|
12
12
|
from weakref import WeakSet
|
13
13
|
|
@@ -115,6 +115,7 @@ class Entrypoint:
|
|
115
115
|
date_format=self.log_date_format,
|
116
116
|
buffered=self.log_buffering,
|
117
117
|
loop=self.loop,
|
118
|
+
handlers=self.log_handlers,
|
118
119
|
buffer_size=self.log_buffer_size,
|
119
120
|
flush_interval=self.log_flush_interval,
|
120
121
|
)
|
@@ -146,6 +147,7 @@ class Entrypoint:
|
|
146
147
|
log_date_format: Optional[str] = DEFAULT_LOG_DATE_FORMAT,
|
147
148
|
log_flush_interval: float = DEFAULT_AIOMISC_LOG_FLUSH,
|
148
149
|
log_config: bool = DEFAULT_AIOMISC_LOG_CONFIG,
|
150
|
+
log_handlers: Iterable[logging.Handler] = (),
|
149
151
|
policy: asyncio.AbstractEventLoopPolicy = event_loop_policy,
|
150
152
|
debug: bool = DEFAULT_AIOMISC_DEBUG,
|
151
153
|
catch_signals: Optional[Tuple[int, ...]] = None,
|
@@ -196,6 +198,7 @@ class Entrypoint:
|
|
196
198
|
self.log_date_format = log_date_format
|
197
199
|
self.log_flush_interval = log_flush_interval
|
198
200
|
self.log_format = log_format
|
201
|
+
self.log_handlers = tuple(log_handlers)
|
199
202
|
self.log_level = log_level
|
200
203
|
self.policy = policy
|
201
204
|
|
aiomisc/log.py
CHANGED
@@ -1,45 +1,82 @@
|
|
1
1
|
import asyncio
|
2
|
-
import atexit
|
3
|
-
import logging
|
4
2
|
import logging.handlers
|
5
|
-
import
|
3
|
+
import threading
|
6
4
|
import traceback
|
5
|
+
import warnings
|
7
6
|
from contextlib import suppress
|
8
|
-
from
|
7
|
+
from queue import Empty, Queue
|
9
8
|
from socket import socket
|
10
9
|
from typing import (
|
11
10
|
Any, Callable, Dict, Iterable, List, Optional, Tuple, Type, Union,
|
12
11
|
)
|
13
|
-
from weakref import finalize
|
14
12
|
|
15
13
|
import aiomisc_log
|
16
14
|
from aiomisc_log.enum import LogFormat, LogLevel
|
17
15
|
|
18
|
-
from .
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
16
|
+
from .counters import Statistic
|
17
|
+
|
18
|
+
|
19
|
+
class ThreadedHandlerStatistic(Statistic):
|
20
|
+
threads: int
|
21
|
+
records: int
|
22
|
+
errors: int
|
23
|
+
flushes: int
|
24
|
+
|
25
|
+
|
26
|
+
class ThreadedHandler(logging.Handler):
|
27
|
+
def __init__(
|
28
|
+
self, target: logging.Handler, flush_interval: float = 0.1,
|
29
|
+
buffered: bool = True, queue_size: int = 0,
|
30
|
+
):
|
31
|
+
super().__init__()
|
32
|
+
self._buffered = buffered
|
33
|
+
self._target = target
|
34
|
+
self._flush_interval = flush_interval
|
35
|
+
self._flush_event = threading.Event()
|
36
|
+
self._queue: Queue[Optional[logging.LogRecord]] = Queue(queue_size)
|
37
|
+
self._close_event = threading.Event()
|
38
|
+
self._thread = threading.Thread(target=self._in_thread, daemon=True)
|
39
|
+
self._statistic = ThreadedHandlerStatistic()
|
40
|
+
|
41
|
+
def start(self) -> None:
|
42
|
+
self._statistic.threads += 1
|
43
|
+
self._thread.start()
|
44
|
+
|
45
|
+
def close(self) -> None:
|
46
|
+
self._queue.put(None)
|
47
|
+
del self._queue
|
48
|
+
self.flush()
|
49
|
+
self._close_event.set()
|
50
|
+
super().close()
|
51
|
+
|
52
|
+
def flush(self) -> None:
|
53
|
+
self._statistic.flushes += 1
|
54
|
+
self._flush_event.set()
|
55
|
+
|
56
|
+
def emit(self, record: logging.LogRecord) -> None:
|
57
|
+
if self._buffered:
|
58
|
+
self._queue.put_nowait(record)
|
59
|
+
else:
|
60
|
+
self._queue.put(record)
|
61
|
+
self._statistic.records += 1
|
62
|
+
|
63
|
+
def _in_thread(self) -> None:
|
64
|
+
queue = self._queue
|
65
|
+
while not self._close_event.is_set():
|
66
|
+
self._flush_event.wait(self._flush_interval)
|
67
|
+
try:
|
68
|
+
self.acquire()
|
69
|
+
while True:
|
70
|
+
record = queue.get(timeout=self._flush_interval)
|
71
|
+
if record is None:
|
72
|
+
return
|
73
|
+
with suppress(Exception):
|
74
|
+
self._target.handle(record)
|
75
|
+
except Empty:
|
76
|
+
pass
|
77
|
+
finally:
|
78
|
+
self.release()
|
79
|
+
self._statistic.threads -= 1
|
43
80
|
|
44
81
|
|
45
82
|
def suppressor(
|
@@ -54,27 +91,18 @@ def suppressor(
|
|
54
91
|
|
55
92
|
def wrap_logging_handler(
|
56
93
|
handler: logging.Handler,
|
57
|
-
loop: Optional[asyncio.AbstractEventLoop] = None,
|
58
94
|
buffer_size: int = 1024,
|
59
95
|
flush_interval: Union[float, int] = 0.1,
|
96
|
+
loop: Optional[asyncio.AbstractEventLoop] = None,
|
60
97
|
) -> logging.Handler:
|
61
|
-
|
62
|
-
|
98
|
+
warnings.warn("wrap_logging_handler is deprecated", DeprecationWarning)
|
99
|
+
handler = ThreadedHandler(
|
63
100
|
target=handler,
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
run_in_new_thread(
|
68
|
-
_thread_flusher, args=(
|
69
|
-
buffered_handler, flush_interval, loop,
|
70
|
-
), no_return=True, statistic_name="logger",
|
101
|
+
queue_size=buffer_size,
|
102
|
+
flush_interval=flush_interval,
|
71
103
|
)
|
72
|
-
|
73
|
-
|
74
|
-
atexit.register(at_exit_flusher)
|
75
|
-
finalize(buffered_handler, partial(atexit.unregister, at_exit_flusher))
|
76
|
-
|
77
|
-
return buffered_handler
|
104
|
+
handler.start()
|
105
|
+
return handler
|
78
106
|
|
79
107
|
|
80
108
|
class UnhandledLoopHook(aiomisc_log.UnhandledHook):
|
@@ -109,7 +137,7 @@ class UnhandledLoopHook(aiomisc_log.UnhandledHook):
|
|
109
137
|
protocol: Optional[asyncio.Protocol] = context.pop("protocol", None)
|
110
138
|
transport: Optional[asyncio.Transport] = context.pop("transport", None)
|
111
139
|
sock: Optional[socket] = context.pop("socket", None)
|
112
|
-
|
140
|
+
source_tb: List[traceback.FrameSummary] = (
|
113
141
|
context.pop("source_traceback", None) or []
|
114
142
|
)
|
115
143
|
|
@@ -129,51 +157,52 @@ class UnhandledLoopHook(aiomisc_log.UnhandledHook):
|
|
129
157
|
|
130
158
|
self._fill_transport_extra(transport, extra)
|
131
159
|
self.logger.exception(message, exc_info=exception, extra=extra)
|
132
|
-
if
|
133
|
-
self.logger.error(
|
134
|
-
"".join(traceback.format_list(source_traceback)),
|
135
|
-
)
|
160
|
+
if source_tb:
|
161
|
+
self.logger.error("".join(traceback.format_list(source_tb)))
|
136
162
|
|
137
163
|
|
138
164
|
def basic_config(
|
139
165
|
level: Union[int, str] = LogLevel.default(),
|
140
166
|
log_format: Union[str, LogFormat] = LogFormat.default(),
|
141
|
-
buffered: bool = True,
|
167
|
+
buffered: bool = True,
|
168
|
+
buffer_size: int = 0,
|
142
169
|
flush_interval: Union[int, float] = 0.2,
|
143
170
|
loop: Optional[asyncio.AbstractEventLoop] = None,
|
144
171
|
handlers: Iterable[logging.Handler] = (),
|
145
172
|
**kwargs: Any,
|
146
173
|
) -> None:
|
147
|
-
loop = loop or asyncio.get_event_loop()
|
148
174
|
unhandled_hook = UnhandledLoopHook(logger_name="asyncio.unhandled")
|
149
175
|
|
150
|
-
|
151
|
-
|
176
|
+
if loop is None:
|
177
|
+
loop = asyncio.get_event_loop()
|
152
178
|
|
153
|
-
|
179
|
+
forever_task = asyncio.gather(
|
180
|
+
loop.create_future(), return_exceptions=True,
|
181
|
+
)
|
182
|
+
loop.set_exception_handler(unhandled_hook)
|
154
183
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
184
|
+
log_handlers = []
|
185
|
+
|
186
|
+
for user_handler in handlers:
|
187
|
+
handler = ThreadedHandler(
|
188
|
+
buffered=buffered,
|
189
|
+
flush_interval=flush_interval,
|
190
|
+
queue_size=buffer_size,
|
191
|
+
target=user_handler,
|
192
|
+
)
|
193
|
+
unhandled_hook.add_handler(handler)
|
194
|
+
forever_task.add_done_callback(lambda _: handler.close())
|
195
|
+
log_handlers.append(handler)
|
196
|
+
handler.start()
|
163
197
|
|
164
198
|
aiomisc_log.basic_config(
|
165
|
-
level=level,
|
166
|
-
log_format=log_format,
|
167
|
-
handler_wrapper=wrap_handler,
|
168
|
-
handlers=handlers,
|
169
|
-
**kwargs,
|
199
|
+
level=level, log_format=log_format, handlers=log_handlers, **kwargs,
|
170
200
|
)
|
171
201
|
|
172
|
-
loop.set_exception_handler(unhandled_hook)
|
173
|
-
|
174
202
|
|
175
203
|
__all__ = (
|
176
204
|
"LogFormat",
|
177
205
|
"LogLevel",
|
178
206
|
"basic_config",
|
207
|
+
"ThreadedHandler",
|
179
208
|
)
|
aiomisc/service/dns/store.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Optional, Sequence, Tuple
|
1
|
+
from typing import Iterable, Mapping, Optional, Sequence, Tuple
|
2
2
|
|
3
3
|
from .records import DNSRecord, RecordType
|
4
4
|
from .tree import RadixTree
|
@@ -49,3 +49,22 @@ class DNSStore:
|
|
49
49
|
@staticmethod
|
50
50
|
def get_reverse_tuple(zone_name: str) -> Tuple[str, ...]:
|
51
51
|
return tuple(zone_name.strip(".").split("."))[::-1]
|
52
|
+
|
53
|
+
def replace(
|
54
|
+
self, zones_data: Mapping[str, Iterable[DNSRecord]],
|
55
|
+
) -> None:
|
56
|
+
"""
|
57
|
+
Atomically replace all zones with new ones this method is safe
|
58
|
+
because it replaces all zones at once. zone_data is a mapping
|
59
|
+
zone name and a sequence of DNSRecord objects.
|
60
|
+
|
61
|
+
If any of the zones or records is invalid, nothing will be replaced.
|
62
|
+
|
63
|
+
This method is useful for reload configuration from disk
|
64
|
+
or database or etc.
|
65
|
+
"""
|
66
|
+
new_zones: RadixTree[DNSZone] = RadixTree()
|
67
|
+
for zone_name, records in zones_data.items():
|
68
|
+
zone = DNSZone(zone_name, *records)
|
69
|
+
new_zones.insert(self.get_reverse_tuple(zone.name), zone)
|
70
|
+
self.zones = new_zones
|
aiomisc/service/dns/zone.py
CHANGED
@@ -1,28 +1,33 @@
|
|
1
1
|
from collections import defaultdict
|
2
|
-
from typing import DefaultDict, Sequence, Set, Tuple
|
2
|
+
from typing import DefaultDict, Iterable, Sequence, Set, Tuple
|
3
3
|
|
4
4
|
from .records import DNSRecord, RecordType
|
5
5
|
|
6
6
|
|
7
|
+
RecordsType = DefaultDict[Tuple[str, RecordType], Set[DNSRecord]]
|
8
|
+
|
9
|
+
|
7
10
|
class DNSZone:
|
8
|
-
records:
|
11
|
+
records: RecordsType
|
9
12
|
name: str
|
10
13
|
|
11
14
|
__slots__ = ("name", "records")
|
12
15
|
|
13
|
-
def __init__(self, name: str):
|
16
|
+
def __init__(self, name: str, *records: DNSRecord) -> None:
|
14
17
|
if not name.endswith("."):
|
15
18
|
name += "."
|
16
19
|
self.name = name
|
17
20
|
self.records = defaultdict(set)
|
18
21
|
|
22
|
+
for record in records:
|
23
|
+
self.add_record(record)
|
24
|
+
|
19
25
|
def add_record(self, record: DNSRecord) -> None:
|
20
|
-
if not self.
|
26
|
+
if not self.check_record(record):
|
21
27
|
raise ValueError(
|
22
28
|
f"Record {record.name} does not belong to zone {self.name}",
|
23
29
|
)
|
24
|
-
|
25
|
-
self.records[key].add(record)
|
30
|
+
self.records[(record.name, record.type)].add(record)
|
26
31
|
|
27
32
|
def remove_record(self, record: DNSRecord) -> None:
|
28
33
|
key = (record.name, record.type)
|
@@ -37,8 +42,26 @@ class DNSZone:
|
|
37
42
|
) -> Sequence[DNSRecord]:
|
38
43
|
if not name.endswith("."):
|
39
44
|
name += "."
|
40
|
-
|
41
|
-
return tuple(self.records.get(key, ()))
|
45
|
+
return tuple(self.records.get((name, record_type), ()))
|
42
46
|
|
43
|
-
def
|
47
|
+
def check_record(self, record: DNSRecord) -> bool:
|
44
48
|
return record.name.endswith(self.name)
|
49
|
+
|
50
|
+
def replace(self, records: Iterable[DNSRecord]) -> None:
|
51
|
+
"""
|
52
|
+
Atomically replace all records in specified zone with new ones.
|
53
|
+
This method is safe because it replaces all records at once.
|
54
|
+
|
55
|
+
If any of the records does not belong to the zone, ValueError
|
56
|
+
will be raised and no records will be replaced.
|
57
|
+
"""
|
58
|
+
new_records: RecordsType = defaultdict(set)
|
59
|
+
|
60
|
+
for record in records:
|
61
|
+
if not self.check_record(record):
|
62
|
+
raise ValueError(
|
63
|
+
f"Record {record.name} does not "
|
64
|
+
f"belong to zone {self.name}",
|
65
|
+
)
|
66
|
+
new_records[(record.name, record.type)].add(record)
|
67
|
+
self.records = new_records
|
aiomisc/service/uvicorn.py
CHANGED
@@ -117,7 +117,7 @@ class UvicornService(Service, abc.ABC):
|
|
117
117
|
self.sock = config.bind_socket()
|
118
118
|
self.server = Server(config)
|
119
119
|
self.serve_task = asyncio.create_task(
|
120
|
-
self.server.serve(sockets=[self.sock])
|
120
|
+
self.server.serve(sockets=[self.sock]),
|
121
121
|
)
|
122
122
|
|
123
123
|
async def stop(self, exception: Optional[Exception] = None) -> None:
|
aiomisc/timeout.py
CHANGED
aiomisc/version.py
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.3
|
2
2
|
Name: aiomisc
|
3
|
-
Version: 17.
|
3
|
+
Version: 17.6.1
|
4
4
|
Summary: aiomisc - miscellaneous utils for asyncio
|
5
|
-
Home-page: https://github.com/aiokitchen/aiomisc
|
6
5
|
License: MIT
|
7
6
|
Author: Dmitry Orlov
|
8
7
|
Author-email: me@mosquito.su
|
@@ -70,6 +69,7 @@ Requires-Dist: uvicorn (>=0.27,<0.28) ; extra == "uvicorn"
|
|
70
69
|
Requires-Dist: uvloop (>=0.19,<1) ; extra == "uvloop"
|
71
70
|
Project-URL: Changelog, https://github.com/aiokitchen/aiomisc/blob/master/CHANGELOG.md
|
72
71
|
Project-URL: Documentation, https://docs.aiomisc.com/
|
72
|
+
Project-URL: Homepage, https://github.com/aiokitchen/aiomisc
|
73
73
|
Project-URL: Source, https://github.com/aiokitchen/aiomisc
|
74
74
|
Project-URL: Tracker, https://github.com/aiokitchen/aiomisc/issues
|
75
75
|
Description-Content-Type: text/x-rst
|
@@ -1,16 +1,16 @@
|
|
1
1
|
aiomisc/__init__.py,sha256=mgLaoGB3-WTAnrUfEN9nM_0Z_XU6xojkx1ISmW204UA,2253
|
2
2
|
aiomisc/_context_vars.py,sha256=28A7j_NABitKMtpxuFvxQ2wCr-Fq79dAC3YjqVLLeTQ,689
|
3
|
-
aiomisc/aggregate.py,sha256=
|
4
|
-
aiomisc/backoff.py,sha256=
|
3
|
+
aiomisc/aggregate.py,sha256=fqe_9-oXnJlzl094RpeeUd03Ud2lV6qUk7FUxjdpMi4,8874
|
4
|
+
aiomisc/backoff.py,sha256=5ct-7LLln3MhpLs6AAO2ADbFXL_Y5nZwPEkwTeXBwWE,5702
|
5
5
|
aiomisc/circuit_breaker.py,sha256=nZVLuGg4rKxn84CHaIvRfBYumgdwx2VZloF8OprQKuk,12581
|
6
6
|
aiomisc/compat.py,sha256=aYVe0J-2CvAzUHPAULNhrfMLFYNKN-z3Sg7nlBkzfxw,3291
|
7
7
|
aiomisc/context.py,sha256=j2YRNGDAJbrg94OkFyIMyYKHKzHRRL8tSAWma1yxNKE,1549
|
8
8
|
aiomisc/counters.py,sha256=ZU7K3FBY7V1jIKohWXXyXqby98FuOmq6H5Lv7Cf-c70,3686
|
9
9
|
aiomisc/cron.py,sha256=zAxdrLn8r7ERhkVaoUOv8xrQVZn7Hmm8HBS-MmsIu2s,2165
|
10
|
-
aiomisc/entrypoint.py,sha256=
|
10
|
+
aiomisc/entrypoint.py,sha256=x85478I-nmza4niFc4Yb4QsnMdRrdyUQ1Ud5dACRduI,14256
|
11
11
|
aiomisc/io.py,sha256=PWBy_D6CVlfhHokQoVfzmHIvGb37VtUo1P-yedB9aL8,10004
|
12
12
|
aiomisc/iterator_wrapper.py,sha256=d1aZ5jKTrK3kVCsfRPJPUq8X9ijVNi4o5Zs2pV4RS70,7243
|
13
|
-
aiomisc/log.py,sha256=
|
13
|
+
aiomisc/log.py,sha256=UTu5fMwIK5OU9QrDoJqxyVwdQHVDkzPl1laav0SIb4o,6323
|
14
14
|
aiomisc/periodic.py,sha256=OFYZbPkcGgeMjBk8zwsLr2TqPRTS6MNewaL3q9qK5js,2252
|
15
15
|
aiomisc/plugins/__init__.py,sha256=eHKGec_217rBjXGf8u-Joyf7dzpO1O0QAuFan1IEyYE,1057
|
16
16
|
aiomisc/plugins/__main__.py,sha256=y3mykRQmimDRHb_PvY4n08vegjWTjd9CONFbCecAxxw,1365
|
@@ -27,9 +27,9 @@ aiomisc/service/cron.py,sha256=VM-FjdAhy_zFkU-YTdpBSxF79upvrsCo-3kdI9cZTOo,1975
|
|
27
27
|
aiomisc/service/dns/__init__.py,sha256=RT8_0H8LrQe8sz2xvA2BvLi6CiJVZeVFltNRAx9MN7o,254
|
28
28
|
aiomisc/service/dns/records.py,sha256=VE65kDSJ3Fg3-V60-AQQY2OxR89_ggaAc38k7vKUatM,8771
|
29
29
|
aiomisc/service/dns/service.py,sha256=F8KSmFry6WpA4tWNrKcXVhS6GWb_Cyl3uanGu4lbOPw,3616
|
30
|
-
aiomisc/service/dns/store.py,sha256=
|
30
|
+
aiomisc/service/dns/store.py,sha256=PCYp-H1UoFzUVaYfSnK78_TG3fw1CeIzg-ndMgu_cE4,2509
|
31
31
|
aiomisc/service/dns/tree.py,sha256=q9VRcVxggrClUHyGZZqqSByMaHdU4nYPC1NdT17cVWM,1575
|
32
|
-
aiomisc/service/dns/zone.py,sha256=
|
32
|
+
aiomisc/service/dns/zone.py,sha256=6Xmrl_leLalSiRQWWNuwGtZVw31Y93i9K2j0JU1vt-4,2174
|
33
33
|
aiomisc/service/grpc_server.py,sha256=G1iRGX3jAfv3fpzNnw_n6UuhORmIZK4cz6aAi7t7qcU,4553
|
34
34
|
aiomisc/service/periodic.py,sha256=BEKGWxWDOX11sfo7MFYp-hiB5iZ4-c2BRsjS56k5B-0,1241
|
35
35
|
aiomisc/service/process.py,sha256=mZf8muZJNWQo95pUmzchMk08MJMhLifFK8m4CnNX49k,4477
|
@@ -40,14 +40,14 @@ aiomisc/service/tcp.py,sha256=gIdm4wXT191TMpL3Yzm_I7y--1kVxBLioN5lBP8mlhs,5507
|
|
40
40
|
aiomisc/service/tls.py,sha256=oFTYVe2zf1Ow_Gniem9WyNj_SkD3q95bcsz8LWAYqdI,7325
|
41
41
|
aiomisc/service/tracer.py,sha256=_dxk5y2JEteki9J1OXnOkI-EowD9vakSfsLaRDB4uMQ,2826
|
42
42
|
aiomisc/service/udp.py,sha256=_uHzMAkpd7y-yt3tE9jN2llEETG7r47g2DF1SO7xyig,3616
|
43
|
-
aiomisc/service/uvicorn.py,sha256=
|
43
|
+
aiomisc/service/uvicorn.py,sha256=I2KYQL9ysFFqQHPYK00G4EoceA7J9p9Or6v1ATpLGw8,4324
|
44
44
|
aiomisc/signal.py,sha256=_iiC2jukXg7-LLirIl1YATlKIIsKLbmTNFr1Ezheu7g,1728
|
45
45
|
aiomisc/thread_pool.py,sha256=591u5HV1aBmBRcaVm4kAtMLPZOb6veqhT9wkts_knqE,14017
|
46
|
-
aiomisc/timeout.py,sha256=
|
46
|
+
aiomisc/timeout.py,sha256=5jNDooLW4MAe6ZUIKhkiX29CoyI0zlXd-dZoZwQPxak,920
|
47
47
|
aiomisc/utils.py,sha256=6yTfTpeRCVzfZp-MJCmB1oayOHUBVwQwzC3U5PBAjn8,11919
|
48
|
-
aiomisc/version.py,sha256=
|
48
|
+
aiomisc/version.py,sha256=B1TWv5iW-jCEjR-oBMiuzklqcstWO0YKJhja1ibBplg,154
|
49
49
|
aiomisc/worker_pool.py,sha256=GA91KdOrBlqHthbVSTxu_d6BsBIbl-uKqW2NxqSafG0,11107
|
50
|
-
aiomisc_log/__init__.py,sha256=
|
50
|
+
aiomisc_log/__init__.py,sha256=N3g8Ea1YE2dWPDd-MwohuAn3Y0pBxSyL4l4Jsxqkv0Q,4854
|
51
51
|
aiomisc_log/enum.py,sha256=_zfCZPYCGyI9KL6TqHiYVlOfA5U5MCbsuCuDKxDHdxg,1549
|
52
52
|
aiomisc_log/formatter/__init__.py,sha256=1dBtF7yRvyvAhQRAofhBN682r7COoAB8blzibJxlvS8,235
|
53
53
|
aiomisc_log/formatter/color.py,sha256=6S-lwwceDGRN4svIrWmzq48XjWjDYuRWKN_gOMwY8dE,1276
|
@@ -63,8 +63,8 @@ aiomisc_worker/process_inner.py,sha256=8ZtjCSLrgySW57OIbuGrpEWxfysRLYKx1or1YaAqx
|
|
63
63
|
aiomisc_worker/protocol.py,sha256=1smmlBbdreSmnrxuhHaUMUC10FO9xMIEcedhweQJX_A,2705
|
64
64
|
aiomisc_worker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
65
65
|
aiomisc_worker/worker.py,sha256=f8nCFhlKh84UUBUaEgCllwMRvVZiD8_UUXaeit6g3T8,3236
|
66
|
-
aiomisc-17.
|
67
|
-
aiomisc-17.
|
68
|
-
aiomisc-17.
|
69
|
-
aiomisc-17.
|
70
|
-
aiomisc-17.
|
66
|
+
aiomisc-17.6.1.dist-info/COPYING,sha256=Ky_8CQMaIixfyOreUBsl0hKN6A5fLnPF8KPQ9molMYA,1125
|
67
|
+
aiomisc-17.6.1.dist-info/METADATA,sha256=lv79HXU0kcTEBHkLhwfCsd19zqzJ4E7V9tKh1Dgu0VI,15735
|
68
|
+
aiomisc-17.6.1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
69
|
+
aiomisc-17.6.1.dist-info/entry_points.txt,sha256=KRsSPCwKJyGTWrvzpwbS0yIDwzsgDA2X6f0CBWYmNao,55
|
70
|
+
aiomisc-17.6.1.dist-info/RECORD,,
|
aiomisc_log/__init__.py
CHANGED
File without changes
|
File without changes
|