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