validate.py 4.22 KB
Newer Older
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 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :


'''Utilities for command-line option validation'''


import os
import glob
import schema
import logging
logger = logging.getLogger(__name__)


def setup_logger(name, level):
  '''Sets up and checks a verbosity level respects min and max boundaries


  Parameters:

    name (str): The name of the logger to setup

    v (int): A value indicating the verbosity that must be set


  Returns:

    logging.Logger: A standard Python logger that can be used to log messages


  Raises:

    schema.SchemaError: If the verbosity level exceeds the maximum allowed of 4

  '''

  import bob.core
  logger = bob.core.log.setup(name)

  if not (0 <= level < 4):
    raise schema.SchemaError("there can be only up to 3 -v's in a command-line")

  # Sets-up logging
  bob.core.log.set_verbosity_level(logger, level)

  return logger


def make_dir(p):
  '''Checks if a path exists, if it doesn't, creates it


  Parameters:

    p (str): The path to check


  Returns

    bool: ``True``, always

  '''

  if not os.path.exists(p):
    logger.info("Creating directory `%s'...", p)
    os.makedirs(p)

  return True


def check_path_does_not_exist(p):
  '''Checks if a path exists, if it does, raises an exception


  Parameters:

    p (str): The path to check


  Returns:

    bool: ``True``, always


  Raises:

    schema.SchemaError: if the path exists

  '''

  if os.path.exists(p):
    raise schema.SchemaError("path to {} exists".format(p))

  return True


def check_path_exists(p):
  '''Checks if a path exists, if it doesn't, raises an exception


  Parameters:

    p (str): The path to check


  Returns:

    bool: ``True``, always


  Raises:

    schema.SchemaError: if the path doesn't exist

  '''

  if not os.path.exists(p):
    raise schema.SchemaError("path to {} does not exist".format(p))

  return True


def check_model_does_not_exist(p):
  '''Checks if the path to any potential model file does not exist


  Parameters:

    p (str): The path to check


  Returns:

    bool: ``True``, always


  Raises:

    schema.SchemaError: if the path exists

  '''

  files = glob.glob(p + '.*')
  if files:
    raise schema.SchemaError("{} already exists".format(files))

  return True


def open_multipage_pdf_file(s):
  '''Returns an opened matplotlib multi-page file


  Parameters:

    p (str): The path to the file to open


  Returns:

    matplotlib.backends.backend_pdf.PdfPages: with the handle to the multipage
    PDF file


  Raises:

    schema.SchemaError: if the path exists

  '''
  import matplotlib.pyplot as mpl
  from matplotlib.backends.backend_pdf import PdfPages
  return PdfPages(s)
André Anjos's avatar
André Anjos committed
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248


class validate_protocol(object):
  '''Validates the protocol for a given database


  Parameters:

    name (str): The name of the database to validate the protocol for


  Raises:

    schema.SchemaError: if the database is not supported

  '''

  def __init__(self, name):

    self.dbname = name

    if name == 'fv3d':
      import bob.db.fv3d
      self.valid_names = bob.db.fv3d.Database().protocol_names()
    elif name == 'verafinger':
      import bob.db.verafinger
      self.valid_names = bob.db.verafinger.Database().protocol_names()
    else:
      raise schema.SchemaError("do not support database {}".format(name))


  def __call__(self, name):

    if name not in self.valid_names:
      msg = "{} is not a valid protocol for database {}"
      raise schema.SchemaError(msg.format(name, self.dbname))

    return True


class validate_group(object):
  '''Validates the group for a given database


  Parameters:

    name (str): The name of the database to validate the group for


  Raises:

    schema.SchemaError: if the database is not supported

  '''

  def __init__(self, name):

    self.dbname = name

    if name == 'fv3d':
      import bob.db.fv3d
      self.valid_names = bob.db.fv3d.Database().groups()
    elif name == 'verafinger':
      import bob.db.verafinger
      self.valid_names = bob.db.verafinger.Database().groups()
    else:
      raise schema.SchemaError("do not support database {}".format(name))


  def __call__(self, name):

    if name not in self.valid_names:
      msg = "{} is not a valid group for database {}"
      raise schema.SchemaError(msg.format(name, self.dbname))

    return True