Mercurial > repos > yufei-luo > s_mart
comparison commons/core/checker/CheckerUtils.py @ 6:769e306b7933
Change the repository level.
| author | yufei-luo |
|---|---|
| date | Fri, 18 Jan 2013 04:54:14 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 5:ea3082881bf8 | 6:769e306b7933 |
|---|---|
| 1 # Copyright INRA (Institut National de la Recherche Agronomique) | |
| 2 # http://www.inra.fr | |
| 3 # http://urgi.versailles.inra.fr | |
| 4 # | |
| 5 # This software is governed by the CeCILL license under French law and | |
| 6 # abiding by the rules of distribution of free software. You can use, | |
| 7 # modify and/ or redistribute the software under the terms of the CeCILL | |
| 8 # license as circulated by CEA, CNRS and INRIA at the following URL | |
| 9 # "http://www.cecill.info". | |
| 10 # | |
| 11 # As a counterpart to the access to the source code and rights to copy, | |
| 12 # modify and redistribute granted by the license, users are provided only | |
| 13 # with a limited warranty and the software's author, the holder of the | |
| 14 # economic rights, and the successive licensors have only limited | |
| 15 # liability. | |
| 16 # | |
| 17 # In this respect, the user's attention is drawn to the risks associated | |
| 18 # with loading, using, modifying and/or developing or reproducing the | |
| 19 # software by the user in light of its specific status of free software, | |
| 20 # that may mean that it is complicated to manipulate, and that also | |
| 21 # therefore means that it is reserved for developers and experienced | |
| 22 # professionals having in-depth computer knowledge. Users are therefore | |
| 23 # encouraged to load and test the software's suitability as regards their | |
| 24 # requirements in conditions enabling the security of their systems and/or | |
| 25 # data to be ensured and, more generally, to use and operate it in the | |
| 26 # same conditions as regards security. | |
| 27 # | |
| 28 # The fact that you are presently reading this means that you have had | |
| 29 # knowledge of the CeCILL license and that you accept its terms. | |
| 30 | |
| 31 | |
| 32 import os | |
| 33 import sys | |
| 34 import re | |
| 35 import glob | |
| 36 import ConfigParser | |
| 37 from ConfigParser import NoOptionError | |
| 38 from ConfigParser import NoSectionError | |
| 39 from commons.core.checker.CheckerException import CheckerException | |
| 40 | |
| 41 | |
| 42 ## A set of static methods used to perform checks. | |
| 43 # | |
| 44 # | |
| 45 class CheckerUtils( object ): | |
| 46 | |
| 47 ## Check if blastName param is in ["blastn", "blastp", "blastx", "tblastn", "tblastx"] | |
| 48 # | |
| 49 # @param blastName name to check | |
| 50 # @return True if name is in list False otherwise | |
| 51 # | |
| 52 def isBlastNameNotInBlastValues( blastName ): | |
| 53 blastValuesSet = set( ["blastn", "blastp", "blastx", "tblastn", "tblastx"] ) | |
| 54 blastNameSet = set( [ blastName ] ) | |
| 55 return not blastNameSet.issubset( blastValuesSet ) | |
| 56 | |
| 57 isBlastNameNotInBlastValues = staticmethod( isBlastNameNotInBlastValues ) | |
| 58 | |
| 59 | |
| 60 ## Check if param is NOT "TRUE" and NOT false "FALSE" | |
| 61 # | |
| 62 # @param param str to check | |
| 63 # @return True if param is not eq to "TRUE" AND not eq to "FALSE", false otherwise | |
| 64 # | |
| 65 def isNotTRUEisNotFALSE( param ): | |
| 66 return param != "TRUE" and param != "FALSE" | |
| 67 | |
| 68 isNotTRUEisNotFALSE = staticmethod( isNotTRUEisNotFALSE ) | |
| 69 | |
| 70 | |
| 71 ## Check if resource (file or dir) do NOT exists | |
| 72 # | |
| 73 # @param resource file or dir to check | |
| 74 # @return True if resource exists False otherwise | |
| 75 # | |
| 76 def isRessourceNotExits( resource ): | |
| 77 return not os.path.exists( resource ) | |
| 78 | |
| 79 isRessourceNotExits = staticmethod( isRessourceNotExits ) | |
| 80 | |
| 81 | |
| 82 ## Check a specific E-value format: de-dd | |
| 83 # | |
| 84 # @param param E-value to check | |
| 85 # @return True if format is de-dd False otherwise | |
| 86 # | |
| 87 def isNotAeValueWithOneDigit2DecimalsAtLeast( param ): | |
| 88 # \d\d stands for 2 digits and more ??? | |
| 89 return not re.match( "\de\-\d\d", param ) | |
| 90 | |
| 91 isNotAeValueWithOneDigit2DecimalsAtLeast = staticmethod( isNotAeValueWithOneDigit2DecimalsAtLeast ) | |
| 92 | |
| 93 | |
| 94 ## Check a number format | |
| 95 # | |
| 96 # @param param value to check | |
| 97 # @return True if param is a number (d+) False otherwise | |
| 98 # | |
| 99 def isNotANumber( param ): | |
| 100 return not re.match( "\d+", param ) | |
| 101 | |
| 102 isNotANumber = staticmethod( isNotANumber ) | |
| 103 | |
| 104 | |
| 105 ## Check if an executable is in the user's PATH | |
| 106 # | |
| 107 # @param exeName name of the executable | |
| 108 # @return True if executable in user's PATH, False otherwise | |
| 109 # | |
| 110 def isExecutableInUserPath( exeName ): | |
| 111 dirPathList = os.environ["PATH"].split(":") | |
| 112 for dirPath in dirPathList: | |
| 113 if os.path.isdir( dirPath ): | |
| 114 try: | |
| 115 binPathList = glob.glob( dirPath + "/*" ) | |
| 116 except OSError, e: | |
| 117 continue | |
| 118 for binPath in binPathList: | |
| 119 bin = os.path.basename( binPath ) | |
| 120 if bin == exeName: | |
| 121 return True | |
| 122 return False | |
| 123 | |
| 124 isExecutableInUserPath = staticmethod( isExecutableInUserPath ) | |
| 125 | |
| 126 | |
| 127 ## Return the full path of a given executable | |
| 128 # | |
| 129 def getFullPathFromExecutable( exeName ): | |
| 130 lDirFromUserPath = os.environ["PATH"].split(":") | |
| 131 for dir in lDirFromUserPath: | |
| 132 if os.path.isdir( dir ): | |
| 133 try: | |
| 134 lExecutables = glob.glob( "%s/*" % ( dir ) ) | |
| 135 except OSError, e: | |
| 136 continue | |
| 137 for exe in lExecutables: | |
| 138 path, exe = os.path.split( exe ) | |
| 139 if exe == exeName: | |
| 140 return path | |
| 141 return "" | |
| 142 | |
| 143 getFullPathFromExecutable = staticmethod( getFullPathFromExecutable ) | |
| 144 | |
| 145 | |
| 146 #TODO: to remove ? | |
| 147 ## Check if a queue Name is valid. Warning: Only with the queue manager SGE | |
| 148 # | |
| 149 # @param fullQueueName name of the queue to test (with or without parameters) | |
| 150 # @return True if queue name is valid, False otherwise | |
| 151 # | |
| 152 def isQueueNameValid( fullQueueName ): | |
| 153 queueName = fullQueueName.split()[0] | |
| 154 if queueName == "none": | |
| 155 return True | |
| 156 queueFile = "queueName.txt" | |
| 157 if not CheckerUtils.isExecutableInUserPath( "qconf" ): | |
| 158 msg = "executable 'qconf' can't be found" | |
| 159 sys.stderr.write( "%s\n" % ( msg ) ) | |
| 160 return False | |
| 161 cmd = "qconf -sql > " + queueFile | |
| 162 os.system( cmd ) | |
| 163 queueFileHandler = open( queueFile, "r" ) | |
| 164 lQueueNames = queueFileHandler.readlines() | |
| 165 queueFileHandler.close() | |
| 166 os.remove( queueFile ) | |
| 167 queueNameValid = False | |
| 168 for qName in lQueueNames: | |
| 169 qName = qName.strip() | |
| 170 if qName == queueName: | |
| 171 queueNameValid = True | |
| 172 break | |
| 173 return queueNameValid | |
| 174 | |
| 175 isQueueNameValid = staticmethod( isQueueNameValid ) | |
| 176 | |
| 177 | |
| 178 ## Check if a string length is lower or equal than 15 | |
| 179 # | |
| 180 # @param strName any string | |
| 181 # @return True if string length is <= 15, False otherwise | |
| 182 # | |
| 183 def isMax15Char( strName ): | |
| 184 return (len(strName) <= 15 ) | |
| 185 | |
| 186 isMax15Char = staticmethod( isMax15Char ) | |
| 187 | |
| 188 | |
| 189 ## Check if a string is made with only alphanumeric or underscore character | |
| 190 # | |
| 191 # @param strName any string | |
| 192 # @return True if string is with alphanumeric or underscore, False otherwise | |
| 193 # | |
| 194 def isCharAlphanumOrUnderscore( strName ): | |
| 195 # authorized ALPHABET [a-z,A-Z,0-9,_] | |
| 196 p = re.compile('\W') | |
| 197 errList=p.findall(strName) | |
| 198 if len( errList ) > 0 : | |
| 199 return False | |
| 200 else: | |
| 201 return True | |
| 202 | |
| 203 isCharAlphanumOrUnderscore = staticmethod( isCharAlphanumOrUnderscore ) | |
| 204 | |
| 205 | |
| 206 ## Check if sectionName is in the configuration file | |
| 207 # | |
| 208 # @param config filehandle of configuration file | |
| 209 # @param sectionName string of section name to check | |
| 210 # @exception NoSectionError: if section not found raise a NoSectionError | |
| 211 # | |
| 212 def checkSectionInConfigFile( config, sectionName ): | |
| 213 if not (config.has_section(sectionName)): | |
| 214 raise NoSectionError(sectionName) | |
| 215 | |
| 216 checkSectionInConfigFile = staticmethod( checkSectionInConfigFile ) | |
| 217 | |
| 218 | |
| 219 ## Check if an option is in a specified section in the configuration file | |
| 220 # | |
| 221 # @param config filehandle of configuration file | |
| 222 # @param sectionName string of section name | |
| 223 # @param optionName string of option name to check | |
| 224 # @exception NoOptionError: if option not found raise a NoOptionError | |
| 225 # | |
| 226 def checkOptionInSectionInConfigFile( config, sectionName, optionName ): | |
| 227 config.get( sectionName, optionName ) | |
| 228 | |
| 229 checkOptionInSectionInConfigFile = staticmethod( checkOptionInSectionInConfigFile ) | |
| 230 | |
| 231 | |
| 232 ## Check version number coherency between configFile and CHANGELOG | |
| 233 # | |
| 234 # @param config ConfigParser Instance of configuration file | |
| 235 # @param changeLogFileHandle CHANGELOG file handle | |
| 236 # @exception NoOptionError: if option not found raise a NoOptionError | |
| 237 # | |
| 238 def checkConfigVersion( changeLogFileHandle, config ): | |
| 239 line = changeLogFileHandle.readline() | |
| 240 while not line.startswith("REPET release "): | |
| 241 line = changeLogFileHandle.readline() | |
| 242 numVersionChangeLog = line.split()[2] | |
| 243 | |
| 244 numVersionConfig = config.get("repet_env", "repet_version") | |
| 245 | |
| 246 if not numVersionChangeLog == numVersionConfig: | |
| 247 message = "*** Error: wrong config file version. Expected version num is " + numVersionChangeLog + " but actual in config file is " + numVersionConfig | |
| 248 raise CheckerException(message) | |
| 249 | |
| 250 checkConfigVersion = staticmethod( checkConfigVersion ) | |
| 251 | |
| 252 | |
| 253 ## Get version number from CHANGELOG | |
| 254 # | |
| 255 # @param changeLogFile CHANGELOG file name | |
| 256 # | |
| 257 def getVersionFromChangelogFile(changeLogFileName): | |
| 258 with open(changeLogFileName) as changeLogFileHandle: | |
| 259 line = changeLogFileHandle.readline() | |
| 260 while not line.startswith("REPET release "): | |
| 261 line = changeLogFileHandle.readline() | |
| 262 numVersionChangeLog = line.split()[2] | |
| 263 return numVersionChangeLog | |
| 264 | |
| 265 | |
| 266 getVersionFromChangelogFile = staticmethod( getVersionFromChangelogFile ) | |
| 267 | |
| 268 | |
| 269 ## Check if headers of an input file contain only alpha numeric characters and "_ : . -" | |
| 270 # | |
| 271 # @param fileHandler file handle | |
| 272 # @exception CheckerException if bad header raise a CheckerException | |
| 273 # | |
| 274 def checkHeaders( fileHandler ): | |
| 275 lHeaders = CheckerUtils._getHeaderFromFastaFile(fileHandler) | |
| 276 p = re.compile('[^a-zA-Z0-9_:\.\-]', re.IGNORECASE) | |
| 277 lWrongHeaders = [] | |
| 278 for header in lHeaders: | |
| 279 errList=p.findall(header) | |
| 280 if len( errList ) > 0 : | |
| 281 lWrongHeaders.append(header) | |
| 282 if lWrongHeaders != []: | |
| 283 exception = CheckerException() | |
| 284 exception.setMessages(lWrongHeaders) | |
| 285 raise exception | |
| 286 | |
| 287 checkHeaders = staticmethod( checkHeaders ) | |
| 288 | |
| 289 | |
| 290 def _getHeaderFromFastaFile( inFile ): | |
| 291 lHeaders = [] | |
| 292 while True: | |
| 293 line = inFile.readline() | |
| 294 if line == "": | |
| 295 break | |
| 296 if line[0] == ">": | |
| 297 lHeaders.append( line[1:-1] ) | |
| 298 return lHeaders | |
| 299 | |
| 300 _getHeaderFromFastaFile = staticmethod( _getHeaderFromFastaFile ) | |
| 301 | |
| 302 | |
| 303 ## Return True if an option is in a specified section in the configuration file, False otherwise | |
| 304 # | |
| 305 # @param config handler of configuration file | |
| 306 # @param sectionName string of section name | |
| 307 # @param optionName string of option name to check | |
| 308 # | |
| 309 def isOptionInSectionInConfig( configHandler, section, option ): | |
| 310 try: | |
| 311 CheckerUtils.checkOptionInSectionInConfigFile( configHandler, section, option ) | |
| 312 except NoOptionError: | |
| 313 return False | |
| 314 return True | |
| 315 | |
| 316 isOptionInSectionInConfig = staticmethod( isOptionInSectionInConfig ) |
