from IPython.core.error import InputRejected
from casa_stack_manip import stack_find
__casa = stack_find('casa')
if __casa.has_key('state') and __casa['state'].has_key('init_version') and __casa['state']['init_version'] > 0:
def static_var(varname, value):
setattr(func, varname, value)
@static_var("builtin_dict", stack_find('casa_builtins','root'))
def register_builtin( obj ):
register_builtin.builtin_dict[obj] = True
elif isinstance(obj, list) and all(isinstance(elem, str) for elem in obj):
for b in obj: register_builtin.builtin_dict[b] = True
raise RuntimeError("parameter is not a string or list of strings")
class __check_builtin(ast.NodeTransformer):
"""prevent assignment to builtin values"""
self.casa_builtins = stack_find('casa_builtins','root')
def visit_FunctionDef(self, node):
def visit_Assign(self, node):
tgts = n.elts if isinstance(n,ast.Tuple) else [n]
if not isinstance(t,ast.Attribute) and \
not isinstance(t,ast.Subscript):
if __builtins__.has_key(t.id):
raise InputRejected("attempt to modify a python builtin value")
if self.casa_builtins.has_key(t.id):
raise InputRejected("attempt to modify a casa builtin value")
except InputRejected as ir:
print "-----------------------------------------------------------------"
print "internal error in CASA assignment filter..."
print traceback.format_exc()
print "-----------------------------------------------------------------"
def visit_Lambda(self, node):
@static_var("ip",get_ipython( ))
def enable_builtin_protection( ):
enable_builtin_protection.ip.ast_transformers.append(__check_builtin( ))
def enable_builtin_protection( ):
def register_builtin( obj ):
if not isinstance(obj,str) or not isinstance(obj, list) or not all(isinstance(elem, str) for elem in obj):
raise RuntimeError("parameter is not a string or list of strings")