1179860b2SJed Browntry: 2179860b2SJed Brown import readline 3179860b2SJed Brownexcept ImportError: pass 4179860b2SJed Brown 5179860b2SJed Browndef getInteractive(): 6179860b2SJed Brown return isInteractive 7179860b2SJed Brown 8179860b2SJed Browndef setInteractive(interactive): 9179860b2SJed Brown global isInteractive 10179860b2SJed Brown isInteractive = interactive 11179860b2SJed Brown return 12179860b2SJed Brown 13179860b2SJed Browndef checkInteractive(key): 14179860b2SJed Brown if not isInteractive: 15179860b2SJed Brown raise ValueError('Value not set for key '+str(key)) 16179860b2SJed Brown return 17179860b2SJed BrownsetInteractive(1) 18179860b2SJed Brown 19179860b2SJed Brownclass Arg(object): 20179860b2SJed Brown '''This is the base class for all objects contained in RDict. Access to the raw argument values is 21179860b2SJed Brownprovided by getValue() and setValue(). These objects can be thought of as type objects for the 22179860b2SJed Brownvalues themselves. It is possible to set an Arg in the RDict which has not yet been assigned a value 23179860b2SJed Brownin order to declare the type of that option. 24179860b2SJed Brown 25179860b2SJed BrownInputs which cannot be converted to the correct type will cause TypeError, those failing validation 26179860b2SJed Browntests will cause ValueError. 27179860b2SJed Brown''' 28179860b2SJed Brown def __init__(self, key, value = None, help = '', isTemporary = False, deprecated = False): 29179860b2SJed Brown self.key = key 30179860b2SJed Brown self.help = help 31179860b2SJed Brown self.isTemporary = isTemporary 32179860b2SJed Brown self.deprecated = False 33179860b2SJed Brown if not value is None: 34179860b2SJed Brown self.setValue(value) 35179860b2SJed Brown self.deprecated = deprecated 36179860b2SJed Brown return 37179860b2SJed Brown 38179860b2SJed Brown def isValueSet(self): 39179860b2SJed Brown '''Determines whether the value of this argument has been set''' 40179860b2SJed Brown return hasattr(self, 'value') 41179860b2SJed Brown 42179860b2SJed Brown def getTemporary(self): 43179860b2SJed Brown '''Retrieve the flag indicating whether the item should be persistent''' 44179860b2SJed Brown return self.isTemporary 45179860b2SJed Brown 46179860b2SJed Brown def setTemporary(self, isTemporary): 47179860b2SJed Brown '''Set the flag indicating whether the item should be persistent''' 48179860b2SJed Brown self.isTemporary = isTemporary 49179860b2SJed Brown return 50179860b2SJed Brown 51179860b2SJed Brown def parseValue(arg): 52179860b2SJed Brown '''Return the object represented by the value portion of a string argument''' 53179860b2SJed Brown # Should I replace this with a lexer? 54179860b2SJed Brown if arg: arg = arg.strip() 55179860b2SJed Brown if arg and arg[0] == '[' and arg[-1] == ']': 56179860b2SJed Brown if len(arg) > 2: value = arg[1:-1].split(',') 57179860b2SJed Brown else: value = [] 58179860b2SJed Brown elif arg and arg[0] == '{' and arg[-1] == '}': 59179860b2SJed Brown value = {} 60179860b2SJed Brown idx = 1 61179860b2SJed Brown oldIdx = idx 62179860b2SJed Brown while idx < len(arg)-1: 63179860b2SJed Brown if arg[oldIdx] == ',': 64179860b2SJed Brown oldIdx += 1 65179860b2SJed Brown while not arg[idx] == ':': idx += 1 66179860b2SJed Brown key = arg[oldIdx:idx] 67179860b2SJed Brown idx += 1 68179860b2SJed Brown oldIdx = idx 69179860b2SJed Brown nesting = 0 70179860b2SJed Brown while not (arg[idx] == ',' or arg[idx] == '}') or nesting: 71179860b2SJed Brown if arg[idx] == '[': 72179860b2SJed Brown nesting += 1 73179860b2SJed Brown elif arg[idx] == ']': 74179860b2SJed Brown nesting -= 1 75179860b2SJed Brown idx += 1 76179860b2SJed Brown value[key] = Arg.parseValue(arg[oldIdx:idx]) 77179860b2SJed Brown oldIdx = idx 78179860b2SJed Brown else: 79179860b2SJed Brown value = arg 80179860b2SJed Brown return value 81179860b2SJed Brown parseValue = staticmethod(parseValue) 82179860b2SJed Brown 83179860b2SJed Brown def parseArgument(arg, ignoreDouble = 0): 84179860b2SJed Brown '''Split an argument into a (key, value) tuple, stripping off the leading dashes. Return (None, None) on failure.''' 85179860b2SJed Brown start = 0 86179860b2SJed Brown if arg and arg[0] == '-': 87179860b2SJed Brown start = 1 88179860b2SJed Brown if arg[1] == '-' and not ignoreDouble: 89179860b2SJed Brown start = 2 90179860b2SJed Brown if arg.find('=') >= 0: 91179860b2SJed Brown (key, value) = arg[start:].split('=', 1) 92179860b2SJed Brown else: 93179860b2SJed Brown if start == 0: 94179860b2SJed Brown (key, value) = (None, arg) 95179860b2SJed Brown else: 96179860b2SJed Brown (key, value) = (arg[start:], '1') 97179860b2SJed Brown return (key, Arg.parseValue(value)) 98179860b2SJed Brown 99179860b2SJed Brown parseArgument = staticmethod(parseArgument) 100179860b2SJed Brown 101179860b2SJed Brown def findArgument(key, argList): 102179860b2SJed Brown '''Locate an argument with the given key in argList, returning the value or None on failure 103179860b2SJed Brown - This is generally used to process arguments which must take effect before canonical argument parsing''' 104179860b2SJed Brown if not isinstance(argList, list): return None 105179860b2SJed Brown # Reverse the list so that we preserve the semantics which state that the last 106179860b2SJed Brown # argument with a given key takes effect 107179860b2SJed Brown l = argList[:] 108179860b2SJed Brown l.reverse() 109179860b2SJed Brown for arg in l: 110179860b2SJed Brown (k, value) = Arg.parseArgument(arg) 111179860b2SJed Brown if k == key: 112179860b2SJed Brown return value 113179860b2SJed Brown return None 114179860b2SJed Brown findArgument = staticmethod(findArgument) 115179860b2SJed Brown 116179860b2SJed Brown def processAlternatePrefixes(argList): 117179860b2SJed Brown '''Convert alternate prefixes to our normal form''' 118179860b2SJed Brown for l in range(0, len(argList)): 119179860b2SJed Brown name = argList[l] 120179860b2SJed Brown if name.find('enable-') >= 0: 121179860b2SJed Brown argList[l] = name.replace('enable-','with-') 122179860b2SJed Brown if name.find('=') == -1: argList[l] = argList[l]+'=1' 123179860b2SJed Brown if name.find('disable-') >= 0: 124179860b2SJed Brown argList[l] = name.replace('disable-','with-') 125179860b2SJed Brown if name.find('=') == -1: argList[l] = argList[l]+'=0' 126179860b2SJed Brown elif name.endswith('=1'): argList[l].replace('=1','=0') 127179860b2SJed Brown if name.find('without-') >= 0: 128179860b2SJed Brown argList[l] = name.replace('without-','with-') 129179860b2SJed Brown if name.find('=') == -1: argList[l] = argList[l]+'=0' 130179860b2SJed Brown elif name.endswith('=1'): argList[l].replace('=1','=0') 131179860b2SJed Brown return 132179860b2SJed Brown processAlternatePrefixes = staticmethod(processAlternatePrefixes) 133179860b2SJed Brown 134179860b2SJed Brown def __str__(self): 135179860b2SJed Brown if not self.isValueSet(): 136179860b2SJed Brown return 'Empty '+str(self.__class__) 137179860b2SJed Brown elif isinstance(self.value, list): 138179860b2SJed Brown return str(map(str, self.value)) 139179860b2SJed Brown return str(self.value) 140179860b2SJed Brown 141179860b2SJed Brown def getEntryPrompt(self): 142179860b2SJed Brown return 'Please enter value for '+str(self.key)+': ' 143179860b2SJed Brown 144179860b2SJed Brown def getKey(self): 145179860b2SJed Brown '''Returns the key. SHOULD MAKE THIS A PROPERTY''' 146179860b2SJed Brown return self.key 147179860b2SJed Brown 148179860b2SJed Brown def setKey(self, key): 149179860b2SJed Brown '''Set the key. SHOULD MAKE THIS A PROPERTY''' 150179860b2SJed Brown self.key = key 151179860b2SJed Brown return 152179860b2SJed Brown 153179860b2SJed Brown def getValue(self): 154179860b2SJed Brown '''Returns the value. SHOULD MAKE THIS A PROPERTY''' 155179860b2SJed Brown if not self.isValueSet(): 156179860b2SJed Brown checkInteractive(self.key) 157179860b2SJed Brown if self.help: print self.help 158179860b2SJed Brown while 1: 159179860b2SJed Brown try: 160179860b2SJed Brown self.setValue(Arg.parseValue(raw_input(self.getEntryPrompt()))) 161179860b2SJed Brown break 162179860b2SJed Brown except KeyboardInterrupt: 163179860b2SJed Brown raise KeyError('Could not find value for key '+str(self.key)) 164179860b2SJed Brown except TypeError, e: 165179860b2SJed Brown print str(e) 166179860b2SJed Brown return self.value 167179860b2SJed Brown 168179860b2SJed Brown def checkKey(self): 169179860b2SJed Brown if self.deprecated: 170179860b2SJed Brown if isinstance(self.deprecated, str): 171179860b2SJed Brown raise KeyError('Deprecated option '+self.key+' should be '+self.deprecated) 172179860b2SJed Brown raise KeyError('Deprecated option '+self.key) 173179860b2SJed Brown return 174179860b2SJed Brown 175179860b2SJed Brown def setValue(self, value): 176179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 177179860b2SJed Brown self.checkKey() 178179860b2SJed Brown self.value = value 179179860b2SJed Brown return 180179860b2SJed Brown 181179860b2SJed Brownclass ArgBool(Arg): 182179860b2SJed Brown '''Arguments that represent boolean values''' 183179860b2SJed Brown def __init__(self, key, value = None, help = '', isTemporary = 0, deprecated = False): 184179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 185179860b2SJed Brown return 186179860b2SJed Brown 187179860b2SJed Brown def getEntryPrompt(self): 188179860b2SJed Brown return 'Please enter boolean value for '+str(self.key)+': ' 189179860b2SJed Brown 190179860b2SJed Brown def setValue(self, value): 191179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 192179860b2SJed Brown self.checkKey() 193179860b2SJed Brown try: 194179860b2SJed Brown if value == 'no': value = 0 195179860b2SJed Brown elif value == 'yes': value = 1 196179860b2SJed Brown elif value == 'true': value = 1 197179860b2SJed Brown elif value == 'false': value = 0 198179860b2SJed Brown elif value == 'True': value = 1 199179860b2SJed Brown elif value == 'False': value = 0 200179860b2SJed Brown else: value = int(value) 201179860b2SJed Brown except: 202179860b2SJed Brown raise TypeError('Invalid boolean value: '+str(value)+' for key '+str(self.key)) 203179860b2SJed Brown self.value = value 204179860b2SJed Brown return 205179860b2SJed Brown 206179860b2SJed Brownclass ArgFuzzyBool(Arg): 207179860b2SJed Brown '''Arguments that represent boolean values of an extended set''' 208179860b2SJed Brown def __init__(self, key, value = None, help = '', isTemporary = 0, deprecated = False): 209179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 210179860b2SJed Brown return 211179860b2SJed Brown 212179860b2SJed Brown def valueName(self, value): 213179860b2SJed Brown if value == 0: 214179860b2SJed Brown return 'no' 215179860b2SJed Brown elif value == 1: 216179860b2SJed Brown return 'yes' 217179860b2SJed Brown elif value == 2: 218179860b2SJed Brown return 'ifneeded' 219179860b2SJed Brown return str(value) 220179860b2SJed Brown 221179860b2SJed Brown def __str__(self): 222179860b2SJed Brown if not self.isValueSet(): 223179860b2SJed Brown return 'Empty '+str(self.__class__) 224179860b2SJed Brown elif isinstance(self.value, list): 225179860b2SJed Brown return str(map(self.valueName, self.value)) 226179860b2SJed Brown return self.valueName(self.value) 227179860b2SJed Brown 228179860b2SJed Brown def getEntryPrompt(self): 229179860b2SJed Brown return 'Please enter fuzzy boolean value for '+str(self.key)+': ' 230179860b2SJed Brown 231179860b2SJed Brown def setValue(self, value): 232179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 233179860b2SJed Brown self.checkKey() 234179860b2SJed Brown try: 235179860b2SJed Brown if value == '0': value = 0 236179860b2SJed Brown elif value == '1': value = 1 237179860b2SJed Brown elif value == 'no': value = 0 238179860b2SJed Brown elif value == 'yes': value = 1 239179860b2SJed Brown elif value == 'false': value = 0 240179860b2SJed Brown elif value == 'true': value = 1 241179860b2SJed Brown elif value == 'maybe': value = 2 242179860b2SJed Brown elif value == 'ifneeded': value = 2 243179860b2SJed Brown elif value == 'client': value = 2 244179860b2SJed Brown elif value == 'server': value = 3 245179860b2SJed Brown else: value = int(value) 246179860b2SJed Brown except: 247179860b2SJed Brown raise TypeError('Invalid fuzzy boolean value: '+str(value)+' for key '+str(self.key)) 248179860b2SJed Brown self.value = value 249179860b2SJed Brown return 250179860b2SJed Brown 251179860b2SJed Brownclass ArgInt(Arg): 252179860b2SJed Brown '''Arguments that represent integer numbers''' 253179860b2SJed Brown def __init__(self, key, value = None, help = '', min = -2147483647L, max = 2147483648L, isTemporary = 0, deprecated = False): 254179860b2SJed Brown self.min = min 255179860b2SJed Brown self.max = max 256179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 257179860b2SJed Brown return 258179860b2SJed Brown 259179860b2SJed Brown def getEntryPrompt(self): 260179860b2SJed Brown return 'Please enter integer value for '+str(self.key)+': ' 261179860b2SJed Brown 262179860b2SJed Brown def setValue(self, value): 263179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 264179860b2SJed Brown self.checkKey() 265179860b2SJed Brown try: 266179860b2SJed Brown value = int(value) 267179860b2SJed Brown except: 268179860b2SJed Brown raise TypeError('Invalid integer number: '+str(value)+' for key '+str(self.key)) 269179860b2SJed Brown if value < self.min or value >= self.max: 270179860b2SJed Brown raise ValueError('Number out of range: '+str(value)+' not in ['+str(self.min)+','+str(self.max)+')'+' for key '+str(self.key)) 271179860b2SJed Brown self.value = value 272179860b2SJed Brown return 273179860b2SJed Brown 274179860b2SJed Brownclass ArgReal(Arg): 275179860b2SJed Brown '''Arguments that represent floating point numbers''' 276179860b2SJed Brown def __init__(self, key, value = None, help = '', min = -1.7976931348623157e308, max = 1.7976931348623157e308, isTemporary = 0, deprecated = False): 277179860b2SJed Brown self.min = min 278179860b2SJed Brown self.max = max 279179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 280179860b2SJed Brown return 281179860b2SJed Brown 282179860b2SJed Brown def getEntryPrompt(self): 283179860b2SJed Brown return 'Please enter floating point value for '+str(self.key)+': ' 284179860b2SJed Brown 285179860b2SJed Brown def setValue(self, value): 286179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 287179860b2SJed Brown self.checkKey() 288179860b2SJed Brown try: 289179860b2SJed Brown value = float(value) 290179860b2SJed Brown except: 291179860b2SJed Brown raise TypeError('Invalid floating point number: '+str(value)+' for key '+str(self.key)) 292179860b2SJed Brown if value < self.min or value >= self.max: 293179860b2SJed Brown raise ValueError('Number out of range: '+str(value)+' not in ['+str(self.min)+','+str(self.max)+')'+' for key '+str(self.key)) 294179860b2SJed Brown self.value = value 295179860b2SJed Brown return 296179860b2SJed Brown 297179860b2SJed Brownclass ArgDir(Arg): 298179860b2SJed Brown '''Arguments that represent directories''' 299179860b2SJed Brown def __init__(self, key, value = None, help = '', mustExist = 1, isTemporary = 0, deprecated = False): 300179860b2SJed Brown self.mustExist = mustExist 301179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 302179860b2SJed Brown return 303179860b2SJed Brown 304179860b2SJed Brown def getEntryPrompt(self): 305179860b2SJed Brown return 'Please enter directory for '+str(self.key)+': ' 306179860b2SJed Brown 307179860b2SJed Brown def getValue(self): 308179860b2SJed Brown '''Returns the value. SHOULD MAKE THIS A PROPERTY''' 309179860b2SJed Brown if not self.isValueSet(): 310179860b2SJed Brown checkInteractive(self.key) 311179860b2SJed Brown return Arg.getValue(self) 312179860b2SJed Brown return self.value 313179860b2SJed Brown 314179860b2SJed Brown def setValue(self, value): 315179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 316179860b2SJed Brown import os 317179860b2SJed Brown self.checkKey() 318179860b2SJed Brown # Should check whether it is a well-formed path 319179860b2SJed Brown if not isinstance(value, str): 320179860b2SJed Brown raise TypeError('Invalid directory: '+str(value)+' for key '+str(self.key)) 321179860b2SJed Brown value = os.path.expanduser(value) 3229992b254SSatish Balay value = os.path.abspath(value) 323179860b2SJed Brown if self.mustExist and value and not os.path.isdir(value): 324179860b2SJed Brown raise ValueError('Nonexistent directory: '+str(value)+' for key '+str(self.key)) 325179860b2SJed Brown self.value = value 326179860b2SJed Brown return 327179860b2SJed Brown 328179860b2SJed Brownclass ArgDirList(Arg): 329179860b2SJed Brown '''Arguments that represent directory lists''' 330179860b2SJed Brown def __init__(self, key, value = None, help = '', mustExist = 1, isTemporary = 0, deprecated = False): 331179860b2SJed Brown self.mustExist = mustExist 332179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 333179860b2SJed Brown return 334179860b2SJed Brown 335179860b2SJed Brown def getEntryPrompt(self): 336179860b2SJed Brown return 'Please enter directory list for '+str(self.key)+': ' 337179860b2SJed Brown 338179860b2SJed Brown def getValue(self): 339179860b2SJed Brown '''Returns the value. SHOULD MAKE THIS A PROPERTY''' 340179860b2SJed Brown if not self.isValueSet(): 341179860b2SJed Brown checkInteractive(self.key) 342179860b2SJed Brown return Arg.getValue(self) 343179860b2SJed Brown return self.value 344179860b2SJed Brown 345179860b2SJed Brown def setValue(self, value): 346179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 347179860b2SJed Brown import os 348179860b2SJed Brown self.checkKey() 349179860b2SJed Brown if not isinstance(value, list): 350179860b2SJed Brown value = [value] 351179860b2SJed Brown # Should check whether it is a well-formed path 352179860b2SJed Brown nvalue = [] 353179860b2SJed Brown for dir in value: 354928c5b42SSatish Balay if dir: 355179860b2SJed Brown nvalue.append(os.path.expanduser(dir)) 356179860b2SJed Brown value = nvalue 357179860b2SJed Brown for dir in value: 358179860b2SJed Brown if self.mustExist and not os.path.isdir(dir): 359179860b2SJed Brown raise ValueError('Invalid directory: '+str(dir)+' for key '+str(self.key)) 360179860b2SJed Brown self.value = value 361179860b2SJed Brown return 362179860b2SJed Brown 363179860b2SJed Brownclass ArgLibrary(Arg): 364179860b2SJed Brown '''Arguments that represent libraries''' 365179860b2SJed Brown def __init__(self, key, value = None, help = '', mustExist = 1, isTemporary = 0, deprecated = False): 366179860b2SJed Brown self.mustExist = mustExist 367179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 368179860b2SJed Brown return 369179860b2SJed Brown 370179860b2SJed Brown def getEntryPrompt(self): 371179860b2SJed Brown return 'Please enter library for '+str(self.key)+': ' 372179860b2SJed Brown 373179860b2SJed Brown def getValue(self): 374179860b2SJed Brown '''Returns the value. SHOULD MAKE THIS A PROPERTY''' 375179860b2SJed Brown if not self.isValueSet(): 376179860b2SJed Brown checkInteractive(self.key) 377179860b2SJed Brown return Arg.getValue(self) 378179860b2SJed Brown return self.value 379179860b2SJed Brown 380179860b2SJed Brown def setValue(self, value): 381179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 382179860b2SJed Brown import os 383179860b2SJed Brown self.checkKey() 384179860b2SJed Brown # Should check whether it is a well-formed path and an archive or shared object 385179860b2SJed Brown if self.mustExist: 386179860b2SJed Brown if not isinstance(value, list): 387179860b2SJed Brown value = value.split(' ') 388179860b2SJed Brown self.value = value 389179860b2SJed Brown return 390179860b2SJed Brown 391179860b2SJed Brownclass ArgExecutable(Arg): 392179860b2SJed Brown '''Arguments that represent executables''' 393179860b2SJed Brown def __init__(self, key, value = None, help = '', mustExist = 1, isTemporary = 0, deprecated = False): 394179860b2SJed Brown self.mustExist = mustExist 395179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 396179860b2SJed Brown return 397179860b2SJed Brown 398179860b2SJed Brown def getEntryPrompt(self): 399179860b2SJed Brown return 'Please enter executable for '+str(self.key)+': ' 400179860b2SJed Brown 401179860b2SJed Brown def getValue(self): 402179860b2SJed Brown '''Returns the value. SHOULD MAKE THIS A PROPERTY''' 403179860b2SJed Brown if not self.isValueSet(): 404179860b2SJed Brown checkInteractive(self.key) 405179860b2SJed Brown return Arg.getValue(self) 406179860b2SJed Brown return self.value 407179860b2SJed Brown 408179860b2SJed Brown def checkExecutable(self, dir, name): 409179860b2SJed Brown import os 410179860b2SJed Brown prog = os.path.join(dir, name) 411179860b2SJed Brown return os.path.isfile(prog) and os.access(prog, os.X_OK) 412179860b2SJed Brown 413179860b2SJed Brown def setValue(self, value): 414179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 415179860b2SJed Brown import os 416179860b2SJed Brown self.checkKey() 417179860b2SJed Brown # Should check whether it is a well-formed path 418179860b2SJed Brown if self.mustExist: 419179860b2SJed Brown index = value.find(' ') 420179860b2SJed Brown if index >= 0: 421179860b2SJed Brown options = value[index:] 422179860b2SJed Brown value = value[:index] 423179860b2SJed Brown else: 424179860b2SJed Brown options = '' 425179860b2SJed Brown found = self.checkExecutable('', value) 426179860b2SJed Brown if not found: 427179860b2SJed Brown for dir in os.environ['PATH'].split(os.path.pathsep): 428179860b2SJed Brown if self.checkExecutable(dir, value): 429179860b2SJed Brown found = 1 430179860b2SJed Brown break 431179860b2SJed Brown if not found: 432179860b2SJed Brown raise ValueError('Invalid executable: '+str(value)+' for key '+str(self.key)) 433179860b2SJed Brown self.value = value+options 434179860b2SJed Brown return 435179860b2SJed Brown 436179860b2SJed Brownclass ArgString(Arg): 437179860b2SJed Brown '''Arguments that represent strings satisfying a given regular expression''' 438179860b2SJed Brown def __init__(self, key, value = None, help = '', regExp = None, isTemporary = 0, deprecated = False): 439179860b2SJed Brown self.regExp = regExp 440179860b2SJed Brown if self.regExp: 441179860b2SJed Brown import re 442179860b2SJed Brown self.re = re.compile(self.regExp) 443179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 444179860b2SJed Brown return 445179860b2SJed Brown 446179860b2SJed Brown def setValue(self, value): 447179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 448179860b2SJed Brown self.checkKey() 449179860b2SJed Brown if self.regExp and not self.re.match(value): 450179860b2SJed Brown raise ValueError('Invalid string '+str(value)+'. You must give a string satisfying "'+str(self.regExp)+'"'+' for key '+str(self.key)) 451179860b2SJed Brown self.value = value 452179860b2SJed Brown return 453179860b2SJed Brown 454179860b2SJed Brownclass ArgDownload(Arg): 455179860b2SJed Brown '''Arguments that represent software downloads''' 456179860b2SJed Brown def __init__(self, key, value = None, help = '', isTemporary = 0, deprecated = False): 457179860b2SJed Brown Arg.__init__(self, key, value, help, isTemporary, deprecated) 458179860b2SJed Brown return 459179860b2SJed Brown 460179860b2SJed Brown def valueName(self, value): 461179860b2SJed Brown if value == 0: 462179860b2SJed Brown return 'no' 463179860b2SJed Brown elif value == 1: 464179860b2SJed Brown return 'yes' 465179860b2SJed Brown return str(value) 466179860b2SJed Brown 467179860b2SJed Brown def __str__(self): 468179860b2SJed Brown if not self.isValueSet(): 469179860b2SJed Brown return 'Empty '+str(self.__class__) 470179860b2SJed Brown elif isinstance(self.value, list): 471179860b2SJed Brown return str(map(self.valueName, self.value)) 472179860b2SJed Brown return self.valueName(self.value) 473179860b2SJed Brown 474179860b2SJed Brown def getEntryPrompt(self): 475179860b2SJed Brown return 'Please enter download value for '+str(self.key)+': ' 476179860b2SJed Brown 477179860b2SJed Brown def setValue(self, value): 478179860b2SJed Brown '''Set the value. SHOULD MAKE THIS A PROPERTY''' 479179860b2SJed Brown import os 480179860b2SJed Brown self.checkKey() 481179860b2SJed Brown try: 482179860b2SJed Brown if value == '0': value = 0 483179860b2SJed Brown elif value == '1': value = 1 484179860b2SJed Brown elif value == 'no': value = 0 485179860b2SJed Brown elif value == 'yes': value = 1 486179860b2SJed Brown elif value == 'false': value = 0 487179860b2SJed Brown elif value == 'true': value = 1 488179860b2SJed Brown elif not isinstance(value, int): 489179860b2SJed Brown value = str(value) 490179860b2SJed Brown except: 491179860b2SJed Brown raise TypeError('Invalid download value: '+str(value)+' for key '+str(self.key)) 492179860b2SJed Brown if isinstance(value, str): 493179860b2SJed Brown import urlparse 494179860b2SJed Brown if not urlparse.urlparse(value)[0]: # how do we check if the URL is invalid? 495179860b2SJed Brown if os.path.isfile(value): 496179860b2SJed Brown value = 'file://'+os.path.abspath(value) 497*52df3566SBarry Smith elif os.path.isdir(value): 498*52df3566SBarry Smith value = 'dir://'+os.path.abspath(value) 499179860b2SJed Brown else: 500179860b2SJed Brown raise ValueError('Invalid download location: '+str(value)+' for key '+str(self.key)) 501179860b2SJed Brown self.value = value 502179860b2SJed Brown return 503