def parse_options(options): known_options = [ 'off', 'on', 'stop', 'strict', 'include', 'exclude', 'lint', 'debug', ] for arg in sys.argv: if arg.startswith('--fence:'): sys.argv.remove(arg) new_options = arg.split(':')[1].split(',') for option in new_options: name = option if not '=' in option else option.split('=')[0] if not name in known_options: error('Unknown option "%s"' % option) sys.exit(1) else: if '=' in option: name, value = option.split('=')[:2] options[name] = value else: options[option] = True
def wrapper(*args, **kwargs): for argument in requirements['argument_types']: value = extract_argument(argument, fx, args, kwargs) required_type = requirements['argument_types'][argument] if not validate_type(type(value), required_type): log_failure_header() log_function_call(fqn, args, kwargs) log_function_location(fx) error('%s was %s (%s) instead of %s' % ( argument, repr(value), type(value).__name__, required_type )) if pyfence.options['stop']: abort() try: out = fx(*args, **kwargs) except Exception as ex: if len(requirements['raises']) == 0: raise for required_type in requirements['raises']: if validate_type(type(ex), [required_type]): raise else: log_failure_header() log_function_call(fqn, args, kwargs) log_function_location(fx) error(repr(ex)) error('%s was thrown (only %s allowed)' % ( type(ex).__name__, requirements['raises'] )) if pyfence.options['stop']: abort() raise if requirements['return_type'] is not None: required_type = requirements['return_type'] if not validate_type(type(out), required_type): log_failure_header() log_function_call(fqn, args, kwargs) log_function_location(fx) error('Return value was %s (%s) instead of %s' % ( repr(out), type(out).__name__, required_type )) if pyfence.options['stop']: abort() return out
def abort(): error('Aborting') sys.exit(1)