def chk_error(obj, fix=True):
    ret = Report(obj, KeyError)
    if obj.has_key('thirdkey'):
        return ret
    ret.problem_msg = 'no "thirdkey"'
    if fix:
        obj['anotherkey'] = 'a string'
        ret.fix_msg = 'added "anotherkey"'
    else:
        ret.problem_level = 40
    return ret
def chk1(obj, fix=True):
    ret = Report(obj, KeyError)
    if obj.has_key('testkey'):
        return ret
    ret.problem_msg = 'no "testkey"'
    if fix:
        obj['testkey'] = 1
        ret.fix_msg = 'added "testkey"'
    else:
        ret.problem_level = 20
    return ret
Beispiel #3
0
 def _chk_sizeof_hdr(hdr, fix=True):
     ret = Report(hdr, HeaderDataError)
     if hdr['sizeof_hdr'] == 348:
         return ret
     ret.problem_msg = 'sizeof_hdr should be 348'
     if fix:
         hdr['sizeof_hdr'] = 348
         ret.fix_msg = 'set sizeof_hdr to 348'
     else:
         ret.problem_level = 30
     return ret
Beispiel #4
0
 def _chk_pixdims(hdr, fix=True):
     ret = Report(hdr, HeaderDataError)
     if not np.any(hdr['pixdim'][1:4] < 0):
         return ret
     ret.problem_msg = 'pixdim[1,2,3] should be positive'
     if fix:
         hdr['pixdim'][1:4] = np.abs(hdr['pixdim'][1:4])
         ret.fix_msg = 'setting to abs of pixdim values'
     else:
         ret.problem_level = 40
     return ret
Beispiel #5
0
 def _chk_scale(klass, hdr, fix=True):
     ret = Report(hdr, HeaderDataError)
     scale, offset = hdr.get_slope_inter()
     if not scale is None:
         return ret
     ret.problem_msg = "no valid scaling in scalefactor (=%s) " "or cal / gl fields; scalefactor assumed 1.0" % scale
     if fix:
         hdr["scl_slope"] = 1
         ret.fix_msg = 'setting scalefactor "scl_slope" to 1'
     else:
         ret.problem_level = 30
     return ret
Beispiel #6
0
 def _chk_scale(hdr, fix=True):
     ret = Report(hdr, HeaderDataError)
     scale = hdr['scl_slope']
     if scale and np.isfinite(scale):
         return ret
     ret.problem_msg = ('scale slope is %s; should !=0 and be finite'
                        % scale)
     if fix:
         hdr['scl_slope'] = 1
         ret.fix_msg = 'setting scalefactor "scale" to 1'
     else:
         ret.problem_level = 30
     return ret
Beispiel #7
0
 def _chk_origin(hdr, fix=True):
     ret = Report(hdr, HeaderDataError)
     origin = hdr['origin'][0:3]
     dims = hdr['dim'][1:4]
     if (not np.any(origin) or
         (np.all(origin > -dims) and np.all(origin < dims*2))):
         return ret
     ret.problem_msg = 'very large origin values relative to dims'
     if fix:
         ret.fix_msg = 'leaving as set, ignoring for affine'
     else:
         ret.problem_level = 20
     return ret
def test_logging():
    rep = Report('', ValueError, 20, 'msg', 'fix')
    str_io = StringIO()
    logger = logging.getLogger('test.logger')
    logger.setLevel(30) # defaultish level
    logger.addHandler(logging.StreamHandler(str_io))
    rep.log_raise(logger)
    yield assert_equal, str_io.getvalue(), ''
    rep.problem_level = 30
    rep.log_raise(logger)
    yield assert_equal, str_io.getvalue(), 'msg; fix\n'
    str_io.truncate(0)
def chk2(obj, fix=True):
    # Can return different codes for different errors in same check
    ret = Report(obj)
    try:
        ok = obj['testkey'] == 0
    except KeyError:
        ret.problem_msg = 'no "testkey"'
        ret.error = KeyError
        if fix:
            obj['testkey'] = 1
            ret.fix_msg = 'added "testkey"'
        else:
            ret.problem_level = 20
        return ret
    if ok:
        return ret
    ret.problem_msg = '"testkey" != 0'
    ret.error = ValueError
    if fix:
        ret.fix_msg = 'set "testkey" to 0'
        obj['testkey'] = 0
    else:
        ret.problem_level = 10
    return ret
Beispiel #10
0
 def _chk_bitpix(klass, hdr, fix=True):
     ret = Report(hdr, HeaderDataError)
     code = int(hdr['datatype'])
     try:
         dt = klass._data_type_codes.dtype[code]
     except KeyError:
         ret.problem_level = 10
         ret.problem_msg = 'no valid datatype to fix bitpix'
         if fix:
             ret.fix_msg = 'no way to fix bitpix'
         return ret
     bitpix = dt.itemsize * 8
     ret = Report(hdr)
     if bitpix == hdr['bitpix']:
         return ret
     ret.problem_msg = 'bitpix does not match datatype'
     if fix:
         hdr['bitpix'] = bitpix # inplace modification
         ret.fix_msg = 'setting bitpix to match datatype'
     else:
         ret.problem_level = 10
     return ret
Beispiel #11
0
 def _chk_datatype(klass, hdr, fix=True):
     ret = Report(hdr, HeaderDataError)
     code = int(hdr['datatype'])
     try:
         dtype = klass._data_type_codes.dtype[code]
     except KeyError:
         ret.problem_level = 40
         ret.problem_msg = 'data code %d not recognized' % code
     else:
         if dtype.type is np.void:
             ret.problem_level = 40
             ret.problem_msg = 'data code %d not supported' % code
     if fix:
         ret.fix_problem_msg = 'not attempting fix'
     return ret
def test_report_strings():
    rep = Report()
    yield assert_not_equal, rep.__str__(), ''
    yield assert_equal, rep.message, ''
    str_io = StringIO()
    rep.write_raise(str_io)
    yield assert_equal, str_io.getvalue(), ''
    rep = Report('', ValueError, 20, 'msg', 'fix')
    rep.write_raise(str_io)
    yield assert_equal, str_io.getvalue(), ''
    rep.problem_level = 30
    rep.write_raise(str_io)
    yield assert_equal, str_io.getvalue(), 'Level 30: msg; fix\n'
    str_io.truncate(0)
    # No fix string, no fix message
    rep.fix_msg = ''
    rep.write_raise(str_io)
    yield assert_equal, str_io.getvalue(), 'Level 30: msg\n'
    rep.fix_msg = 'fix'
    str_io.truncate(0)
    # If we drop the level, nothing goes to the log
    rep.problem_level = 20
    rep.write_raise(str_io)
    yield assert_equal, str_io.getvalue(), ''
    # Unless we set the default log level in the call
    rep.write_raise(str_io, log_level=20)
    yield assert_equal, str_io.getvalue(), 'Level 20: msg; fix\n'
    str_io.truncate(0)
    # If we set the error level down this low, we raise an error
    yield assert_raises, ValueError, rep.write_raise, str_io, 20
    # But the log level wasn't low enough to do a log entry
    yield assert_equal, str_io.getvalue(), ''
    # Error still raised with lower log threshold, but now we do get a
    # log entry
    yield assert_raises, ValueError, rep.write_raise, str_io, 20, 20
    yield assert_equal, str_io.getvalue(), 'Level 20: msg; fix\n'
    # If there's no error, we can't raise
    str_io.truncate(0)
    rep.error = None
    rep.write_raise(str_io, 20)
    yield assert_equal, str_io.getvalue(), ''