import urllib.request
import urllib.parse
import xml.dom.minidom
################################################################################
INFO = 'http://utilitymill.com/api/{API}/utility/{NAME}/info'
RUN = 'http://utilitymill.com/api/{API}/utility/{NAME}/{VERSION}/run?{QUERY}'
################################################################################
def run_latest(name, **query):
version = get_version(name)
results = get_results(name, version, query)
return results
################################################################################
def get_version(name):
string = fix(info('xml', name))
dom = xml.dom.minidom.parseString(string)
value = extract(dom, 'number', 'TEXT_NODE')
dom.unlink()
return value
def get_results(name, version, query):
string = fix(run('xml', name, version, query))
dom = xml.dom.minidom.parseString(string)
value = extract(dom, 'output', 'CDATA_SECTION_NODE')
dom.unlink()
return value
################################################################################
def info(api, name):
url = INFO.format(API=api, NAME=name)
return urllib.request.urlopen(url).read().decode()
def run(api, name, version, query):
query = urllib.parse.urlencode(query)
url = RUN.format(API=api, NAME=name, VERSION=version, QUERY=query)
return urllib.request.urlopen(url).read().decode()
################################################################################
fix = lambda xml: '<' + xml.split('<', 1)[1].rsplit('>', 1)[0] + '>'
def extract(dom, tag_name, node_type):
elements = dom.getElementsByTagName(tag_name)
assert len(elements) == 1, 'XML Error'
element = elements[0]
if element.childNodes:
assert len(element.childNodes) == 1, 'XML Error'
child = element.childNodes[0]
assert child.nodeType == getattr(child, node_type), 'XML Error'
return child.nodeValue
return ''