# blog.humaneguitarist.org

discoveries in digital audio, music notation, and information encoding

## making a DOT graph for PHP include statements

A couple of months ago, I posted about my experience with making a Python dependency graph.

Of course, as the post states, I was originally looking for a way to make a graph showing the relationship among PHP files in regard to "include" statements.

Well, I'm home sick and after a few hours of trying to find an easy, out-of-box solution I gave up and rolled my own Python script to make me a DOT graph file.

I didn't have anything better to do.

The results are pretty simplistic, but I'm happy enough with it for now.

The Python script takes three arguments: the directory in which the PHP files exist, whether to search recursively or not (0=no, 1=yes), and the name of the output file as such:

$python makeDOT.py blog/wordpress 1 wordpressIncludes.dot ##### #importing modules import glob, re, sys, os, fnmatch br = "\n" tab = "\t" ##### #exiting if all 3 arguments are not passed via command line def fail(): print ("ERROR: " + str(len(sys.argv)-1) + " of 3 required arguments provided.") sys.exit() ##### #getting arguments passed via command line #testing for root DIRECTORY string try: myDir = sys.argv[1] except: fail() #testing for RECURSION boolean try: myRec = sys.argv[2] except: fail() #testing for OUTPUT filename string try: myFile = sys.argv[3] except: fail() ##### #making list of PHP files within DIRECTORY if myRec == "0": #without recursion myDir2 = myDir + "/*.php" PHP_list = glob.glob(myDir2) elif myRec == "1": #with recursion PHP_list = [] for dirname, dirnames, filenames in os.walk(myDir): for filename in filenames: if fnmatch.fnmatch (filename,("*.php")): match = os.path.join(dirname,filename) PHP_list.append(match) #make an empty list; #tuples will go in the list; #each tuple will contain a PHP filename and a PHP filename it includes includeList = [] #iterate through each PHP file and place tuples in the list for phpFile in PHP_list: fileOpen = open(phpFile, "r") #for each line in a PHP file for line in fileOpen: m = re.match(r"(.*)include(.*$$)(.*)$$", line) #for include(),include_once() if m: matchFile = m.group(3)[1:-1] if matchFile[-4::] == ".php": #only PHP files phpFile = phpFile.replace("\\","/") matchFile = matchFile.replace("\\","/") matchFile = matchFile.replace("\"","") matchFile = matchFile.replace('\'',"") includeList.append([phpFile[len(myDir)+1:], matchFile]) else: pass m = re.match(r'(.*)require(.*$$)(.*)$$', line) #for require(), require_once() if m: matchFile = m.group(3)[1:-1] if matchFile[-4::] == '.php': #only PHP files phpFile = phpFile.replace("\\","/") matchFile = matchFile.replace("\\","/") matchFile = matchFile.replace("\"","") matchFile = matchFile.replace('\'',"") includeList.append([phpFile[len(myDir)+1:], matchFile]) else: pass ##### #creating DOT file dot = open(myFile, "w") #writing to DOT file dot.write("digraph {" + br) for a,b in includeList: dot.write(tab) dot.write("\"") dot.write(a) dot.write("\"") dot.write(" -> ") dot.write("\"") dot.write(b) dot.write("\"") dot.write(";") dot.write(br) dot.write("}") dot.close() ##### #exiting sys.exit() I ran the Python script on the PHP scripts for MXMLiszt. Then I used the "circo" layout engine in Graphviz – specifically the Gvedit.exe application – on this resultant DOT file. Here's the result: -------------- #### Related Content: July 30th, 2011 at 1:03 pm ## making my first dependency graph leave a comment I wanted a quick, easy way to generate a dependency graph for PHP include statements, but of course I actually did my Google searches for a Python dependency visualizer. The PHP can wait … Anyway, I found this cool page that had some scripts that can make dependency graphs using Python import statements. In a nutshell, here's what I did. 1. Made a folder on my Desktop (I have Window 7) called "python_visualizer". 2. Downloaded py2depgraph.py and depgraph2dot.py to the folder. 3. Downloaded and installed Graphviz. • On my system it installed to: • C:\Program Files\Graphviz2.26.3 4. Put a copy of one of my Python scripts (renamed to "foo.py") in the "python_visualizer" folder. 5. Opened the command line and did this:$ python_visualizer>python py2depgraph.py foo.py | python depgraph2dot.py | "C:\Program Files\Graphviz2.26.3\bin\dot" -T png -o depgraph.png

Now, I did get a little error message as below:

(dot.exe:7244): Pango-WARNING **: couldn't load font "Helvetica Not-Rotated 10", falling back to "Sans Not-Rotated 10", expect ugly output.

but it's no big deal, the PNG still got made … and I don't think it's that ugly!

But you can judge for yourself …

--------------

#### Related Content:

May 7th, 2011 at 8:53 am

Switch to our mobile site