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.
- jaseci/__init__.py +3 -37
- jaseci-2.0.0.dist-info/METADATA +65 -0
- jaseci-2.0.0.dist-info/RECORD +4 -0
- {jaseci-1.4.2.5.dist-info → jaseci-2.0.0.dist-info}/WHEEL +1 -2
- jaseci/VERSION +0 -1
- jaseci/cli_tools/__init__.py +0 -0
- jaseci/cli_tools/book_tools.py +0 -457
- jaseci/cli_tools/jsctl.py +0 -500
- jaseci/cli_tools/tests/__init__.py +0 -0
- jaseci/cli_tools/tests/test_jsctl.py +0 -556
- jaseci/extens/__init__.py +0 -0
- jaseci/extens/act_lib/__init__.py +0 -0
- jaseci/extens/act_lib/date.py +0 -117
- jaseci/extens/act_lib/elastic.py +0 -87
- jaseci/extens/act_lib/file.py +0 -76
- jaseci/extens/act_lib/file_handler.py +0 -189
- jaseci/extens/act_lib/internal.py +0 -18
- jaseci/extens/act_lib/jaseci.py +0 -61
- jaseci/extens/act_lib/mail.py +0 -10
- jaseci/extens/act_lib/maths.py +0 -168
- jaseci/extens/act_lib/net.py +0 -191
- jaseci/extens/act_lib/rand.py +0 -82
- jaseci/extens/act_lib/regex.py +0 -85
- jaseci/extens/act_lib/request.py +0 -169
- jaseci/extens/act_lib/std.py +0 -235
- jaseci/extens/act_lib/storage.py +0 -53
- jaseci/extens/act_lib/stripe.py +0 -337
- jaseci/extens/act_lib/task.py +0 -13
- jaseci/extens/act_lib/tests/__init__.py +0 -0
- jaseci/extens/act_lib/tests/std_test_code.py +0 -37
- jaseci/extens/act_lib/tests/test_date.py +0 -26
- jaseci/extens/act_lib/tests/test_elastic.py +0 -159
- jaseci/extens/act_lib/tests/test_file.py +0 -116
- jaseci/extens/act_lib/tests/test_file_lib.py +0 -40
- jaseci/extens/act_lib/tests/test_mail_lib.py +0 -33
- jaseci/extens/act_lib/tests/test_maths.py +0 -147
- jaseci/extens/act_lib/tests/test_net_lib.py +0 -62
- jaseci/extens/act_lib/tests/test_regex.py +0 -61
- jaseci/extens/act_lib/tests/test_std.py +0 -51
- jaseci/extens/act_lib/tests/test_std_lib.py +0 -36
- jaseci/extens/act_lib/tests/test_url.py +0 -32
- jaseci/extens/act_lib/tests/test_vector.py +0 -36
- jaseci/extens/act_lib/tests/test_webtool.py +0 -44
- jaseci/extens/act_lib/tests/test_zlib.py +0 -24
- jaseci/extens/act_lib/url.py +0 -79
- jaseci/extens/act_lib/vector.py +0 -157
- jaseci/extens/act_lib/webtool.py +0 -28
- jaseci/extens/act_lib/zip.py +0 -33
- jaseci/extens/api/__init__.py +0 -0
- jaseci/extens/api/actions_api.py +0 -170
- jaseci/extens/api/alias_api.py +0 -139
- jaseci/extens/api/architype_api.py +0 -196
- jaseci/extens/api/config_api.py +0 -129
- jaseci/extens/api/global_api.py +0 -84
- jaseci/extens/api/graph_api.py +0 -167
- jaseci/extens/api/health_api.py +0 -20
- jaseci/extens/api/interface.py +0 -268
- jaseci/extens/api/jac_api.py +0 -171
- jaseci/extens/api/jsorc_api.py +0 -316
- jaseci/extens/api/logger_api.py +0 -89
- jaseci/extens/api/master_api.py +0 -133
- jaseci/extens/api/object_api.py +0 -101
- jaseci/extens/api/prometheus_api.py +0 -74
- jaseci/extens/api/queue_api.py +0 -140
- jaseci/extens/api/sentinel_api.py +0 -270
- jaseci/extens/api/super_api.py +0 -64
- jaseci/extens/api/tests/__init__.py +0 -0
- jaseci/extens/api/tests/test_architype_api.py +0 -66
- jaseci/extens/api/tests/test_global_api.py +0 -179
- jaseci/extens/api/tests/test_graph_api.py +0 -64
- jaseci/extens/api/tests/test_logger_api.py +0 -43
- jaseci/extens/api/tests/test_object_api.py +0 -20
- jaseci/extens/api/tests/test_sentinel_api.py +0 -66
- jaseci/extens/api/tests/test_uncommon.py +0 -107
- jaseci/extens/api/tests/test_user_api.py +0 -32
- jaseci/extens/api/tests/test_walker_api.py +0 -316
- jaseci/extens/api/user_api.py +0 -144
- jaseci/extens/api/walker_api.py +0 -298
- jaseci/extens/api/webhook_api.py +0 -74
- jaseci/extens/svc/__init__.py +0 -0
- jaseci/extens/svc/elastic_svc.py +0 -366
- jaseci/extens/svc/kube_svc.py +0 -432
- jaseci/extens/svc/mail_svc.py +0 -156
- jaseci/extens/svc/prome_svc.py +0 -378
- jaseci/extens/svc/redis_svc.py +0 -63
- jaseci/extens/svc/storage_svc.py +0 -193
- jaseci/extens/svc/stripe_svc.py +0 -51
- jaseci/extens/svc/task_svc.py +0 -155
- jaseci/extens/svc/tasks.py +0 -302
- jaseci/jac/__init__.py +0 -0
- jaseci/jac/interpreter/__init__.py +0 -0
- jaseci/jac/interpreter/architype_interp.py +0 -214
- jaseci/jac/interpreter/interp.py +0 -1783
- jaseci/jac/interpreter/sentinel_interp.py +0 -257
- jaseci/jac/interpreter/tests/__init__.py +0 -0
- jaseci/jac/interpreter/tests/test_interp.py +0 -42
- jaseci/jac/interpreter/walker_interp.py +0 -248
- jaseci/jac/ir/__init__.py +0 -0
- jaseci/jac/ir/ast.py +0 -73
- jaseci/jac/ir/ast_builder.py +0 -249
- jaseci/jac/ir/jac_code.py +0 -152
- jaseci/jac/ir/passes/__init__.py +0 -6
- jaseci/jac/ir/passes/ast_prune_pass.py +0 -9
- jaseci/jac/ir/passes/codegen_pass.py +0 -244
- jaseci/jac/ir/passes/ir_pass.py +0 -29
- jaseci/jac/ir/passes/printer_pass.py +0 -23
- jaseci/jac/ir/passes/pt_prune_pass.py +0 -29
- jaseci/jac/ir/passes/schedule.py +0 -23
- jaseci/jac/ir/passes/stats_pass.py +0 -16
- jaseci/jac/jac.g4 +0 -450
- jaseci/jac/jac_parse/__init__.py +0 -0
- jaseci/jac/jac_parse/jacLexer.py +0 -809
- jaseci/jac/jac_parse/jacListener.py +0 -853
- jaseci/jac/jac_parse/jacParser.py +0 -9192
- jaseci/jac/jac_set.py +0 -119
- jaseci/jac/jsci_vm/__init__.py +0 -0
- jaseci/jac/jsci_vm/disasm.py +0 -94
- jaseci/jac/jsci_vm/inst_ptr.py +0 -31
- jaseci/jac/jsci_vm/machine.py +0 -188
- jaseci/jac/jsci_vm/op_codes.py +0 -82
- jaseci/jac/jsci_vm/tests/__init__.py +0 -0
- jaseci/jac/jsci_vm/tests/test_codegen.py +0 -31
- jaseci/jac/machine/__init__.py +0 -0
- jaseci/jac/machine/jac_scope.py +0 -85
- jaseci/jac/machine/jac_value.py +0 -226
- jaseci/jac/machine/machine_state.py +0 -383
- jaseci/jac/tests/__init__.py +0 -0
- jaseci/jac/tests/book_code.py +0 -624
- jaseci/jac/tests/test_book.py +0 -380
- jaseci/jac/tests/test_lang_14.py +0 -49
- jaseci/jsorc/__init__.py +0 -7
- jaseci/jsorc/jsorc.py +0 -642
- jaseci/jsorc/jsorc_settings.py +0 -211
- jaseci/jsorc/jsorc_utils.py +0 -298
- jaseci/jsorc/live_actions.py +0 -364
- jaseci/jsorc/manifests/__init__.py +0 -0
- jaseci/jsorc/manifests/database.yaml +0 -109
- jaseci/jsorc/manifests/elastic.yaml +0 -6024
- jaseci/jsorc/manifests/prometheus.yaml +0 -1383
- jaseci/jsorc/manifests/redis.yaml +0 -64
- jaseci/jsorc/memory.py +0 -258
- jaseci/jsorc/redis.py +0 -139
- jaseci/jsorc/remote_actions.py +0 -157
- jaseci/jsorc/tests/__init__.py +0 -0
- jaseci/jsorc/tests/test_actions.py +0 -542
- jaseci/jsorc/tests/test_jsorc.py +0 -112
- jaseci/prim/__init__.py +0 -0
- jaseci/prim/ability.py +0 -93
- jaseci/prim/architype.py +0 -89
- jaseci/prim/edge.py +0 -172
- jaseci/prim/element.py +0 -233
- jaseci/prim/graph.py +0 -26
- jaseci/prim/master.py +0 -64
- jaseci/prim/node.py +0 -532
- jaseci/prim/obj_mixins.py +0 -235
- jaseci/prim/sentinel.py +0 -281
- jaseci/prim/super_master.py +0 -31
- jaseci/prim/walker.py +0 -261
- jaseci/svc/__init__.py +0 -0
- jaseci/tests/__init__.py +0 -0
- jaseci/tests/infer.py +0 -39
- jaseci/tests/jac_test_code.py +0 -1293
- jaseci/tests/jac_test_progs.py +0 -774
- jaseci/tests/test_core.py +0 -153
- jaseci/tests/test_jac.py +0 -824
- jaseci/tests/test_node.py +0 -89
- jaseci/tests/test_progs.py +0 -702
- jaseci/tests/test_stack.py +0 -220
- jaseci/tests/test_stripe.py +0 -225
- jaseci/utils/__init__.py +0 -0
- jaseci/utils/actions/__init__.py +0 -0
- jaseci/utils/actions/actions_manager.py +0 -254
- jaseci/utils/actions/actions_optimizer.py +0 -516
- jaseci/utils/actions/actions_state.py +0 -95
- jaseci/utils/file_handler.py +0 -171
- jaseci/utils/gprof2dot.py +0 -3786
- jaseci/utils/id_list.py +0 -168
- jaseci/utils/json_handler.py +0 -70
- jaseci/utils/log_utils.py +0 -57
- jaseci/utils/test_core.py +0 -62
- jaseci/utils/utils.py +0 -387
- jaseci-1.4.2.5.dist-info/LICENSE +0 -21
- jaseci-1.4.2.5.dist-info/METADATA +0 -39
- jaseci-1.4.2.5.dist-info/RECORD +0 -184
- jaseci-1.4.2.5.dist-info/entry_points.txt +0 -3
- jaseci-1.4.2.5.dist-info/top_level.txt +0 -1
jaseci/jac/machine/jac_value.py
DELETED
|
@@ -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
|
jaseci/jac/tests/__init__.py
DELETED
|
File without changes
|