retracesoftware-proxy 0.1.0__py3-none-any.whl → 0.1.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.
- retracesoftware/config.json +7 -0
- retracesoftware/install/install.py +2 -26
- retracesoftware/install/patcher.py +31 -7
- retracesoftware/install/record.py +9 -41
- retracesoftware/install/replay.py +4 -101
- retracesoftware/install/tracer.py +2 -2
- retracesoftware/proxy/__init__.py +1 -1
- retracesoftware/proxy/gateway.py +129 -71
- retracesoftware/proxy/proxysystem.py +169 -8
- retracesoftware/proxy/proxytype.py +24 -13
- retracesoftware/proxy/record.py +164 -73
- retracesoftware/proxy/replay.py +143 -43
- retracesoftware/proxy/thread.py +40 -5
- {retracesoftware_proxy-0.1.0.dist-info → retracesoftware_proxy-0.1.1.dist-info}/METADATA +1 -6
- retracesoftware_proxy-0.1.1.dist-info/RECORD +26 -0
- retracesoftware_proxy-0.1.0.dist-info/RECORD +0 -26
- {retracesoftware_proxy-0.1.0.dist-info → retracesoftware_proxy-0.1.1.dist-info}/WHEEL +0 -0
- {retracesoftware_proxy-0.1.0.dist-info → retracesoftware_proxy-0.1.1.dist-info}/top_level.txt +0 -0
retracesoftware/proxy/replay.py
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import retracesoftware.functional as functional
|
|
2
2
|
import retracesoftware_utils as utils
|
|
3
|
+
import retracesoftware.stream as stream
|
|
3
4
|
|
|
5
|
+
from retracesoftware.install.tracer import Tracer
|
|
6
|
+
from retracesoftware.proxy.thread import per_thread_messages
|
|
4
7
|
from retracesoftware.proxy.proxytype import dynamic_proxytype, dynamic_int_proxytype, extending_proxytype, make_extensible, dynamic_stubtype, stubtype_from_spec, Stub
|
|
5
|
-
from retracesoftware.proxy.gateway import gateway_pair
|
|
6
|
-
|
|
7
|
-
from retracesoftware.proxy.record import ProxyRef, ProxySpec
|
|
8
|
+
# from retracesoftware.proxy.gateway import gateway_pair
|
|
9
|
+
from retracesoftware.proxy.record import ProxyRef, ProxySpec, Placeholder
|
|
8
10
|
from retracesoftware.proxy.proxysystem import ProxySystem
|
|
9
11
|
|
|
10
12
|
import os
|
|
11
|
-
|
|
13
|
+
import weakref
|
|
12
14
|
# we can have a dummy method descriptor, its has a __name__ and when called, returns the next element
|
|
13
15
|
|
|
14
16
|
# for types, we can patch the __new__ method
|
|
@@ -20,6 +22,8 @@ class ReplayProxySystem(ProxySystem):
|
|
|
20
22
|
def stubtype(self, cls):
|
|
21
23
|
return dynamic_proxytype(handler = self.ext_handler, cls = cls)
|
|
22
24
|
|
|
25
|
+
def create_stub(self): return True
|
|
26
|
+
|
|
23
27
|
def stubtype_from_spec(self, spec):
|
|
24
28
|
print (f'FOOO!!! {spec}')
|
|
25
29
|
return stubtype_from_spec(
|
|
@@ -32,12 +36,12 @@ class ReplayProxySystem(ProxySystem):
|
|
|
32
36
|
@utils.striptraceback
|
|
33
37
|
def next_result(self):
|
|
34
38
|
while True:
|
|
35
|
-
next = self.
|
|
39
|
+
next = self.messages()
|
|
36
40
|
|
|
37
41
|
if next == 'CALL':
|
|
38
|
-
func = self.
|
|
39
|
-
args = self.
|
|
40
|
-
kwargs = self.
|
|
42
|
+
func = self.messages()
|
|
43
|
+
args = self.messages()
|
|
44
|
+
kwargs = self.messages()
|
|
41
45
|
|
|
42
46
|
try:
|
|
43
47
|
func(*args, **kwargs)
|
|
@@ -45,22 +49,104 @@ class ReplayProxySystem(ProxySystem):
|
|
|
45
49
|
pass
|
|
46
50
|
|
|
47
51
|
elif next == 'RESULT':
|
|
48
|
-
return self.
|
|
52
|
+
return self.messages()
|
|
49
53
|
elif next == 'ERROR':
|
|
50
|
-
err_type = self.
|
|
51
|
-
err_value = self.
|
|
54
|
+
err_type = self.messages()
|
|
55
|
+
err_value = self.messages()
|
|
52
56
|
utils.raise_exception(err_type, err_value)
|
|
53
57
|
else:
|
|
54
58
|
assert not isinstance(next, str)
|
|
55
59
|
return next
|
|
56
60
|
|
|
57
|
-
def
|
|
61
|
+
def bind(self, obj):
|
|
62
|
+
read = self.messages()
|
|
63
|
+
|
|
64
|
+
assert isinstance(read, Placeholder)
|
|
65
|
+
|
|
66
|
+
self.bindings[read] = obj
|
|
67
|
+
|
|
68
|
+
# def dynamic_path(self):
|
|
69
|
+
# if self.getpid() != self.pid:
|
|
70
|
+
# self.pid = self.getpid()
|
|
71
|
+
# # ok we are in child, calculate new path
|
|
72
|
+
# self.path = self.path / f'fork-{self.fork_counter}'
|
|
73
|
+
# self.fork_counter = 0
|
|
74
|
+
|
|
75
|
+
# return self.path
|
|
76
|
+
|
|
77
|
+
def after_fork_in_child(self):
|
|
78
|
+
self.reader.path = self.new_child_path(self.reader.path)
|
|
79
|
+
super().after_fork_in_child()
|
|
80
|
+
|
|
81
|
+
def __init__(self,
|
|
82
|
+
thread_state,
|
|
83
|
+
immutable_types,
|
|
84
|
+
tracing_config,
|
|
85
|
+
path,
|
|
86
|
+
fork_path = []):
|
|
87
|
+
|
|
58
88
|
# self.writer = writer
|
|
59
|
-
super().__init__(thread_state = thread_state)
|
|
60
|
-
|
|
89
|
+
# super().__init__(thread_state = thread_state)
|
|
90
|
+
reader = stream.reader(path)
|
|
91
|
+
|
|
92
|
+
self.bindings = utils.id_dict()
|
|
93
|
+
self.set_thread_id = utils.set_thread_id
|
|
94
|
+
self.fork_path = fork_path
|
|
95
|
+
deserialize = functional.walker(self.bindings.get_else_key)
|
|
96
|
+
|
|
97
|
+
self.messages = functional.sequence(per_thread_messages(reader), deserialize)
|
|
98
|
+
|
|
99
|
+
# messages = reader
|
|
100
|
+
|
|
101
|
+
def readnext():
|
|
102
|
+
try:
|
|
103
|
+
return self.messages()
|
|
104
|
+
except Exception as error:
|
|
105
|
+
self.thread_state.value = 'disabled'
|
|
106
|
+
print(f'Error reading stream: {error}')
|
|
107
|
+
os._exit(1)
|
|
108
|
+
|
|
109
|
+
# print(f'read: {obj}')
|
|
110
|
+
# return obj
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# lookup = weakref.WeakKeyDictionary()
|
|
114
|
+
|
|
115
|
+
# debug = debug_level(config)
|
|
116
|
+
|
|
117
|
+
# int_refs = {}
|
|
118
|
+
|
|
119
|
+
def read_required(required):
|
|
120
|
+
obj = readnext()
|
|
121
|
+
if obj != required:
|
|
122
|
+
print(f'Expected: {required} but got: {obj}')
|
|
123
|
+
for i in range(5):
|
|
124
|
+
print(readnext())
|
|
125
|
+
|
|
126
|
+
utils.sigtrap(None)
|
|
127
|
+
os._exit(1)
|
|
128
|
+
raise Exception(f'Expected: {required} but got: {obj}')
|
|
129
|
+
|
|
130
|
+
def trace_writer(name, *args):
|
|
131
|
+
print(f'Trace: {name} {args}')
|
|
132
|
+
|
|
133
|
+
read_required('TRACE')
|
|
134
|
+
read_required(name)
|
|
135
|
+
|
|
136
|
+
for arg in args:
|
|
137
|
+
read_required(arg)
|
|
138
|
+
|
|
139
|
+
# self.tracer = Tracer(tracing_config, writer = trace_writer)
|
|
140
|
+
# self.immutable_types = immutable_types
|
|
141
|
+
|
|
61
142
|
self.reader = reader
|
|
62
|
-
self.bind = self.reader.supply
|
|
63
143
|
|
|
144
|
+
# def foo(cls):
|
|
145
|
+
# print(cls)
|
|
146
|
+
# assert isinstance(cls, type)
|
|
147
|
+
# immutable_types.add(cls)
|
|
148
|
+
|
|
149
|
+
# add_stubtype = functional.side_effect(foo)
|
|
64
150
|
add_stubtype = functional.side_effect(immutable_types.add)
|
|
65
151
|
|
|
66
152
|
reader.type_deserializer[ProxyRef] = functional.sequence(lambda ref: ref.resolve(), self.stubtype, add_stubtype)
|
|
@@ -69,42 +155,56 @@ class ReplayProxySystem(ProxySystem):
|
|
|
69
155
|
# on_ext_result = functional.if_then_else(
|
|
70
156
|
# functional.is_instanceof(str), writer.handle('RESULT'), writer)
|
|
71
157
|
|
|
72
|
-
def int_proxytype(gateway):
|
|
73
|
-
|
|
158
|
+
# def int_proxytype(gateway):
|
|
159
|
+
# return lambda cls: dynamic_int_proxytype(handler = gateway, cls = cls, bind = self.bind)
|
|
74
160
|
|
|
75
161
|
def is_stub_type(obj):
|
|
76
162
|
return functional.typeof(obj) is type and issubclass(obj, Stub)
|
|
77
163
|
|
|
78
164
|
create_stubs = functional.walker(functional.when(is_stub_type, lambda cls: cls()))
|
|
79
165
|
|
|
80
|
-
ext_apply = functional.repeatedly(functional.sequence(self.next_result, create_stubs))
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
166
|
+
self.ext_apply = functional.repeatedly(functional.sequence(self.next_result, create_stubs))
|
|
167
|
+
|
|
168
|
+
def read_sync(): read_required('SYNC')
|
|
169
|
+
|
|
170
|
+
self.sync = lambda function: utils.observer(on_call = functional.always(read_sync), function = function)
|
|
171
|
+
|
|
172
|
+
super().__init__(thread_state = thread_state,
|
|
173
|
+
tracer = Tracer(tracing_config, writer = trace_writer),
|
|
174
|
+
immutable_types = immutable_types)
|
|
175
|
+
|
|
176
|
+
# super().__init__(
|
|
177
|
+
# thread_state=thread_state,
|
|
178
|
+
# immutable_types= immutable_types,
|
|
179
|
+
# tracer=self.tracer,
|
|
180
|
+
# ext_apply = ext_apply)
|
|
181
|
+
|
|
182
|
+
# self.ext_handler, self.int_handler = gateway_pair(
|
|
183
|
+
# thread_state,
|
|
184
|
+
# self.tracer,
|
|
185
|
+
# immutable_types = immutable_types,
|
|
186
|
+
# ext_apply = ext_apply,
|
|
187
|
+
# int_proxytype = int_proxytype,
|
|
188
|
+
# ext_proxytype = functional.identity)
|
|
189
|
+
|
|
190
|
+
# def extend_type(self, base):
|
|
91
191
|
|
|
92
|
-
|
|
192
|
+
# # ok, how to provide __getattr__ style access,
|
|
93
193
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
194
|
+
# extended = extending_proxytype(
|
|
195
|
+
# cls = base,
|
|
196
|
+
# thread_state = self.thread_state,
|
|
197
|
+
# int_handler = self.int_handler,
|
|
198
|
+
# ext_handler = self.ext_handler,
|
|
199
|
+
# on_subclass_new = self.bind,
|
|
200
|
+
# is_stub = True)
|
|
101
201
|
|
|
102
|
-
|
|
103
|
-
|
|
202
|
+
# self.immutable_types.add(extended)
|
|
203
|
+
# # proxytype = extending_proxytype(base)
|
|
104
204
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
205
|
+
# # make_extensible(cls = extended,
|
|
206
|
+
# # int_handler = self.int_handler,
|
|
207
|
+
# # ext_handler = self.ext_handler,
|
|
208
|
+
# # on_new = self.reader.supply)
|
|
109
209
|
|
|
110
|
-
|
|
210
|
+
# return extended
|
retracesoftware/proxy/thread.py
CHANGED
|
@@ -1,11 +1,46 @@
|
|
|
1
1
|
import retracesoftware.functional as functional
|
|
2
2
|
import retracesoftware_utils as utils
|
|
3
3
|
|
|
4
|
+
# def thread_aware_writer(writer):
|
|
5
|
+
# on_thread_switch = functional.sequence(utils.thread_id(), writer.handle('THREAD_SWITCH'))
|
|
6
|
+
# return utils.threadawareproxy(on_thread_switch = on_thread_switch, target = writer)
|
|
7
|
+
|
|
4
8
|
class ThreadSwitch:
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
__slots__ = ['id']
|
|
10
|
+
|
|
11
|
+
def __init__(self, id):
|
|
12
|
+
self.id = id
|
|
13
|
+
|
|
14
|
+
def set_thread_id(writer, id):
|
|
15
|
+
utils.set_thread_id(writer.handle(ThreadSwitch(id)))
|
|
16
|
+
|
|
17
|
+
def write_thread_switch(writer):
|
|
18
|
+
on_thread_switch = functional.repeatedly(functional.sequence(utils.thread_id, writer))
|
|
19
|
+
|
|
20
|
+
return lambda f: utils.thread_aware_proxy(target = f, on_thread_switch = on_thread_switch, sticky = False)
|
|
21
|
+
|
|
22
|
+
def prefix_with_thread_id(f, current):
|
|
23
|
+
def next():
|
|
24
|
+
nonlocal current, f
|
|
25
|
+
obj = f()
|
|
26
|
+
|
|
27
|
+
while isinstance(obj, ThreadSwitch):
|
|
28
|
+
current = obj.id
|
|
29
|
+
obj = f()
|
|
30
|
+
|
|
31
|
+
return (current, obj)
|
|
32
|
+
|
|
33
|
+
return next
|
|
34
|
+
|
|
35
|
+
def per_thread_messages(messages):
|
|
36
|
+
thread_id = utils.thread_id
|
|
37
|
+
# thread_id = lambda: 'FOOOOO!!!'
|
|
7
38
|
|
|
39
|
+
demux = utils.demux(source = prefix_with_thread_id(messages, thread_id()), key_function = lambda obj: obj[0])
|
|
8
40
|
|
|
9
|
-
def
|
|
10
|
-
|
|
11
|
-
return
|
|
41
|
+
# def next():
|
|
42
|
+
# thread,message = demux(thread_id())
|
|
43
|
+
# return message
|
|
44
|
+
|
|
45
|
+
# return next
|
|
46
|
+
return functional.repeatedly(lambda: demux(thread_id())[1])
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: retracesoftware_proxy
|
|
3
|
-
Version: 0.1.
|
|
4
|
-
Summary: Proxy layer for retracesoftware runtime
|
|
3
|
+
Version: 0.1.1
|
|
5
4
|
License: Apache-2.0
|
|
6
|
-
Requires-Python: >=3.11
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
5
|
Requires-Dist: retracesoftware_utils
|
|
9
6
|
Requires-Dist: retracesoftware_functional
|
|
10
7
|
Requires-Dist: retracesoftware_stream
|
|
11
|
-
|
|
12
|
-
# proxy
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
retracesoftware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
retracesoftware/config.json,sha256=zhi3DZKG0pIT3Mh2EUXlzQai-U6YrknueOjMJLwNKxY,8281
|
|
3
|
+
retracesoftware/install/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
retracesoftware/install/config.py,sha256=EzE5ifQF2lo--hu2njI4T0FJ-zlnWDJV6i7x0DMkVTw,1364
|
|
5
|
+
retracesoftware/install/edgecases.py,sha256=NR3lyvad9sRsyeDv_Ya8V4xMgPsMPOi9rMcnFOJGOEA,6330
|
|
6
|
+
retracesoftware/install/globals.py,sha256=F8XvIoZQQ10gSRalk30dvdKllxlwxkaggYY6FogLDxY,510
|
|
7
|
+
retracesoftware/install/install.py,sha256=nHnXjLnZDcY2untKR7BsPJEAcwoHfvXqgCmdHLiwRPE,5104
|
|
8
|
+
retracesoftware/install/patcher.py,sha256=PY4j3aXzu5l5fOGiChT8Y54nzhVpnHkWTGcxPtpe5mo,16773
|
|
9
|
+
retracesoftware/install/predicate.py,sha256=tX7NQc0rGkyyHYO3mduYHcJHbw1wczT53m_Dpkzo6do,2679
|
|
10
|
+
retracesoftware/install/record.py,sha256=Y-vDuUP_ZVzMC8PGhZP2fp8gLkIa5FJPhMKTBUSXi_o,3113
|
|
11
|
+
retracesoftware/install/references.py,sha256=0nUY_9BkeFz2imcw97rcJNq2jqISCB8dysBbCrh1eCo,1623
|
|
12
|
+
retracesoftware/install/replay.py,sha256=SV7-k05xZFiNfBaxrlLrqbB8-i01IPvnJQjRj9zuinI,1828
|
|
13
|
+
retracesoftware/install/tracer.py,sha256=UUVzBD_Nd91VH4iTs7ZDzaIbp_WeiOCSQnSe76dmfjM,4588
|
|
14
|
+
retracesoftware/install/typeutils.py,sha256=_a1PuwdCsYjG1Nkd77V-flqYtwbD4RkJVKn6Z-xABL4,1813
|
|
15
|
+
retracesoftware/proxy/__init__.py,sha256=ZlDZIuUmKFsE9Tvfd2EKGabTepqv8nrbr5pQhCM3IKc,193
|
|
16
|
+
retracesoftware/proxy/gateway.py,sha256=qRaE1xIdbRy6kBWmvvrBh-xKRmywWybO01yi1ppVdu8,6062
|
|
17
|
+
retracesoftware/proxy/proxyfactory.py,sha256=2PgC0NtDbRmhmU--caTiQDsaF8s1h9tavQxvPIow_bM,11912
|
|
18
|
+
retracesoftware/proxy/proxysystem.py,sha256=aX5bYqL2yf7mSgbjtDh1-n8dQ98nHZLT55kSLdVMy_c,6442
|
|
19
|
+
retracesoftware/proxy/proxytype.py,sha256=RuZL0xl48hfSnOFMum74FXdde-UNJ1Urz-ILBNMs4Ts,9398
|
|
20
|
+
retracesoftware/proxy/record.py,sha256=ShQrPSiNvZ9hckW6eaOoHj-w7_-X1o7R6zlaZkV_zdI,7687
|
|
21
|
+
retracesoftware/proxy/replay.py,sha256=jsg0DZTe1TBU5kjRt9weqLpHl8AlDQeqakNddYhBE2E,7111
|
|
22
|
+
retracesoftware/proxy/thread.py,sha256=zAqzLDJuhZxieMPtHzipTbuZ8WSO4nmRBgDBs7kPQy0,1373
|
|
23
|
+
retracesoftware_proxy-0.1.1.dist-info/METADATA,sha256=QuPCODtdgePy3CzNyVoMpLZAVbScOYpeHPfpTOwTIrQ,202
|
|
24
|
+
retracesoftware_proxy-0.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
25
|
+
retracesoftware_proxy-0.1.1.dist-info/top_level.txt,sha256=hYHsR6txLidmqvjBMITpIHvmJJbmoCAgr76-IpZPRz8,16
|
|
26
|
+
retracesoftware_proxy-0.1.1.dist-info/RECORD,,
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
retracesoftware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
retracesoftware/config.json,sha256=aedf9CXxOBkcQk3BJVrh0GuBkIAjBGBRlrTXdoRJ-MY,8108
|
|
3
|
-
retracesoftware/install/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
retracesoftware/install/config.py,sha256=EzE5ifQF2lo--hu2njI4T0FJ-zlnWDJV6i7x0DMkVTw,1364
|
|
5
|
-
retracesoftware/install/edgecases.py,sha256=NR3lyvad9sRsyeDv_Ya8V4xMgPsMPOi9rMcnFOJGOEA,6330
|
|
6
|
-
retracesoftware/install/globals.py,sha256=F8XvIoZQQ10gSRalk30dvdKllxlwxkaggYY6FogLDxY,510
|
|
7
|
-
retracesoftware/install/install.py,sha256=VNtivSf6A9wtLzIkZKJQ7thPkYTdjtTmxaIkPUOwLhg,5942
|
|
8
|
-
retracesoftware/install/patcher.py,sha256=5DGzVaNM53Z_KWz-wWQxlr1WqeWuuxKoVZyN5tNGuTw,15866
|
|
9
|
-
retracesoftware/install/predicate.py,sha256=tX7NQc0rGkyyHYO3mduYHcJHbw1wczT53m_Dpkzo6do,2679
|
|
10
|
-
retracesoftware/install/record.py,sha256=mJyz8ZFnrveDCvrUHksTXaFZbBX10yqH6UBV1QH5EwA,4370
|
|
11
|
-
retracesoftware/install/references.py,sha256=0nUY_9BkeFz2imcw97rcJNq2jqISCB8dysBbCrh1eCo,1623
|
|
12
|
-
retracesoftware/install/replay.py,sha256=ox43e8k_uvn9w6vf6rt8f3KwaXcBVx2GbvWaLZpwqR4,4952
|
|
13
|
-
retracesoftware/install/tracer.py,sha256=dFhXKkmvGLF-_WzQvZXxNO1Ftj6crH1SM6pGBU4cqMY,4586
|
|
14
|
-
retracesoftware/install/typeutils.py,sha256=_a1PuwdCsYjG1Nkd77V-flqYtwbD4RkJVKn6Z-xABL4,1813
|
|
15
|
-
retracesoftware/proxy/__init__.py,sha256=NaGsqoj4X3NpHfTAmRIfsXM16R6AGE99ciQeknj3sXc,119
|
|
16
|
-
retracesoftware/proxy/gateway.py,sha256=JtSwwllXiUykpNdojbK7okyYadRnILGgpRCHxAQijZs,3911
|
|
17
|
-
retracesoftware/proxy/proxyfactory.py,sha256=2PgC0NtDbRmhmU--caTiQDsaF8s1h9tavQxvPIow_bM,11912
|
|
18
|
-
retracesoftware/proxy/proxysystem.py,sha256=kDdtea-vCcsqdwSwmgGBBvVrIRl6Gwb89Wgx6VSIwgQ,759
|
|
19
|
-
retracesoftware/proxy/proxytype.py,sha256=P78aL3_aemG8p3NKmP4YfAcwC8IDr7LIq5-dkV4n0Ec,9038
|
|
20
|
-
retracesoftware/proxy/record.py,sha256=yI8CH0oOyrAyvjy9JsawgkQh9jYTlg9sQ_CcejrFKO4,4772
|
|
21
|
-
retracesoftware/proxy/replay.py,sha256=usbb2OTX6uJG_zialqHk9en0mxD2xEhjPajMZDjZnkQ,3940
|
|
22
|
-
retracesoftware/proxy/thread.py,sha256=9_6gWiRbir77f9kelpvXaTWviRfZo0ACkKPdGNbrq2Q,394
|
|
23
|
-
retracesoftware_proxy-0.1.0.dist-info/METADATA,sha256=c24hdDKP-miIrX6mM1yVyXCQeu0ozLP4N0ebtqiGccw,324
|
|
24
|
-
retracesoftware_proxy-0.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
25
|
-
retracesoftware_proxy-0.1.0.dist-info/top_level.txt,sha256=hYHsR6txLidmqvjBMITpIHvmJJbmoCAgr76-IpZPRz8,16
|
|
26
|
-
retracesoftware_proxy-0.1.0.dist-info/RECORD,,
|
|
File without changes
|
{retracesoftware_proxy-0.1.0.dist-info → retracesoftware_proxy-0.1.1.dist-info}/top_level.txt
RENAMED
|
File without changes
|