jaseci 1.4.2.6__py3-none-any.whl → 2.0.0__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.

Potentially problematic release.


This version of jaseci might be problematic. Click here for more details.

Files changed (187) hide show
  1. jaseci/__init__.py +3 -37
  2. jaseci-2.0.0.dist-info/METADATA +65 -0
  3. jaseci-2.0.0.dist-info/RECORD +4 -0
  4. {jaseci-1.4.2.6.dist-info → jaseci-2.0.0.dist-info}/WHEEL +1 -2
  5. jaseci/VERSION +0 -1
  6. jaseci/cli_tools/__init__.py +0 -0
  7. jaseci/cli_tools/book_tools.py +0 -457
  8. jaseci/cli_tools/jsctl.py +0 -500
  9. jaseci/cli_tools/tests/__init__.py +0 -0
  10. jaseci/cli_tools/tests/test_jsctl.py +0 -556
  11. jaseci/extens/__init__.py +0 -0
  12. jaseci/extens/act_lib/__init__.py +0 -0
  13. jaseci/extens/act_lib/date.py +0 -118
  14. jaseci/extens/act_lib/elastic.py +0 -87
  15. jaseci/extens/act_lib/file.py +0 -77
  16. jaseci/extens/act_lib/file_handler.py +0 -190
  17. jaseci/extens/act_lib/internal.py +0 -19
  18. jaseci/extens/act_lib/jaseci.py +0 -62
  19. jaseci/extens/act_lib/mail.py +0 -10
  20. jaseci/extens/act_lib/maths.py +0 -168
  21. jaseci/extens/act_lib/net.py +0 -192
  22. jaseci/extens/act_lib/rand.py +0 -83
  23. jaseci/extens/act_lib/regex.py +0 -85
  24. jaseci/extens/act_lib/request.py +0 -170
  25. jaseci/extens/act_lib/std.py +0 -236
  26. jaseci/extens/act_lib/storage.py +0 -53
  27. jaseci/extens/act_lib/stripe.py +0 -338
  28. jaseci/extens/act_lib/task.py +0 -14
  29. jaseci/extens/act_lib/tests/__init__.py +0 -0
  30. jaseci/extens/act_lib/tests/std_test_code.py +0 -37
  31. jaseci/extens/act_lib/tests/test_date.py +0 -26
  32. jaseci/extens/act_lib/tests/test_elastic.py +0 -159
  33. jaseci/extens/act_lib/tests/test_file.py +0 -116
  34. jaseci/extens/act_lib/tests/test_file_lib.py +0 -40
  35. jaseci/extens/act_lib/tests/test_mail_lib.py +0 -33
  36. jaseci/extens/act_lib/tests/test_maths.py +0 -147
  37. jaseci/extens/act_lib/tests/test_net_lib.py +0 -62
  38. jaseci/extens/act_lib/tests/test_regex.py +0 -61
  39. jaseci/extens/act_lib/tests/test_std.py +0 -51
  40. jaseci/extens/act_lib/tests/test_std_lib.py +0 -36
  41. jaseci/extens/act_lib/tests/test_url.py +0 -32
  42. jaseci/extens/act_lib/tests/test_vector.py +0 -36
  43. jaseci/extens/act_lib/tests/test_webtool.py +0 -44
  44. jaseci/extens/act_lib/tests/test_zlib.py +0 -24
  45. jaseci/extens/act_lib/url.py +0 -80
  46. jaseci/extens/act_lib/vector.py +0 -158
  47. jaseci/extens/act_lib/webtool.py +0 -29
  48. jaseci/extens/act_lib/zip.py +0 -34
  49. jaseci/extens/api/__init__.py +0 -0
  50. jaseci/extens/api/actions_api.py +0 -171
  51. jaseci/extens/api/alias_api.py +0 -140
  52. jaseci/extens/api/architype_api.py +0 -197
  53. jaseci/extens/api/config_api.py +0 -129
  54. jaseci/extens/api/global_api.py +0 -85
  55. jaseci/extens/api/graph_api.py +0 -168
  56. jaseci/extens/api/health_api.py +0 -21
  57. jaseci/extens/api/interface.py +0 -269
  58. jaseci/extens/api/jac_api.py +0 -172
  59. jaseci/extens/api/jsorc_api.py +0 -317
  60. jaseci/extens/api/logger_api.py +0 -90
  61. jaseci/extens/api/master_api.py +0 -134
  62. jaseci/extens/api/object_api.py +0 -102
  63. jaseci/extens/api/prometheus_api.py +0 -75
  64. jaseci/extens/api/queue_api.py +0 -141
  65. jaseci/extens/api/sentinel_api.py +0 -271
  66. jaseci/extens/api/share_api.py +0 -64
  67. jaseci/extens/api/super_api.py +0 -65
  68. jaseci/extens/api/tests/__init__.py +0 -0
  69. jaseci/extens/api/tests/test_architype_api.py +0 -66
  70. jaseci/extens/api/tests/test_global_api.py +0 -179
  71. jaseci/extens/api/tests/test_graph_api.py +0 -64
  72. jaseci/extens/api/tests/test_logger_api.py +0 -43
  73. jaseci/extens/api/tests/test_object_api.py +0 -20
  74. jaseci/extens/api/tests/test_sentinel_api.py +0 -66
  75. jaseci/extens/api/tests/test_uncommon.py +0 -107
  76. jaseci/extens/api/tests/test_user_api.py +0 -32
  77. jaseci/extens/api/tests/test_walker_api.py +0 -316
  78. jaseci/extens/api/user_api.py +0 -166
  79. jaseci/extens/api/walker_api.py +0 -299
  80. jaseci/extens/api/webhook_api.py +0 -77
  81. jaseci/extens/svc/__init__.py +0 -0
  82. jaseci/extens/svc/elastic_svc.py +0 -366
  83. jaseci/extens/svc/kube_svc.py +0 -432
  84. jaseci/extens/svc/mail_svc.py +0 -156
  85. jaseci/extens/svc/prome_svc.py +0 -378
  86. jaseci/extens/svc/redis_svc.py +0 -63
  87. jaseci/extens/svc/storage_svc.py +0 -193
  88. jaseci/extens/svc/stripe_svc.py +0 -51
  89. jaseci/extens/svc/task_svc.py +0 -155
  90. jaseci/extens/svc/tasks.py +0 -302
  91. jaseci/jac/__init__.py +0 -0
  92. jaseci/jac/interpreter/__init__.py +0 -0
  93. jaseci/jac/interpreter/architype_interp.py +0 -219
  94. jaseci/jac/interpreter/interp.py +0 -1784
  95. jaseci/jac/interpreter/sentinel_interp.py +0 -260
  96. jaseci/jac/interpreter/tests/__init__.py +0 -0
  97. jaseci/jac/interpreter/tests/test_interp.py +0 -42
  98. jaseci/jac/interpreter/walker_interp.py +0 -249
  99. jaseci/jac/ir/__init__.py +0 -0
  100. jaseci/jac/ir/ast.py +0 -73
  101. jaseci/jac/ir/ast_builder.py +0 -249
  102. jaseci/jac/ir/jac_code.py +0 -151
  103. jaseci/jac/ir/passes/__init__.py +0 -6
  104. jaseci/jac/ir/passes/ast_prune_pass.py +0 -9
  105. jaseci/jac/ir/passes/codegen_pass.py +0 -244
  106. jaseci/jac/ir/passes/ir_pass.py +0 -29
  107. jaseci/jac/ir/passes/printer_pass.py +0 -23
  108. jaseci/jac/ir/passes/pt_prune_pass.py +0 -29
  109. jaseci/jac/ir/passes/schedule.py +0 -23
  110. jaseci/jac/ir/passes/stats_pass.py +0 -16
  111. jaseci/jac/jac.g4 +0 -450
  112. jaseci/jac/jac_parse/__init__.py +0 -0
  113. jaseci/jac/jac_parse/jacLexer.py +0 -809
  114. jaseci/jac/jac_parse/jacListener.py +0 -853
  115. jaseci/jac/jac_parse/jacParser.py +0 -9192
  116. jaseci/jac/jac_set.py +0 -120
  117. jaseci/jac/jsci_vm/__init__.py +0 -0
  118. jaseci/jac/jsci_vm/disasm.py +0 -94
  119. jaseci/jac/jsci_vm/inst_ptr.py +0 -31
  120. jaseci/jac/jsci_vm/machine.py +0 -188
  121. jaseci/jac/jsci_vm/op_codes.py +0 -82
  122. jaseci/jac/jsci_vm/tests/__init__.py +0 -0
  123. jaseci/jac/jsci_vm/tests/test_codegen.py +0 -31
  124. jaseci/jac/machine/__init__.py +0 -0
  125. jaseci/jac/machine/jac_scope.py +0 -86
  126. jaseci/jac/machine/jac_value.py +0 -227
  127. jaseci/jac/machine/machine_state.py +0 -386
  128. jaseci/jac/tests/__init__.py +0 -0
  129. jaseci/jac/tests/book_code.py +0 -624
  130. jaseci/jac/tests/test_book.py +0 -380
  131. jaseci/jac/tests/test_lang_14.py +0 -49
  132. jaseci/jsorc/__init__.py +0 -7
  133. jaseci/jsorc/jsorc.py +0 -642
  134. jaseci/jsorc/jsorc_settings.py +0 -211
  135. jaseci/jsorc/jsorc_utils.py +0 -298
  136. jaseci/jsorc/live_actions.py +0 -365
  137. jaseci/jsorc/manifests/__init__.py +0 -0
  138. jaseci/jsorc/manifests/database.yaml +0 -109
  139. jaseci/jsorc/manifests/elastic.yaml +0 -6029
  140. jaseci/jsorc/manifests/prometheus.yaml +0 -1383
  141. jaseci/jsorc/manifests/redis.yaml +0 -64
  142. jaseci/jsorc/memory.py +0 -258
  143. jaseci/jsorc/redis.py +0 -140
  144. jaseci/jsorc/remote_actions.py +0 -158
  145. jaseci/jsorc/tests/__init__.py +0 -0
  146. jaseci/jsorc/tests/test_actions.py +0 -542
  147. jaseci/jsorc/tests/test_jsorc.py +0 -112
  148. jaseci/prim/__init__.py +0 -0
  149. jaseci/prim/ability.py +0 -94
  150. jaseci/prim/architype.py +0 -90
  151. jaseci/prim/edge.py +0 -173
  152. jaseci/prim/element.py +0 -233
  153. jaseci/prim/graph.py +0 -27
  154. jaseci/prim/master.py +0 -67
  155. jaseci/prim/node.py +0 -533
  156. jaseci/prim/obj_mixins.py +0 -238
  157. jaseci/prim/sentinel.py +0 -282
  158. jaseci/prim/super_master.py +0 -31
  159. jaseci/prim/walker.py +0 -261
  160. jaseci/svc/__init__.py +0 -0
  161. jaseci/tests/__init__.py +0 -0
  162. jaseci/tests/infer.py +0 -39
  163. jaseci/tests/jac_test_code.py +0 -1293
  164. jaseci/tests/jac_test_progs.py +0 -774
  165. jaseci/tests/test_core.py +0 -153
  166. jaseci/tests/test_jac.py +0 -824
  167. jaseci/tests/test_node.py +0 -89
  168. jaseci/tests/test_progs.py +0 -702
  169. jaseci/tests/test_stack.py +0 -220
  170. jaseci/tests/test_stripe.py +0 -225
  171. jaseci/utils/__init__.py +0 -0
  172. jaseci/utils/actions/__init__.py +0 -0
  173. jaseci/utils/actions/actions_manager.py +0 -254
  174. jaseci/utils/actions/actions_optimizer.py +0 -517
  175. jaseci/utils/actions/actions_state.py +0 -95
  176. jaseci/utils/file_handler.py +0 -171
  177. jaseci/utils/gprof2dot.py +0 -3786
  178. jaseci/utils/id_list.py +0 -169
  179. jaseci/utils/json_handler.py +0 -70
  180. jaseci/utils/log_utils.py +0 -57
  181. jaseci/utils/test_core.py +0 -62
  182. jaseci/utils/utils.py +0 -387
  183. jaseci-1.4.2.6.dist-info/LICENSE +0 -21
  184. jaseci-1.4.2.6.dist-info/METADATA +0 -39
  185. jaseci-1.4.2.6.dist-info/RECORD +0 -185
  186. jaseci-1.4.2.6.dist-info/entry_points.txt +0 -3
  187. jaseci-1.4.2.6.dist-info/top_level.txt +0 -1
@@ -1,227 +0,0 @@
1
- """
2
- Variable manager for Jac
3
-
4
- Representations for all jac runtime variables
5
- """
6
-
7
- from jaseci.prim.element import Element
8
- from jaseci.prim.obj_mixins import Anchored
9
- from jaseci.prim.node import Node
10
- from jaseci.prim.edge import Edge
11
- from jaseci.prim.graph import Graph
12
- from jaseci.jac.jac_set import JacSet
13
- import uuid
14
-
15
- NoneType = type(None)
16
-
17
-
18
- class JacType:
19
- STR = "JAC_TYPE.STR"
20
- INT = "JAC_TYPE.INT"
21
- FLOAT = "JAC_TYPE.FLOAT"
22
- LIST = "JAC_TYPE.LIST"
23
- DICT = "JAC_TYPE.DICT"
24
- BOOL = "JAC_TYPE.BOOL"
25
- NODE = "JAC_TYPE.NODE"
26
- EDGE = "JAC_TYPE.EDGE"
27
- TYPE = "JAC_TYPE.TYPE"
28
- NULL = "JAC_TYPE.NULL"
29
-
30
-
31
- def jac_type_wrap(val):
32
- if isinstance(val, type):
33
- if val == str:
34
- val = JacType.STR
35
- elif val == int:
36
- val = JacType.INT
37
- elif val == float:
38
- val = JacType.FLOAT
39
- elif val == list:
40
- val = JacType.LIST
41
- elif val == JacSet:
42
- val = JacType.LIST
43
- elif val == dict:
44
- val = JacType.DICT
45
- elif val == bool:
46
- val = JacType.BOOL
47
- elif val in [Node, Graph]:
48
- val = JacType.NODE
49
- elif val == Edge:
50
- val = JacType.EDGE
51
- elif val == type:
52
- val = JacType.TYPE
53
- elif val == NoneType:
54
- val = JacType.NULL
55
- return val
56
-
57
-
58
- def jac_type_unwrap(val):
59
- if type(val) == str and val.startswith("JAC_TYPE."):
60
- if val == JacType.STR:
61
- val = str
62
- elif val == JacType.INT:
63
- val = int
64
- elif val == JacType.FLOAT:
65
- val = float
66
- elif val == JacType.LIST:
67
- val = list
68
- elif val == JacType.DICT:
69
- val = dict
70
- elif val == JacType.BOOL:
71
- val = bool
72
- elif val == JacType.NODE:
73
- val = Node
74
- elif val == JacType.EDGE:
75
- val = Edge
76
- elif val == JacType.TYPE:
77
- val = type
78
- elif val == JacType.NULL:
79
- val = NoneType
80
- return val
81
-
82
-
83
- def is_jac_elem(val):
84
- """Test if value is jac element"""
85
- return type(val) == str and val.startswith("jac:uuid:")
86
-
87
-
88
- def jac_elem_wrap(val, serialize_mode=False):
89
- if serialize_mode:
90
- if isinstance(val, Anchored):
91
- val.context = jac_wrap_value(val.context)
92
- val = val.serialize()
93
- else:
94
- val = val.jid.replace("urn", "jac")
95
- return val
96
-
97
-
98
- def jac_elem_unwrap(val, parent):
99
- val = parent._h.get_obj(parent._m_id, val.replace("jac", "urn"))
100
- return val
101
-
102
-
103
- def jac_wrap_value(val, serialize_mode=False):
104
- """converts all elements to uuids in lists etc"""
105
- val = jac_type_wrap(val)
106
- if isinstance(val, Element):
107
- val = jac_elem_wrap(val, serialize_mode=serialize_mode)
108
- elif isinstance(val, JacSet):
109
- val = jac_wrap_value(list(val), serialize_mode)
110
- elif isinstance(val, list):
111
- for i in range(len(val)):
112
- val[i] = jac_wrap_value(val[i], serialize_mode)
113
- elif isinstance(val, dict):
114
- for i in val.keys():
115
- val[i] = jac_wrap_value(val[i], serialize_mode)
116
- return val
117
-
118
-
119
- def jac_unwrap_value(val, parent):
120
- """Reference to variables value"""
121
- if is_jac_elem(val):
122
- val = jac_elem_unwrap(val, parent=parent)
123
- elif isinstance(val, list):
124
- for i in range(len(val)):
125
- val[i] = jac_unwrap_value(val[i], parent=parent)
126
- elif isinstance(val, dict):
127
- for i in val.keys():
128
- val[i] = jac_unwrap_value(val[i], parent=parent)
129
- return jac_type_unwrap(val)
130
-
131
-
132
- class JacValue:
133
- """
134
- A reference to a variable in context dict that is common for elements
135
- """
136
-
137
- def __init__(
138
- self, parent, value=None, ctx=None, name=None, end=None, create_mode=False
139
- ):
140
- """
141
- Abstraction of all Jac types, ctx and name serve as obj[key/idx]
142
- end is for idx ranges for list slices
143
- """
144
- self.parent = parent
145
- self.ctx = ctx
146
- self.is_element = False
147
- self.name = name
148
- self.end = end
149
- self.value = self.setup_value(value, create_mode=create_mode)
150
-
151
- def setup_value(self, value, create_mode):
152
- if isinstance(self.ctx, Element):
153
- self.is_element = self.ctx
154
- if self.parent._assign_mode:
155
- self.is_element.save()
156
- self.ctx = self.ctx.context
157
- if value is not None:
158
- return value
159
- elif self.ctx is not None and self.name is not None:
160
- if self.end is not None:
161
- return self.ctx[self.name : self.end]
162
- elif type(self.name) == int or self.name in self.ctx.keys():
163
- return self.ctx[self.name]
164
- elif (
165
- not self.parent._assign_mode
166
- and not create_mode
167
- and (
168
- not self.is_element
169
- or self.name not in self.is_element.get_architype().has_vars
170
- )
171
- ):
172
- self.parent.rt_error(
173
- f"Key {self.name} not found in object/dict.",
174
- self.parent._cur_jac_ast,
175
- )
176
- else:
177
- return None
178
-
179
- def write(self, jac_ast, force=False):
180
- if (
181
- not force
182
- and self.is_element
183
- and self.name not in self.ctx.keys()
184
- and self.name not in self.is_element.get_architype().has_vars
185
- ):
186
- self.parent.rt_error(
187
- f"Creating variable {self.name} in graph "
188
- f"element {type(self.is_element)} is not allowed, "
189
- "please define",
190
- jac_ast,
191
- )
192
- elif self.ctx is None or self.name is None:
193
- self.parent.rt_error(
194
- f"No valid live variable! ctx: {self.ctx} name: {self.name}", jac_ast
195
- )
196
- elif self.end is not None:
197
- self.ctx[self.name : self.end] = self.value
198
- else:
199
- self.ctx[self.name] = self.value
200
-
201
- def check_assignable(self, jac_ast=None):
202
- if self.ctx is None:
203
- self.parent.rt_error("Cannot assign to this value", jac_ast)
204
- return False
205
- return True
206
-
207
- def self_destruct(self, jac_ast):
208
- if self.is_element and self.name in self.ctx.keys():
209
- self.ctx[self.name] = None # assumes interp has destroyed element
210
- elif self.ctx is not None:
211
- try:
212
- del self.ctx[self.name]
213
- except Exception as e:
214
- self.parent.rt_error(f"{e}", jac_ast)
215
- else:
216
- self.parent.rt_error(
217
- f"{self.value} is not destroyable, try setting to null", jac_ast
218
- )
219
-
220
- def jac_type(self):
221
- """Return Jac type of value"""
222
- return jac_type_wrap(type(self.value))
223
-
224
- def __str__(self):
225
- return (
226
- "JacValue:" + str(self.ctx) + ":" + str(self.name) + ":" + str(self.value)
227
- )
@@ -1,386 +0,0 @@
1
- """
2
- Interpreter for jac code in AST form
3
-
4
- This interpreter should be inhereted from the class that manages state
5
- referenced through self.
6
- """
7
-
8
- from copy import copy
9
- from jaseci.utils.utils import logger, exc_stack_as_str_list, generate_stack_as_str_list
10
- from jaseci.jsorc.live_actions import live_actions, load_preconfig_actions
11
-
12
- # from jaseci.actions.find_action import find_action
13
- from jaseci.prim.element import Element
14
-
15
- from jaseci.jac.jac_set import JacSet
16
- from jaseci.jac.machine.jac_scope import JacScope
17
- from jaseci.utils.id_list import IdList
18
- from jaseci.jac.ir.ast import Ast
19
- from jaseci.prim.edge import Edge
20
- from jaseci.prim.node import Node
21
- from jaseci.jac.machine.jac_value import JacValue
22
- from jaseci.jac.jsci_vm.op_codes import JsCmp
23
- import time
24
-
25
-
26
- class MachineState:
27
- """Shared interpreter class across both sentinels and walkers"""
28
-
29
- recur_detect_set = []
30
- profile_stack = [None]
31
-
32
- def __init__(self):
33
- self.report = []
34
- self.report_status = None
35
- self.report_custom = None
36
- self.report_file = None
37
- self.request_context = None
38
- self.runtime_errors = []
39
- self.runtime_stack_trace = []
40
- self.yielded_walkers_ids = IdList(self)
41
- self.ignore_node_ids = IdList(self)
42
- self._scope_stack = [None]
43
- self._jac_scope = None
44
- self._relevant_edges = []
45
- self._loop_ctrl = None
46
- self._stopped = None
47
- self._assign_mode = False
48
- self._jac_try_mode = 0 # 0 is false, +=1 for each nested try
49
- self._loop_limit = 10000
50
- self._cur_jac_ast = Ast("none")
51
- self._write_candidate = None
52
- self._mast = self.get_master()
53
-
54
- self.inform_hook()
55
-
56
- def inform_hook(self):
57
- if hasattr(self, "_h"):
58
- self._h._machine = self
59
-
60
- def reset(self):
61
- self.report = []
62
- self.report_status = None
63
- self.report_custom = None
64
- self.report_file = None
65
- self.runtime_errors = []
66
- self.runtime_stack_trace = []
67
- self._scope_stack = [None]
68
- self._jac_scope = None
69
- self._loop_ctrl = None
70
- self._stopped = None
71
-
72
- def push_scope(self, scope: JacScope):
73
- self.profile_pause()
74
- self._scope_stack.append(scope)
75
- self._jac_scope = scope
76
- MachineState.profile_stack.append(self._jac_scope)
77
- self.profile_in()
78
- MachineState.recur_detect_set.append(self.call_name())
79
-
80
- def pop_scope(self):
81
- MachineState.recur_detect_set.remove(self.call_name())
82
- self.profile_out()
83
- self._scope_stack.pop()
84
- self._jac_scope = self._scope_stack[-1]
85
- MachineState.profile_stack.pop()
86
- self.profile_unpause()
87
-
88
- def profile_in(self):
89
- if self._mast and self._mast._profiling:
90
- self._jac_scope._start_time = time.time()
91
- self._jac_scope._cum_start_time = time.time()
92
-
93
- def profile_out(self):
94
- # profile_jac_scope = MachineState.profile_stack[-1] # refactor and clean
95
- if self._mast and self._mast._profiling:
96
- name = self.call_name()
97
- if name not in self._mast._jac_profile:
98
- self._mast._jac_profile[name] = {
99
- "calls": 1,
100
- "u_calls": 0 if name in MachineState.recur_detect_set else 1,
101
- "tot_time": self._jac_scope._total_time
102
- + (time.time() - self._jac_scope._start_time),
103
- "cum_time": (
104
- 0
105
- if name in MachineState.recur_detect_set
106
- else time.time() - self._jac_scope._cum_start_time
107
- ),
108
- }
109
- else:
110
- c = self._mast._jac_profile[name]["calls"]
111
- u = self._mast._jac_profile[name]["u_calls"]
112
- t = self._mast._jac_profile[name]["tot_time"]
113
- p = self._mast._jac_profile[name]["cum_time"]
114
- self._mast._jac_profile[name]["calls"] = c + 1
115
- self._mast._jac_profile[name]["u_calls"] = (
116
- u if name in MachineState.recur_detect_set else u + 1
117
- )
118
- self._mast._jac_profile[name][
119
- "tot_time"
120
- ] += self._jac_scope._total_time + (
121
- time.time() - self._jac_scope._start_time
122
- )
123
-
124
- self._mast._jac_profile[name]["cum_time"] = (
125
- p
126
- if name in MachineState.recur_detect_set
127
- else (p + time.time() - self._jac_scope._cum_start_time)
128
- )
129
-
130
- def call_name(self):
131
- return f"{self.kind}::{self.name}:{self._jac_scope.name}"
132
-
133
- def profile_pause(self):
134
- _jac_scope = MachineState.profile_stack[-1] # refactor and clean
135
- if self._mast and self._mast._profiling and _jac_scope:
136
- _jac_scope._total_time += time.time() - _jac_scope._start_time
137
- _jac_scope._start_time = 0
138
-
139
- def profile_unpause(self):
140
- _jac_scope = MachineState.profile_stack[-1] # refactor and clean
141
- if self._mast and self._mast._profiling and _jac_scope:
142
- _jac_scope._start_time = time.time()
143
-
144
- def here(self):
145
- return self._scope_stack[-1].here() if self._scope_stack[-1] else None
146
-
147
- def visitor(self):
148
- return self._scope_stack[-1].visitor() if self._scope_stack[-1] else None
149
-
150
- def set_cur_ast(self, jac_ast):
151
- self._cur_jac_ast = jac_ast
152
- return jac_ast.kid
153
-
154
- def destroy(self):
155
- """
156
- Destroys self from memory and persistent storage
157
- """
158
- for i in self.yielded_walkers_ids.obj_list():
159
- i.destroy()
160
-
161
- # Core State Management ##################
162
- def load_variable(self, name, assign_mode=None, jac_ast=None):
163
- val = self._jac_scope.get_live_var(
164
- name, create_mode=self._assign_mode if assign_mode is None else assign_mode
165
- )
166
- if val is None:
167
- self.rt_error(
168
- f"Variable not defined - {name}", jac_ast or self._cur_jac_ast
169
- )
170
- else:
171
- self.push(val)
172
-
173
- def candidate_writethrough(self):
174
- if self._write_candidate:
175
- self._write_candidate.save()
176
- self._write_candidate = None
177
-
178
- def perform_assignment(self, dest, src, jac_ast=None):
179
- if dest.check_assignable(jac_ast):
180
- dest.value = src.value
181
- dest.write(jac_ast)
182
- self.push(dest)
183
-
184
- def perform_copy_fields(self, dest, src, jac_ast=None):
185
- if dest.check_assignable(jac_ast):
186
- if not self.rt_check_type(dest.value, [Node, Edge], jac_ast):
187
- self.rt_error("Copy fields only applies to nodes and edges", jac_ast)
188
- if dest.value.name != src.value.name:
189
- self.rt_error(
190
- f"Node/edge arch {dest.value} don't match {src.value}!", jac_ast
191
- )
192
- for i in src.value.context.keys():
193
- if i in dest.value.context.keys():
194
- JacValue(
195
- self, ctx=dest.value, name=i, value=src.value.context[i]
196
- ).write(jac_ast)
197
- self.push(dest)
198
-
199
- def perform_increment(self, dest, src, op, jac_ast=None):
200
- if op == JsCmp.PEQ:
201
- dest.value = dest.value + src.value
202
- elif op == JsCmp.MEQ:
203
- dest.value = dest.value - src.value
204
- elif op == JsCmp.TEQ:
205
- dest.value = dest.value * src.value
206
- elif op == JsCmp.DEQ:
207
- dest.value = dest.value / src.value
208
- dest.write(jac_ast)
209
- self.push(dest)
210
-
211
- # Helper Functions ##################
212
-
213
- def inherit_runtime_state(self, mach):
214
- """Inherits runtime output state from another machine"""
215
- self.report += mach.report
216
- mach.report = []
217
- if mach.report_status:
218
- self.report_status = mach.report_status
219
- mach.report_status = None
220
- if mach.report_custom:
221
- self.report_custom = mach.report_custom
222
- mach.report_custom = None
223
- if mach.report_file:
224
- self.report_file = mach.report_file
225
- mach.report_file = None
226
- self.runtime_errors += mach.runtime_errors
227
- mach.runtime_errors = []
228
- mach.runtime_stack_trace = []
229
- mach._loop_ctrl = None
230
- mach._stopped = None
231
-
232
- def obj_set_to_jac_set(self, obj_set):
233
- """
234
- Returns nodes jac_set from edge jac_set from current node
235
- """
236
- ret = JacSet()
237
- for i in obj_set:
238
- ret.add_obj(i)
239
- return ret
240
-
241
- def edge_to_node_jac_set(self, edge_set, location=None):
242
- """
243
- Returns nodes jac_set from edge jac_set from current node
244
- """
245
- ret = JacSet()
246
- if not location:
247
- location = self.here()
248
- for i in edge_set.obj_list():
249
- ret.add_obj(i.opposing_node(location))
250
- return ret
251
-
252
- def edges_filter_on_nodes(self, edge_set, node_set):
253
- """
254
- Returns nodes jac_set from edge jac_set from current node
255
- """
256
- ret = JacSet()
257
- for i in edge_set.obj_list():
258
- for j in node_set.obj_list():
259
- if i.jid in j.smart_edge_list:
260
- ret.add_obj(i)
261
- break
262
- return ret
263
-
264
- def check_builtin_action(self, func_name, jac_ast=None):
265
- """
266
- Takes reference to action attr, finds the built in function
267
- and returns new name used as hook by action class
268
- """
269
- if func_name not in live_actions.keys():
270
- self.rt_warn(f"Attempting auto-load for {func_name}", jac_ast)
271
- load_preconfig_actions(self._h)
272
- if func_name not in live_actions.keys():
273
- self.rt_warn(f"Builtin action unable to be loaded - {func_name}", jac_ast)
274
- return False
275
- return True
276
-
277
- def jac_try_exception(self, e: Exception, jac_ast):
278
- if isinstance(e, TryException):
279
- raise e
280
- else:
281
- raise TryException(self.jac_exception(e, jac_ast))
282
-
283
- def jac_exception(self, e: Exception, jac_ast):
284
- return {
285
- "type": type(e).__name__,
286
- "mod": jac_ast.loc[2],
287
- "msg": str(e),
288
- "args": e.args,
289
- "line": jac_ast.loc[0],
290
- "col": jac_ast.loc[1],
291
- "name": self.name if hasattr(self, "name") else "blank",
292
- "rule": jac_ast.name,
293
- "stack_trace": exc_stack_as_str_list(),
294
- }
295
-
296
- def rt_log_str(self, msg, jac_ast=None):
297
- """Generates string for screen output"""
298
- if jac_ast is None:
299
- jac_ast = self._cur_jac_ast
300
- name = self.name if hasattr(self, "name") else "blank"
301
- if jac_ast:
302
- msg = (
303
- f"{jac_ast.loc[2]}:{name} - line {jac_ast.loc[0]}, "
304
- + f"col {jac_ast.loc[1]} - rule {jac_ast.name} - {msg}"
305
- )
306
- else:
307
- msg = f"{msg}"
308
- return msg
309
-
310
- def rt_warn(self, error, jac_ast=None):
311
- """Prints runtime error to screen"""
312
- error = self.rt_log_str(error, jac_ast)
313
- logger.warning(str(error))
314
-
315
- def rt_subtle_error(self, error, jac_ast=None):
316
- error = self.rt_log_str(error, jac_ast)
317
- logger.error(str(error))
318
- self.runtime_errors.append(error)
319
-
320
- def rt_error(self, error, jac_ast, append=False):
321
- """Prints runtime error to screen"""
322
-
323
- if isinstance(error, Exception):
324
- if self._jac_try_mode:
325
- self.jac_try_exception(error, jac_ast)
326
- else:
327
- if append:
328
- msg = self.rt_log_str(error, jac_ast)
329
- logger.error(msg)
330
- self.runtime_errors.append(msg)
331
- raise error
332
- else:
333
- if self._jac_try_mode:
334
- raise TryException(
335
- {
336
- "type": "RunTimeException",
337
- "mod": jac_ast.loc[2],
338
- "msg": error,
339
- "args": [],
340
- "line": jac_ast.loc[0],
341
- "col": jac_ast.loc[1],
342
- "name": self.name if hasattr(self, "name") else "blank",
343
- "rule": jac_ast.name,
344
- "stack_trace": generate_stack_as_str_list(error),
345
- }
346
- )
347
- else:
348
- msg = self.rt_log_str(error, jac_ast)
349
- logger.error(msg)
350
- self.runtime_errors.append(msg)
351
- error = Exception(error)
352
- raise error
353
-
354
- def rt_info(self, msg, jac_ast=None):
355
- """Prints runtime info to screen"""
356
- logger.info(str(self.rt_log_str(msg, jac_ast)))
357
-
358
- def rt_check_type(self, obj, typ, jac_ast=None):
359
- """Prints error if type mismatach"""
360
- if not isinstance(typ, list):
361
- typ = [typ]
362
- for i in typ:
363
- if isinstance(obj, i):
364
- return True
365
- self.rt_error(
366
- f"Incompatible type for object "
367
- f"{obj} - {type(obj).__name__}, "
368
- f"expecting {typ}",
369
- jac_ast,
370
- )
371
-
372
- def get_info(self):
373
- return {
374
- "report": copy(self.report),
375
- "report_status": self.report_status,
376
- "report_custom": self.report_custom,
377
- "report_file": self.report_file,
378
- "request_context": self.request_context,
379
- "runtime_errors": self.runtime_errors,
380
- }
381
-
382
-
383
- class TryException(Exception):
384
- def __init__(self, ref: dict):
385
- super().__init__(ref["msg"])
386
- self.ref = ref
File without changes