diff options
Diffstat (limited to 'module/lib')
| -rw-r--r-- | module/lib/Getch.py | 76 | ||||
| -rw-r--r-- | module/lib/SafeEval.py | 70 | ||||
| -rw-r--r-- | module/lib/Unzip.py | 50 | 
3 files changed, 196 insertions, 0 deletions
| diff --git a/module/lib/Getch.py b/module/lib/Getch.py new file mode 100644 index 000000000..22b7ea7f8 --- /dev/null +++ b/module/lib/Getch.py @@ -0,0 +1,76 @@ +class Getch: +    """ +    Gets a single character from standard input.  Does not echo to +    the screen. +    """ + +    def __init__(self): +        try: +            self.impl = _GetchWindows() +        except ImportError: +            try: +                self.impl = _GetchMacCarbon() +            except(AttributeError, ImportError): +                self.impl = _GetchUnix() + +    def __call__(self): return self.impl() + + +class _GetchUnix: +    def __init__(self): +        import tty +        import sys + +    def __call__(self): +        import sys +        import tty +        import termios + +        fd = sys.stdin.fileno() +        old_settings = termios.tcgetattr(fd) +        try: +            tty.setraw(sys.stdin.fileno()) +            ch = sys.stdin.read(1) +        finally: +            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) +        return ch + + +class _GetchWindows: +    def __init__(self): +        import msvcrt + +    def __call__(self): +        import msvcrt + +        return msvcrt.getch() + +class _GetchMacCarbon: +    """ +    A function which returns the current ASCII key that is down; +    if no ASCII key is down, the null string is returned.  The +    page http://www.mactech.com/macintosh-c/chap02-1.html was +    very helpful in figuring out how to do this. +    """ + +    def __init__(self): +        import Carbon +        Carbon.Evt #see if it has this (in Unix, it doesn't) + +    def __call__(self): +        import Carbon + +        if Carbon.Evt.EventAvail(0x0008)[0] == 0: # 0x0008 is the keyDownMask +            return '' +        else: +            # +            # The event contains the following info: +            # (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)[1] +            # +            # The message (msg) contains the ASCII char which is +            # extracted with the 0x000000FF charCodeMask; this +            # number is converted to an ASCII character with chr() and +            # returned +            # +            (what, msg, when, where, mod) = Carbon.Evt.GetNextEvent(0x0008)[1] +            return chr(msg)
\ No newline at end of file diff --git a/module/lib/SafeEval.py b/module/lib/SafeEval.py new file mode 100644 index 000000000..8ec9766e6 --- /dev/null +++ b/module/lib/SafeEval.py @@ -0,0 +1,70 @@ +## {{{ http://code.activestate.com/recipes/364469/ (r2) +import compiler + +class Unsafe_Source_Error(Exception): +    def __init__(self,error,descr = None,node = None): +        self.error = error +        self.descr = descr +        self.node = node +        self.lineno = getattr(node,"lineno",None) +         +    def __repr__(self): +        return "Line %d.  %s: %s" % (self.lineno, self.error, self.descr) +    __str__ = __repr__     +            +class SafeEval(object): +     +    def visit(self, node,**kw): +        cls = node.__class__ +        meth = getattr(self,'visit'+cls.__name__,self.default) +        return meth(node, **kw) +             +    def default(self, node, **kw): +        for child in node.getChildNodes(): +            return self.visit(child, **kw) +             +    visitExpression = default +     +    def visitConst(self, node, **kw): +        return node.value + +    def visitDict(self,node,**kw): +        return dict([(self.visit(k),self.visit(v)) for k,v in node.items]) +         +    def visitTuple(self,node, **kw): +        return tuple(self.visit(i) for i in node.nodes) +         +    def visitList(self,node, **kw): +        return [self.visit(i) for i in node.nodes] + +class SafeEvalWithErrors(SafeEval): + +    def default(self, node, **kw): +        raise Unsafe_Source_Error("Unsupported source construct", +                                node.__class__,node) +             +    def visitName(self,node, **kw): +        if node.name == "None": +            return None +        elif node.name == "True": +            return True +        elif node.name == "False": +            return False +        else: +            raise Unsafe_Source_Error("Strings must be quoted",  +                                 node.name, node) +                                  +    # Add more specific errors if desired +             + +def safe_eval(source, fail_on_error = True): +    walker = fail_on_error and SafeEvalWithErrors() or SafeEval() +    try: +        ast = compiler.parse(source,"eval") +    except SyntaxError, err: +        raise +    try: +        return walker.visit(ast) +    except Unsafe_Source_Error, err: +        raise +## end of http://code.activestate.com/recipes/364469/ }}} diff --git a/module/lib/Unzip.py b/module/lib/Unzip.py new file mode 100644 index 000000000..f56fbe751 --- /dev/null +++ b/module/lib/Unzip.py @@ -0,0 +1,50 @@ +import zipfile +import os + +class Unzip: +    def __init__(self): +        pass +         +    def extract(self, file, dir): +        if not dir.endswith(':') and not os.path.exists(dir): +            os.mkdir(dir) + +        zf = zipfile.ZipFile(file) + +        # create directory structure to house files +        self._createstructure(file, dir) + +        # extract files to directory structure +        for i, name in enumerate(zf.namelist()): + +            if not name.endswith('/') and not name.endswith("config"): +                print "extracting", name.replace("pyload/","") +                outfile = open(os.path.join(dir, name.replace("pyload/","")), 'wb') +                outfile.write(zf.read(name)) +                outfile.flush() +                outfile.close() + +    def _createstructure(self, file, dir): +        self._makedirs(self._listdirs(file), dir) + +    def _makedirs(self, directories, basedir): +        """ Create any directories that don't currently exist """ +        for dir in directories: +            curdir = os.path.join(basedir, dir) +            if not os.path.exists(curdir): +                os.mkdir(curdir) + +    def _listdirs(self, file): +        """ Grabs all the directories in the zip structure +        This is necessary to create the structure before trying +        to extract the file to it. """ +        zf = zipfile.ZipFile(file) + +        dirs = [] + +        for name in zf.namelist(): +            if name.endswith('/'): +                dirs.append(name.replace("pyload/","")) + +        dirs.sort() +        return dirs | 
