#!/usr/bin/env python
# _*_ coding: UTF-8 _*_

"""Visualize Python datastructures using GraphViz.

Use on the command-line like this:
    
    pyrels "x = None; L = [None, 1, 2]"
    pyrels --out x42.dot --format pdf --gvtool dot "x = 42"
"""

import sys

from pyrels.pyrels2dot import namespace2dot


if 0:
    src = sys.argv[1]
    namespace = {}
    exec src in globals(), namespace
    namespace2dot(namespace, path="test.dot", gvtool="dot", format="pdf")


def main():
    # define defaults (should all be strings)
    optionDefaults = {"out": "test.dot", "gvtool": "dot", "format": "pdf"}

    # overwrite defaults with given values on the command-line 
    for var in optionDefaults.keys():
        try:
            i = sys.argv.index("--" + var)
            exec "%s = '%s'" % (var, sys.argv[i+1])
            del sys.argv[i:i+2]
        except ValueError:
            exec "%s = '%s'" % (var, optionDefaults[var])
            
    # validate gvtool variable  
    gvToolNames = "dot neato twopi circo fdp".split()  
    if gvtool not in gvToolNames:
        raise ValueError, "gvtool must be one of: %s" % gvToolNames
    
    # validate format variable  
    formatNames = "ps pdf svg svgz fig mif hpgl pcl png gif dia imap cmapx".split()  
    if format not in formatNames:
        raise ValueError, "format must be one of: %s" % formatNames
    
    # extract source code, execute it into a local namespace    
    source = sys.argv[1]
    namespace = {}
    exec source in globals(), namespace

    # finally call pyrels
    namespace2dot(namespace, path=out, gvtool=gvtool, format=format)


if __name__ == "__main__":
    main()
