Beispiel #1
0
def integer_double_or_string(card: BDFCard, ifield: int,
                             fieldname: str) -> Union[int, float, str]:
    """
    Casts a value to an integer/double/string

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field

    Returns
    -------
    value : varies
        the value of the field

    """
    svalue = card.field(ifield)
    if isinstance(svalue, integer_float_types):
        return svalue
    elif svalue is None:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer or float (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    svalue = str(svalue.strip())
    if svalue:  # integer/float/string
        if '.' in svalue or '-' in svalue or '+' in svalue:
            # float
            value = double(card, ifield, fieldname)
        elif svalue.isdigit():  # 1, not +1, or -1
            # int
            try:
                value = int(svalue)
            except (ValueError, TypeError):
                raise SyntaxError(
                    '%s = %r (field #%s) on card must be an integer, float, '
                    'or string (not blank).\n'
                    'card=%s' % (fieldname, svalue, ifield, card))
        elif ' ' in svalue:
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer, float, or string '
                '(not a string with a blank).\n'
                'card=%s' % (fieldname, svalue, ifield, card))
        elif svalue[0].isdigit():
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer, float, or string '
                '(not a string with a leading integer).\n'
                'card=%s' % (fieldname, svalue, ifield, card))
        else:
            value = interpret_value(svalue, card)
        return value
    dtype = _get_dtype(svalue)
    raise SyntaxError(
        '%s = %r (field #%s) on card must be an integer, float, or string (not %s).\n'
        'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #2
0
def integer_double_or_blank(card: BDFCard,
                            ifield: int,
                            fieldname: str,
                            default=None):
    """
    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : int / float / None
        the default value for the field (default=None)

    """
    svalue = card.field(ifield)

    if isinstance(svalue, integer_float_types):
        return svalue
    elif svalue is None:
        return default

    if svalue:
        # integer/float
        try:
            return integer_or_double(card, ifield, fieldname)
        except:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer, float, or '
                'blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    return default
Beispiel #3
0
def components_or_blank(card: BDFCard,
                        ifield: int,
                        fieldname: str,
                        default: Optional[str] = None) -> Optional[str]:
    """
	
		:param card: BDF card as a list
		:type card: BDFCard()
		:param ifield: field number
		:type ifield: int
		:param fieldname: name of field
		:type fieldname: int
		:param default: the default value for the field (default=None)
		:type default: str, None
		:return components: a string of the dofs '0' or '123456' (not all are required)
    """
    #assert isinstance(card, BDFCard), type(card)
    assert isinstance(ifield, int), type(ifield)
    assert isinstance(fieldname, str), type(fieldname)
    svalue = card.field(ifield)
    if svalue is None:
        return default
    elif isinstance(svalue, integer_types):
        svalue = str(svalue)
    else:
        svalue = svalue.strip()

    if svalue:
        return parse_components(card, ifield, fieldname)
    return default
Beispiel #4
0
def blank(card: BDFCard, ifield: int, fieldname: str, default=None):
    # type: (BDFCard, int, str, None) -> None
    """
    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : None
        the default value for the field (default=None)

    """
    assert isinstance(card, BDFCard), type(card)
    assert isinstance(ifield, int), type(ifield)
    assert isinstance(fieldname, str), type(fieldname)
    svalue = card.field(ifield)
    if svalue is None:
        return default

    if isinstance(svalue, str):
        svalue = svalue.strip().upper()
        if len(svalue) == 0:
            return default
    dtype = _get_dtype(svalue)
    raise SyntaxError('%s = %r (field #%s) on card must be blank (not %s).\n'
                      'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #5
0
def blank(card: BDFCard, ifield: int, fieldname: str, default=None) -> None:
    """
	
		:param card: BDF card as a list
		:type card: BDFCard()
		:param ifield: field number
		:type ifield: int
		:param fieldname: name of field
		:type fieldname: str
		:param default: the default value for the field (default=None)
		:type default: None
    """
    assert isinstance(card, BDFCard), type(card)
    assert isinstance(ifield, int), type(ifield)
    assert isinstance(fieldname, str), type(fieldname)
    svalue = card.field(ifield)
    if svalue is None:
        return default

    if isinstance(svalue, str):
        svalue = svalue.strip().upper()
        if len(svalue) == 0:
            return default
    dtype = _get_dtype(svalue)
    raise SyntaxError('%s = %r (field #%s) on card must be blank (not %s).\n'
                      'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #6
0
    def run_function(self, f, card, exact):
        """
        Helper function

        Parameters
        ----------
        f : function
           integer_or_blank
        card : List[varies]
            a series of values to add
        exacts : List[float]
            list of results
        """
        assert len(card) == len(
            exact), 'len(card)=%s len(exact)=%s' % (len(card), len(exact))
        i = 0
        fieldname = 'f'
        bdf_card = BDFCard(card)
        for i, exacti in enumerate(exact):
            if exacti == SyntaxError:
                with self.assertRaises(SyntaxError):
                    msg = 'field=%r exact=%r' % (bdf_card.field(i), exacti)
                    #print msg
                    f(bdf_card, i, fieldname)
            else:

                value = f(bdf_card, i, fieldname)
                self.assertEqual(value, exacti)
            i += 1
Beispiel #7
0
def exact_string_or_blank(card: BDFCard,
                          ifield: int,
                          fieldname: str,
                          default=None):
    """
    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : str, None
        the default value for the field (default=None)

    Returns
    -------
    value : varies
        the value of the field

    """
    svalue = card.field(ifield)
    if svalue is None:
        return default
    svalue = '%-8s' % svalue
    if svalue == '':
        return default
    return svalue
Beispiel #8
0
def integer(card: BDFCard, ifield: int, fieldname: str) -> int:
    """
    Casts a value to an integer

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field

    """
    svalue = card.field(ifield)
    if isinstance(svalue, float_types):
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    try:
        return int(svalue)
    except (ValueError, TypeError):
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #9
0
def string_choice_or_blank(card: BDFCard,
                           ifield: int,
                           fieldname: str,
                           choices: Tuple[str],
                           default=None):
    """
   		:param card: BDF card as a list
		:type card: BDFCard()
		:param ifield: field number
		:type ifield: int
		:param fieldname: name of field
		:type fieldname: str
        :param default: the default value for the field (default=None)
		:type default: int, float, None
		:return value: the value from the desired field
    """
    svalue = card.field(ifield)
    if svalue is None:
        return default
    elif isinstance(svalue, str):
        svalue = svalue.strip().upper()
    else:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    if svalue:  # string
        svalue = svalue.upper()
        if svalue not in choices:
            raise RuntimeError(
                f'{fieldname} = {svalue} (field #{ifield}) on card is a string, but must be {choices}.\n'
                f'card={card}')
        return svalue
    return default
Beispiel #10
0
def integer_double_string_or_blank(card: BDFCard,
                                   ifield: int,
                                   fieldname: str,
                                   default=None):
    # type (BDFCard, int, str, Union[int, float, str]) -> Optional[Union[int, float, str]]
    """
    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : int, float, str, None (default=None)
        the default value for the field

    Returns
    -------
    value : int, float, str, None
        the field value

    """
    svalue = card.field(ifield)

    if isinstance(svalue, integer_float_types):
        return svalue
    elif svalue is None:
        return default

    svalue = svalue.strip().upper()
    if svalue:
        # integer/float/string
        if '.' in svalue or '-' in svalue[1:] or '+' in svalue[1:]:
            # float
            try:
                value = double(card, ifield, fieldname)
            except SyntaxError:
                value = interpret_value(card[ifield], card)
        elif RE_INT.match(
                svalue):  # svalue[0].isdigit() or svalue[1:].isdigit():
            # int
            try:
                value = int(svalue)
            except ValueError:
                dtype = _get_dtype(svalue)
                msg = (
                    '%s = %r (field #%s) on card must be an integer, float, '
                    'or string (not %s).\n'
                    'card=%s' % (fieldname, svalue, ifield, dtype, card))
                raise SyntaxError(msg)
        elif ' ' in svalue:
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer, float or string '
                '(without a blank space).\n'
                'card=%s' % (fieldname, svalue, ifield, card))
        else:
            value = svalue
        return value
    return default
Beispiel #11
0
def integer_double_or_blank(card: BDFCard,
                            ifield: int,
                            fieldname: str,
                            default=None):
    """Casts a value to an integer/double/blank

		:param card: BDF card as a list
		:type card: BDFCard()
		:param ifield: field number
		:type ifield: int
		:param fieldname: name of field
		:type fieldname: str
		:return value: the value from the desired field
        :param default: the default value for the field (default=None)
		:type default: int, float, None
    """
    svalue = card.field(ifield)

    if isinstance(svalue, integer_float_types):
        return svalue
    elif svalue is None:
        return default

    if svalue:
        # integer/float
        try:
            return integer_or_double(card, ifield, fieldname)
        except:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer, float, or '
                'blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    return default
Beispiel #12
0
def double_or_string(card: BDFCard, ifield: int,
                     fieldname: str) -> Union[float, str]:
    """
    Casts a value to an double/string

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field

    """
    svalue = card.field(ifield)

    if isinstance(svalue, float_types):
        return svalue
    elif svalue is None or isinstance(svalue, integer_types):
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an float or string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
    elif isinstance(svalue, str):
        svalue = svalue.strip().upper()

    if '.' in svalue or '-' in svalue[1:] or '+' in svalue[1:]:
        # float
        try:
            return double(card, ifield, fieldname)
        except:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an float or string (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    elif svalue.isdigit():  # 1, not +1, or -1
        # fail
        pass
    elif svalue:
        # string
        if ' ' in svalue:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an float or '
                'string (without a blank space; not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
        elif svalue[0].isdigit(
        ) or '.' in svalue or '+' in svalue or '-' in svalue:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an float or '
                'string (without a blank space; not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
        return str(svalue)
    dtype = _get_dtype(svalue)
    raise SyntaxError(
        '%s = %r (field #%s) on card must be an float or string (not %s).\n'
        'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #13
0
def integer_or_string(card: BDFCard, ifield: int,
                      fieldname: str) -> Union[int, str]:
    """Casts a value to an integer/string

		:param card: BDF card as a list
		:type card: BDFCard()
		:param ifield: field number
		:type ifield: int
		:param fieldname: name of field
		:type fieldname: str
		:return value: the value from the desired field
        :param default: the default value for the field (default=None)
		:type default: int, float, None
    """
    svalue = card.field(ifield)

    if isinstance(svalue, integer_types):
        return svalue
    elif isinstance(svalue, float_types):
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer or string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
    elif svalue is None:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer or string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    try:
        value = int(svalue)
        return value
    except ValueError:
        pass

    if svalue[0].isdigit():
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer or string (not %s; '
            'strings must start with a character).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    elif ' ' in svalue:
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer or string '
            '(without a blank space).\n'
            'card=%s' % (fieldname, svalue, ifield, card))

    # string
    try:
        value = double(card, ifield, fieldname)
    except SyntaxError:
        return str(svalue.upper())

    if isinstance(value, float_types):
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer or string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #14
0
def parse_components(card: BDFCard, ifield: int, fieldname: str) -> str:
    """
    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field

    Returns
    -------
    components : str
        a string of the dofs '0' or '123456' (not all are required)

    """
    assert isinstance(card, BDFCard), type(card)
    assert isinstance(ifield, int), type(ifield)
    assert isinstance(fieldname, str), type(fieldname)
    svalue = card.field(ifield)
    if isinstance(svalue, integer_types):
        pass
    elif svalue is None or '.' in svalue:
        dtype = _get_dtype(svalue)
        msg = ('%s = %r (field #%s) on card must be an integer (not %s).\n'
               'card=%s' % (fieldname, svalue, ifield, dtype, card))
        raise SyntaxError(msg)

    try:
        value = int(svalue)
    except ValueError:
        dtype = _get_dtype(svalue)
        msg = ('%s = %r (field #%s) on card must be an integer (not %s).\n'
               'card=%s' % (fieldname, svalue, ifield, dtype, card))
        raise SyntaxError(msg)
    if value > 0 and isinstance(svalue, str):
        if '0' in svalue:
            value2 = str(svalue).replace('0', '')
            msg = (
                '%s = %r (field #%s) on card must contain 0 or %s (not both).\n'
                'card=%s' % (fieldname, svalue, ifield, value2, card))
            raise SyntaxError(msg)
    svalue2 = str(value)
    svalue3 = ''.join(sorted(svalue2))
    for i, component in enumerate(svalue3):
        if component not in '0123456':
            msg = (
                '%s = %r (field #%s) on card contains an invalid component %r.\n'
                'card=%s' % (fieldname, svalue, ifield, component, card))
            raise SyntaxError(msg)
        if component in svalue3[i + 1:]:
            msg = (
                '%s = %r (field #%s) on card must not contain duplicate entries.\n'
                'card=%s' % (fieldname, svalue, ifield, card))
            raise SyntaxError(msg)
    return svalue3
Beispiel #15
0
def force_double(card: BDFCard, ifield: int, fieldname: str) -> float:
    """see ``double``"""
    svalue = card.field(ifield)

    if isinstance(svalue, float_types):
        return svalue
    elif isinstance(svalue, integer_types):
        dtype = _get_dtype(svalue)
        warnings.warn('%s = %r (field #%s) on card must be a float (not %s).\n'
                      'card=%s' % (fieldname, svalue, ifield, dtype, card))
        return float(value)
    elif svalue is None or len(svalue) == 0:  ## None
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a float (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    if svalue.isdigit():  # 1, not +1, or -1
        # if only int
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a float (not an integer).\n'
            'card=%s' % (fieldname, svalue, ifield, card))

    try:
        # 1.0, 1.0E+3, 1.0E-3
        value = float(svalue)
    except TypeError:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a float (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
    except ValueError:
        # 1D+3, 1D-3, 1-3
        try:
            svalue = svalue.upper()
            if 'D' in svalue:
                # 1.0D+3, 1.0D-3
                svalue2 = svalue.replace('D', 'E')
                return float(svalue2)

            # 1.0+3, 1.0-3
            sign = ''
            if svalue[0] in ('+', '-'):
                sign = svalue[0]
                svalue = svalue[1:]
            if '+' in svalue:
                svalue = sign + svalue.replace('+', 'E+')
            elif '-' in svalue:
                svalue = sign + svalue.replace('-', 'E-')

            value = float(svalue)
        except ValueError:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be a float (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    return value
Beispiel #16
0
def integer_or_string(card: BDFCard, ifield: int, fieldname: str) -> Union[int, str]:
    """
    Converts a field into an integer or string

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : int / str
        the default value for the field (default=None)

    """
    svalue = card.field(ifield)

    if isinstance(svalue, integer_types):
        return svalue
    elif isinstance(svalue, float_types):
        dtype = _get_dtype(svalue)
        raise SyntaxError('%s = %r (field #%s) on card must be an integer or string (not %s).\n'
                          'card=%s' % (fieldname, svalue, ifield, dtype, card))
    elif svalue is None:
        dtype = _get_dtype(svalue)
        raise SyntaxError('%s = %r (field #%s) on card must be an integer or string (not %s).\n'
                          'card=%s' % (fieldname, svalue, ifield, dtype, card))

    try:
        value = int(svalue)
        return value
    except ValueError:
        pass

    if svalue[0].isdigit():
        dtype = _get_dtype(svalue)
        raise SyntaxError('%s = %r (field #%s) on card must be an integer or string (not %s; '
                          'strings must start with a character).\n'
                          'card=%s' % (fieldname, svalue, ifield, dtype, card))

    elif ' ' in svalue:
        raise SyntaxError('%s = %r (field #%s) on card must be an integer or string '
                          '(without a blank space).\n'
                          'card=%s' % (fieldname, svalue, ifield, card))

    # string
    try:
        value = double(card, ifield, fieldname)
    except SyntaxError:
        return str(svalue.upper())

    if isinstance(value, float_types):
        dtype = _get_dtype(svalue)
        raise SyntaxError('%s = %r (field #%s) on card must be an integer or string (not %s).\n'
                          'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #17
0
def double_string_or_blank(card: BDFCard,
                           ifield: int,
                           fieldname: str,
                           default=None):
    # type (BDFCard, int, str, Optional[Union[float, str]]) -> Optional[Union[float, str]]
    """Casts a value to an double/string/blank

   
		:param card: BDF card as a list
		:type card: BDFCard()
		:param ifield: field number
		:type ifield: int
		:param fieldname: name of field
		:type fieldname: str
		:param default: the default value for the field (default=None)
		:type default: double, None
		:return value: the typed value
		:raises SyntaxError: if there is an invalid type
    """
    svalue = card.field(ifield)

    if isinstance(svalue, float_types):
        return svalue
    elif svalue is None:
        return default
    elif isinstance(svalue, str):
        svalue = svalue.strip().upper()
    elif isinstance(svalue, integer_types):
        dtype = _get_dtype(svalue)
        msg = (
            '%s = %r (field #%s) on card must be an float, string, or blank (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
        raise SyntaxError(msg)

    if '.' in svalue or '-' in svalue[1:] or '+' in svalue[1:]:
        try:
            return double(card, ifield, fieldname)
        except:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be a float, string '
                'or blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    elif svalue.isdigit():  # 1, not +1, or -1
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a float, string or blank (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
    elif svalue == '':
        return default
    if ' ' in svalue:
        dtype = _get_dtype(svalue)
        raise SyntaxError('%s = %r (field #%s) on card must be an float, '
                          'string (without a blank space) or blank (not %s).\n'
                          'card=%s' % (fieldname, svalue, ifield, dtype, card))
    return svalue
Beispiel #18
0
def integer_or_double(card: BDFCard, ifield: int,
                      fieldname: str) -> Union[int, float]:
    """
    Casts a value to an integer/double

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field

    Returns
    -------
    value : int/float
        the value with the proper type

    :raises SyntaxError: if there's an invalid type

    """
    svalue = card.field(ifield)

    if isinstance(svalue, integer_float_types):
        return svalue
    elif svalue is None:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer or float (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    if '.' in svalue or '-' in svalue[1:] or '+' in svalue[1:]:
        # float/exponent
        try:
            value = double(card, ifield, fieldname)
        except ValueError:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be a integer or a float (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    else:
        # int
        try:
            value = int(svalue)
        except (ValueError, TypeError):
            value = interpret_value(svalue, card)
            if isinstance(value, (int, float)):
                return value
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer or a '
                'float (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    return value
Beispiel #19
0
def loose_string_or_blank(card: BDFCard,
                          ifield: int,
                          fieldname: str,
                          default=None):
    """
    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : str, None
        the default value for the field (default=None)

    Returns
    -------
    value : varies
        the value of the field

    """
    svalue = card.field(ifield)
    if svalue is None:
        return default
    elif isinstance(svalue, str):
        svalue = svalue.strip().upper()
        if ' ' in svalue:
            raise SyntaxError(
                '%s = %r (field #%s) on card must be a string without a space.\n'
                'card=%s' % (fieldname, svalue, ifield, card))
        if svalue[0].isdigit() or '+' in svalue or '-' in svalue[0]:
            chars = ''.join(
                list(set('%s+-' % svalue[0] if svalue[0].isdigit() else '')))
            raise SyntaxError('%s = %r (field #%s) on card must not have the '
                              'following characters %s\n'
                              'card=%s' %
                              (fieldname, svalue, ifield, chars, card))
    else:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    svalue = svalue.strip()
    if svalue.isdigit() or '+' in svalue or '-' in svalue[0]:
        # integer or float
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a string or blank (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    if svalue:  # string
        return str(svalue.upper())
    return default
Beispiel #20
0
def force_integer(card: BDFCard, ifield: int, fieldname: str) -> int:
    """see ``integer``"""
    svalue = card.field(ifield)
    if isinstance(svalue, float_types):
        warnings.warn(
            '%s = %r (field #%s) on card must be an integer (not a double).\n'
            'card=%s' % (fieldname, svalue, ifield, card))
        return int(svalue)

    try:
        return int(svalue)
    except (ValueError, TypeError):
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
    def run_function(self, f, card, exact):
        assert len(card) == len(exact), 'len(card)=%s len(exact)=%s' % (len(card), len(exact))
        i = 0
        fieldname = 'f'
        card = BDFCard(card)
        for i, exacti in enumerate(exact):
            if exacti == SyntaxError:
                with self.assertRaises(SyntaxError):
                    msg = 'field=%r exact=%r' % (card.field(i), exacti)
                    #print msg
                    f(card, i, fieldname)
            else:

                value = f(card, i, fieldname)
                self.assertEqual(value, exacti)
            i += 1
Beispiel #22
0
def integer_or_blank(card: BDFCard,
                     ifield: int,
                     fieldname: str,
                     default: Optional[int] = None):
    # (card, ifield, fieldname, default) -> Optional[int]
    """
    Casts a value to an integer

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : int, None
        the default value for the field (default=None)

    """
    svalue = card.field(ifield)

    if isinstance(svalue, integer_types):
        return svalue
    elif svalue is None:
        return default
    elif isinstance(svalue, str):
        if len(svalue) == 0:
            return default
        elif '.' in svalue or '-' in svalue[1:] or '+' in svalue[1:]:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer or blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))

        try:
            return int(svalue)
        except (ValueError, TypeError):
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer or blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))

    dtype = _get_dtype(svalue)
    raise SyntaxError(
        '%s = %r (field #%s) on card must be an integer (not %s).\n'
        'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #23
0
def string_or_blank(card: BDFCard, ifield: int, fieldname: str, default=None):
    """
		:param card: BDF card as a list
		:type card: BDFCard()
		:param ifield: field number
		:type ifield: int
		:param fieldname: name of field
		:type fieldname: str
        :param default: the default value for the field (default=None)
		:type default: int, float, None
		:return value: the value from the desired field
    """
    svalue = card.field(ifield)
    if svalue is None:
        return default
    elif isinstance(svalue, str):
        svalue = svalue.strip().upper()
        if ' ' in svalue:
            raise SyntaxError(
                '%s = %r (field #%s) on card must be a string without a space.\n'
                'card=%s' % (fieldname, svalue, ifield, card))
        if svalue[0].isdigit(
        ) or '.' in svalue or '+' in svalue or '-' in svalue[0]:
            chars = ''.join(
                list(set('%s.+-' % svalue[0] if svalue[0].isdigit() else '')))
            raise SyntaxError('%s = %r (field #%s) on card must not have the '
                              'following characters %s\n'
                              'card=%s' %
                              (fieldname, svalue, ifield, chars, card))
    else:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    svalue = svalue.strip()
    if svalue.isdigit() or '.' in svalue or '+' in svalue or '-' in svalue[0]:
        # integer or float
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a string or blank (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    if svalue:  # string
        return str(svalue.upper())
    return default
 def run_function_default(self, f, card, exact, default):
     fieldname = 'f'
     assert len(card) == len(exact), 'len(card)=%s len(exact)=%s' % (len(card), len(exact))
     assert len(card) == len(default), 'len(card)=%s len(default)=%s' % (len(card), len(default))
     i = 0
     card = BDFCard(card)
     for i, exacti in enumerate(exact):
         defaulti = default[i]
         if exacti == SyntaxError:
             with self.assertRaises(exacti):
                 msg = 'field=%r exact=%r default=%r' % (card.field(i), exacti, defaulti)
                 #print msg
                 f(card, i, fieldname, defaulti)
         else:
             value = f(card, i, fieldname, defaulti)
             self.assertEqual(value, exacti)
         i += 1
    def run_function(self, f, card, exact):
        assert len(card) == len(
            exact), 'len(card)=%s len(exact)=%s' % (len(card), len(exact))
        i = 0
        fieldname = 'f'
        card = BDFCard(card)
        for i, exacti in enumerate(exact):
            if exacti == SyntaxError:
                with self.assertRaises(SyntaxError):
                    msg = 'field=%r exact=%r' % (card.field(i), exacti)
                    #print msg
                    f(card, i, fieldname)
            else:

                value = f(card, i, fieldname)
                self.assertEqual(value, exacti)
            i += 1
Beispiel #26
0
def string(card: BDFCard, ifield: int, fieldname: str) -> str:
    """
    Casts a value to a string

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field

    Returns
    -------
    value : str
        the value of the field

    """
    svalue = card.field(ifield)
    if isinstance(svalue, str):
        svalue = svalue.strip()
        if ' ' in svalue:
            raise SyntaxError(
                '%s = %r (field #%s) on card must be a string without a space.\n'
                'card=%s' % (fieldname, svalue, ifield, card))

    else:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    if svalue[0].isdigit(
    ) or '.' in svalue or '+' in svalue or '-' in svalue[0]:
        value = integer_or_double(card, ifield, fieldname)
        dtype = _get_dtype(value)
        raise SyntaxError('%s = %r (field #%s) on card must be a '
                          'string with a character (not %s).\n'
                          'card=%s' % (fieldname, value, ifield, dtype, card))
    if svalue:  # string
        return str(svalue.upper())
    dtype = _get_dtype(svalue)
    raise SyntaxError(
        '%s = %r (field #%s) on card must be a string (not %s).\n'
        'card=%s' % (fieldname, svalue, ifield, dtype, card))
Beispiel #27
0
def double_or_blank(card: BDFCard,
                    ifield: int,
                    fieldname: str,
                    default: Optional[Union[float]] = None):
    # (card, ifield, fieldname, default) -> Optional[Union[float]]
    """
    Casts a value to an double/blank

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : double, None
        the default value for the field (default=None)

    """
    svalue = card.field(ifield)

    if isinstance(svalue, float_types):
        return svalue
    elif isinstance(svalue, integer_types):
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a float or blank (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))
    elif isinstance(svalue, str):
        svalue = svalue.strip().upper()
        if not svalue:
            return default
        try:
            return double(card, ifield, fieldname)
        except:
            if svalue == '.':
                return 0.
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be a float or blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    return default
Beispiel #28
0
def integer_string_or_blank(card: BDFCard,
                            ifield: int,
                            fieldname: str,
                            default=None):
    """
    Casts a value to an integer/string/blank

    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : int, str, None
        the default value for the field (default=None)

    """
    svalue = card.field(ifield)
    if isinstance(svalue, integer_types):
        return svalue
    elif svalue is None:
        return default
    elif isinstance(svalue, float_types):
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be an integer or string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    svalue = svalue.strip()
    if svalue:
        # integer/string
        try:
            return integer_or_string(card, ifield, fieldname)
        except:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer, '
                'string (without a blank space), or blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))
    return default
Beispiel #29
0
def string_choice_or_blank(card: BDFCard,
                           ifield: int,
                           fieldname: str,
                           choices: Tuple[str],
                           default=None):
    """
    Parameters
    ----------
    card : BDFCard()
        BDF card as a list
    ifield : int
        field number
    fieldname : str
        name of field
    default : str, None
        the default value for the field (default=None)

    Returns
    -------
    value : varies
        the value of the field

    """
    svalue = card.field(ifield)
    if svalue is None:
        return default
    elif isinstance(svalue, str):
        svalue = svalue.strip().upper()
    else:
        dtype = _get_dtype(svalue)
        raise SyntaxError(
            '%s = %r (field #%s) on card must be a string (not %s).\n'
            'card=%s' % (fieldname, svalue, ifield, dtype, card))

    if svalue:  # string
        svalue = svalue.upper()
        if svalue not in choices:
            raise RuntimeError(
                f'{fieldname} = {svalue} (field #{ifield}) on card is a string, but must be {choices}.\n'
                f'card={card}')
        return svalue
    return default
 def run_function_default(self, f, card, exact, default):
     fieldname = 'f'
     assert len(card) == len(
         exact), 'len(card)=%s len(exact)=%s' % (len(card), len(exact))
     assert len(card) == len(default), 'len(card)=%s len(default)=%s' % (
         len(card), len(default))
     i = 0
     card = BDFCard(card)
     for i, exacti in enumerate(exact):
         defaulti = default[i]
         if exacti == SyntaxError:
             with self.assertRaises(exacti):
                 msg = 'field=%r exact=%r default=%r' % (card.field(i),
                                                         exacti, defaulti)
                 #print msg
                 f(card, i, fieldname, defaulti)
         else:
             value = f(card, i, fieldname, defaulti)
             self.assertEqual(value, exacti)
         i += 1
Beispiel #31
0
def exact_string_or_blank(card: BDFCard,
                          ifield: int,
                          fieldname: str,
                          default=None):
    """
   		:param card: BDF card as a list
		:type card: BDFCard()
		:param ifield: field number
		:type ifield: int
		:param fieldname: name of field
		:type fieldname: str
		:return value: the value from the desired field
        :param default: the default value for the field (default=None)
		:type default: int, float, None
    """
    svalue = card.field(ifield)
    if svalue is None:
        return default
    svalue = '%-8s' % svalue
    if svalue == '':
        return default
    return svalue
Beispiel #32
0
def force_integer_or_blank(card: BDFCard,
                           ifield: int,
                           fieldname: str,
                           default: Optional[int] = None):
    # (card, ifield, fieldname, default) -> Optional[int]
    """see ``integer_or_blank``"""
    svalue = card.field(ifield)

    if isinstance(svalue, integer_types):
        return svalue
    elif svalue is None:
        return default
    elif '.' in svalue:
        # float
        fvalue = force_double(card, ifield, fieldname)
        # TODO: warn if not a whole number
        return int(fvalue)
    elif isinstance(svalue, str):
        if len(svalue) == 0:
            return default
        elif '.' in svalue or '-' in svalue[1:] or '+' in svalue[1:]:
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer or blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))

        try:
            return int(svalue)
        except (ValueError, TypeError):
            dtype = _get_dtype(svalue)
            raise SyntaxError(
                '%s = %r (field #%s) on card must be an integer or blank (not %s).\n'
                'card=%s' % (fieldname, svalue, ifield, dtype, card))

    # float
    dtype = _get_dtype(svalue)
    raise SyntaxError(
        '%s = %r (field #%s) on card must be an integer (not %s).\n'
        'card=%s' % (fieldname, svalue, ifield, dtype, card))