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.
@@ -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.reader()
39
+ next = self.messages()
36
40
 
37
41
  if next == 'CALL':
38
- func = self.reader()
39
- args = self.reader()
40
- kwargs = self.reader()
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.reader()
52
+ return self.messages()
49
53
  elif next == 'ERROR':
50
- err_type = self.reader()
51
- err_value = self.reader()
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 __init__(self, thread_state, immutable_types, tracer, reader):
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
- self.immutable_types = immutable_types
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
- return lambda cls: dynamic_int_proxytype(handler = gateway, cls = cls, bind = self.bind)
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
- self.ext_handler, self.int_handler = gateway_pair(
83
- thread_state,
84
- tracer,
85
- immutable_types = immutable_types,
86
- ext_apply = ext_apply,
87
- int_proxytype = int_proxytype,
88
- ext_proxytype = functional.identity)
89
-
90
- def extend_type(self, base):
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
- # ok, how to provide __getattr__ style access,
192
+ # # ok, how to provide __getattr__ style access,
93
193
 
94
- extended = extending_proxytype(
95
- cls = base,
96
- thread_state = self.thread_state,
97
- int_handler = self.int_handler,
98
- ext_handler = self.ext_handler,
99
- on_subclass_new = self.bind,
100
- is_stub = True)
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
- self.immutable_types.add(extended)
103
- # proxytype = extending_proxytype(base)
202
+ # self.immutable_types.add(extended)
203
+ # # proxytype = extending_proxytype(base)
104
204
 
105
- # make_extensible(cls = extended,
106
- # int_handler = self.int_handler,
107
- # ext_handler = self.ext_handler,
108
- # on_new = self.reader.supply)
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
- return extended
210
+ # return extended
@@ -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
- def __init__(self, thread_id):
6
- self.thread_id = thread_id
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 thread_aware_writer(writer):
10
- on_thread_switch = functional.sequence(utils.thread_id(), writer.handle('THREAD_SWITCH'))
11
- return utils.threadawareproxy(on_thread_switch = on_thread_switch, target = writer)
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.0
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,,