source: cows_wps/trunk/cows_wps/utils/common.py @ 6899

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows_wps/trunk/cows_wps/utils/common.py@6899
Revision 6899, 6.6 KB checked in by astephen, 9 years ago (diff)

fixed

Line 
1"""
2common.py
3=========
4
5Provides a number of utilities for the WPS.
6
7"""
8# Import standard library modules
9import sys
10import os
11import time
12import socket
13import random
14import md5
15import string
16import datetime
17
18from cows_wps.utils import case_sensitive_ordered_config_parser as cp
19
20import logging
21log = logging.getLogger(__name__)
22
23def exitNicely(doc_string="", msg=None):
24    "Write a message and then exit cleanly."
25    print doc_string + "\n" + msg
26    sys.exit()
27
28
29def generateLocalFilePath(proc_base_dir, job_id, file_name):
30    "Returns a system file path to read data from."
31   
32    file_path = os.path.join(proc_base_dir, job_id, "outputs", file_name)
33       
34    return file_path
35
36def parseQueryString(qs):
37    """Parses query string to dict."""
38    arg_dict = {}
39    args = qs.split("?")[-1].strip()
40
41    for item in args.split("&"):
42        if item=="": continue
43        name,value = item.split("=")
44        arg_dict[name] = value
45
46    return arg_dict
47
48
49def parseSimpleInputs(inputs_file):
50    """
51    Parses all inputs from simple file and returns a dictionary of valid types.
52    """
53    inputs = open(inputs_file)
54    lines = inputs.readlines()
55    inputs.close()
56
57    arg_dict = {}
58    for line in lines:
59        items, value = line.strip().split("=")
60        (name, item_or_array, item_type) = items.split(",")
61        if item_or_array == "array":
62            value = [eval("%s('%s')" % (item_type, v)) for v in value.split(",")]
63        elif item_or_array == "item":
64            value = eval("%s('%s')" % (item_type, value))
65        arg_dict[name] = value
66
67    return arg_dict
68
69
70def makeHTML(title, arg_dict={}, message=""):
71    """Returns a simple HTML doc that lists args sent."""
72    html = """<HTML>
73<HEAD><TITLE>%s</TITLE></HEAD>
74<BODY>
75<H2>%s</H2>
76
77<P>Welcome to this test service.</P>
78""" % (title, title)
79
80    if len(message)>0:
81        html = html+"<P>Message: "+message+"</P>\n"
82
83    if len(arg_dict)>0:
84        html = html+"""<P>You sent the arguments:</P>
85<UL>
86"""
87        keys = arg_dict.keys()
88        keys.sort()
89        for key in keys:
90            html=html+"""  <LI>%s = %s</LI>\n""" % (key, arg_dict[key])
91        html = html+"</UL>\n"
92    html=html+"""
93</BODY>
94</HTML>
95"""
96    return html
97
98
99def listIfNot(item, rttype = "string"):
100    "Returns non-list/tuple as only item in list."
101    if type(item) not in (type((1,2)), type([1,2])):
102        item = [item]
103
104    if rttype == "string":
105        item = [str(i) for i in item]
106    elif rttype == "float":
107        item = [float(i) for i in item] 
108
109    return item
110
111
112# Make dict for image formats
113imageFormats = {"image/png": "png",
114                "image/jpeg": "jpg",
115                "application/pdf": "pdf",
116                "application/postscript": "ps"}
117
118reverseImageFormats = {}
119for (k, v) in imageFormats.items():
120    reverseImageFormats[ v ] = k
121
122
123def fixTrueFalse(value):
124    "Make true or false value a lower title cased version."
125    if value.lower() in ("true", "false"):
126        value = eval(value.lower().title())
127    return value
128
129
130def getUniqueId(*args):
131    """
132    Generates a universally unique ID.
133    Any arguments only create more randomness.
134    """
135    t = long( time.time() * 1000 )
136    r = long( random.random()*100000000000000000L )
137    try:
138        a = socket.gethostbyname( socket.gethostname() )
139    except:
140        # if we can't get a network address, just imagine one
141        a = random.random()*100000000000000000L
142    data = str(t) + ' ' + str(r) + ' ' + str(a) + ' ' + str(args)
143    data = md5.md5(data).hexdigest()
144    return data
145
146
147def underscoreLowerToTitleCamel(s):
148    """
149    Returns a title camel case string version of an
150    underscore-delimited lower case string.
151    """
152    l = []
153    next_upper = True
154    for i in s:
155        if i == "_":
156            next_upper = True
157        else:
158            if next_upper == True:
159                i = i.upper()
160                next_upper = False
161            l.append(i)
162               
163    return "".join(l)
164
165
166def titleCamelToUnderscoreLower(s, spacer="_"):
167    """
168    Returns a lower case underscore-delimited version of
169    title camel case string.
170    """
171    l = []
172    exceptional_mappings = {"1":"1"}
173    if s in exceptional_mappings.keys():
174        return exceptional_mappings[s]
175
176    is_first = True
177    last = ""
178    for i in s:
179        if i in string.uppercase or i in "0123456789":
180            i = i.lower()
181            if is_first == False:
182                i = spacer + i
183
184        is_first = False
185        l.append(last)
186        last = i
187
188    l.append(last)
189
190    return "".join(l)
191
192def readLinesFromFile(path):
193    fout = open(path, 'r')
194    lines = fout.readlines()
195    fout.close()
196    return lines
197   
198
199def stringToDateTime(timeString, format="%Y-%m-%d %H:%M:%S", includeMicroseconds=False):
200   
201    if includeMicroseconds:
202        p1, p2 = str(timeString).split(".",1)
203        d = datetime.datetime.strptime(p1, format)
204        d = d.replace(microsecond = int(p2))
205    else:
206        d = datetime.datetime.strptime(timeString, format)
207       
208    return d
209
210
211def convertToBooleanIfString(value):
212    """
213    Accepts an argument, if that argument is not already a boolean it will
214    attempt to convert it from a string to a boolean and return it, otherwise
215    the original argument is returned.
216    """
217   
218    if type(value) != bool:
219        return stringToBool(value)
220    else:
221        return value
222
223def stringToBool(boolAsString):
224    """
225    Attempts to convert a string to a boolean, comparis the string with 'true' and 'false' (ignores case) and
226    returns the appropriate boolean value.
227   
228    If the string matches neither 'true' nor 'false' an exception is raised.
229    """
230   
231    if boolAsString.lower() == 'true':
232        return True
233    elif boolAsString.lower() == 'false':
234        return False
235    else:
236        raise Exception("Can't convert the string %s to a boolean" % (boolAsString,))
237   
238
239def buildProcessCallable(processModuleString):
240    package, klassName = processModuleString.split('#')
241   
242    module = __import__(package, fromlist=[''])
243    klass = getattr(module, klassName)   
244    processCallable = klass()
245   
246    return processCallable
247
248
249if __name__ == "__main__":
250
251    print generateDownloadURL("/disks/westerly1/test_dirs/proc_outputs/help/outputs/ukcp09_wxgen_help_007.nc")
252    for i in "abcde": print getUniqueId(i) 
253
254    print "Testing back and forth mappings..."
255    tof = titleCamelToUnderscoreLower
256    fromf = underscoreLowerToTitleCamel
257    for s in ("SamplingDict1", "WGenRuns", "MeaningPeriod", "HotPotato23Highway"):
258        n = tof(s)
259        new_s = fromf(n)
260        print "s:", s, "n:", n, "new_s:", new_s, "same:", (s == new_s)
261   
262    print "Testing use of space from Camel Case version."
263    print tof("SamplingDictNumber2", spacer=" ")
Note: See TracBrowser for help on using the repository browser.