public
Last active

python script to parse sphinx objects.inv file

  • Download Gist
inventory.py
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
#!/usr/bin/env python
""" Process URL for intersphinx targets and emit html or text """
 
def validuri(string):
return string
 
from sphinx.ext.intersphinx import read_inventory_v2
from posixpath import join
import pprint
import argparse
import locale
import os,sys,tempfile
import urllib2
 
 
parser = argparse.ArgumentParser(description='Process intersphinx link library')
 
parser.add_argument('--url' , type=validuri, help="URL to retrieve objects.inv from")
parser.add_argument('--file' , help="objects.inv format file")
 
group = parser.add_mutually_exclusive_group(required=False)
 
group.add_argument('--html', action='store_true', help="Output HTML")
group.add_argument('--terse', action='store_true', help="Output terse text list")
group.add_argument('--rst', action='store_true', help="Output ReStructuredText")
group.add_argument('--rewrite', action='store_true', help="Output short form and correct form of each link.")
 
 
args = parser.parse_args()
 
def start_role(role):
if (args.terse):
return
elif (args.rewrite):
return
elif (args.rst):
print role
else:
print "<dt>Role: {}</dt>\n<dd>\n<dl>\n".format(role)
 
def start_item(role,item):
if (args.terse):
return
elif (args.rewrite):
return
elif (args.rst):
print "\t:{}:{}:".format(role,item)
elif (args.html):
print "<dt>{}:{}</dt>\n".format(role,item)
print "<dd>"
print "<table>\n<tbody>"
def end_item(role,item):
if (args.html):
print "</tbody></table>"
print "</dd>\n"
 
def print_link(role,item,domain,title):
"""Return the correct link form, if no title then extended form."""
 
domain = domain.lower()
if (title == '')|(title=='-'):
linkStr = ":{}:`{} <{}:{}>`".format(role,item,domain,item)
else:
linkStr = ":{}:`{}:{}`".format(role,domain,item)
if (args.terse):
print linkStr
if (args.rewrite):
print ":{}:`{}:{}`".format(role,domain,item), "\t{}".format(linkStr)
elif (args.rst):
print "\t\t:Link:\t{}".format(linkStr)
elif (args.html):
print "<tr><th>Link:</th><td>{}</td></tr>".format(linkStr)
 
def end_role():
if (args.html):
print "</dl>\n"
print "</dd>\n"
def print_meta(role,item,domain,version,url,title):
if (args.terse):
return
elif (args.rewrite):
return
elif (args.rst):
print "\t\t:Domain:\t{}".format(domain)
print "\t\t:Version:\t{}".format(version)
print "\t\t:URL:\t{}".format(url)
print "\t\t:Title:\t{}".format(title)
elif (args.html):
print "<tr><th>Domain:</th><td>{}</td></tr>".format(domain)
print "<tr><th>Version:</th><td>{}</td></tr>".format(version)
print "<tr><th>URL:</th><td>{}</td></tr>".format(url)
print "<tr><th>Title:</th><td>{}</td></tr>".format(title)
return
 
def fetch_data(url,inv):
 
f = open(inv, 'rb')
line = f.readline() # burn a line
invdata = read_inventory_v2(f, url, join)
if (args.html):
print "<dl>"
for role in invdata:
start_role(role)
for item in invdata[role]:
(domain, version, url, title) = invdata[role][item]
#sys.stderr.write("{}:{} :: {}\n".format(role,item,invdata[role][item]))
start_item(role,item)
print_link(role,item,domain,title)
print_meta(role,item,domain,version,url,title)
end_item(role,item)
if (args.html):
print "</dl>\n"
if __name__ == "__main__":
 
if (args.file):
inv = args.file
# if os.path.exists(inv) == False:
# raise Exception('File "{}" does not exist'.format(inv))
else:
inv = False
if (args.url):
url = args.url
else:
url = False
# sys.stderr.write('URL({}) FN({})\n'.format(url,fn))
if (inv == False) & (url == False):
raise Exception("need to specify a file or URL")
if (inv != False ) & (url != ''):
#sys.stderr.write("Reading from: {}\n".format(inv))
#sys.stderr.write("Using: {} as base HREF\n".format(url))
fetch_data(url,inv)
elif (url != False):
# fetch URL into inv
#sys.stderr.write("Retrieving objects.inv from {}\n".format(url))
if (url.rfind('objects.inv')>5):
invdata = urllib2.urlopen(url)
else:
invdata = urllib2.urlopen(url + '/objects.inv')
sys.stderr.write('URL resolved to: {}\n '.format(invdata.geturl()))
#print invdata.read()
f = tempfile.NamedTemporaryFile()
f.write(invdata.read())
sys.stderr.write("objects.inv written to: {}\n".format(f.name))
sys.stderr.write("Using: {} as base HREF\n".format(url))
fetch_data(url,f.name)
else:
raise Exception("You need to specify a --URL")

This looks useful, but for me python inventory.py --file objects.inv fails with:

Traceback (most recent call last):
  File "inventory.py", line 139, in <module>
    fetch_data(url,inv)
  File "inventory.py", line 102, in fetch_data
    invdata = read_inventory_v2(f, url, join)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sphinx/ext/intersphinx.py", line 118, in read_inventory_v2
    location = join(uri, location)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 77, in join
    elif path == '' or path.endswith('/'):
AttributeError: 'bool' object has no attribute 'endswith'

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.