Exemple #1
0
 def _get_datetime_from_string(self, value: str) -> datetime.datetime:
     if not self.formats:
         try:
             return self.parser(value)
         except ValueError:
             raise ColumnError(f'Unable to convert "{value}" to date.')
     for date_format in self.formats:
         try:
             return datetime.datetime.strptime(value, date_format)
         except ValueError:
             pass
     raise ColumnError(f'Value "{value}" is not accordance with the format {self.formats}.')
Exemple #2
0
    def process_value(self, value: Any) -> Any:
        str_value = super().process_value(value)
        if str_value and len(str_value) > self.max_length:
            raise ColumnError(
                f'"{value}" exceeds max length {self.max_length}')

        return str_value
Exemple #3
0
 def clean_unique_value(self, column: Column, value: Any, row_index: int) -> Any:
     if value is not None and column.unique:
         duplicate_row = self._unique_column_values[column.name].get(value, None)
         if duplicate_row:
             raise ColumnError(f'value {value} is a duplicate of row {duplicate_row}')
         else:
             self._unique_column_values[column.name][value] = row_index
     return value
Exemple #4
0
 def process_value_error(self, value: Any, exc_info: Exception) -> Any:
     if self.raise_error:
         if isinstance(exc_info, ColumnError):
             raise exc_info
         raise ColumnError(str(exc_info)) from exc_info
     if self.none_if_error:
         value = None
     return value
Exemple #5
0
    def process_value(self, value: Any) -> Any:
        value = super().process_value(value)
        if not (self.min_value < value <= self.max_value):
            raise ColumnError(
                f'{value} is not in range ({self.min_value}..{self.max_value}].'
            )

        return value
Exemple #6
0
 def process_value(self, value: Any) -> Optional[str]:
     email_value = super().process_value(value)
     if email_value:
         email_value = lower(email_value)
         try:
             validate_email(email_value)
         except EmailNotValidError:
             raise ColumnError(f'{value} is not a valid postal address.')
         return email_value
Exemple #7
0
 class Parser(BaseParser):
     columns = [
         Column('first_name', index=0),
         Column('last_name', index=1),
         Column('age',
                index=2,
                processor=lambda x: x
                if isinstance(x, int) else raise_(ColumnError())),
     ]
Exemple #8
0
 def process_value(self, value: Any) -> Any:
     if isinstance(value, str):
         value = self._get_datetime_from_string(value.strip())
     elif isinstance(value, datetime.datetime):
         pass
     elif isinstance(value, datetime.date):
         value = datetime.datetime.combine(value, datetime.time.min)
     else:
         raise ColumnError(f'Unable to convert to date {value}.')
     return value
Exemple #9
0
    def process_value(self, value: Any) -> Any:
        raw_value = value
        if isinstance(raw_value, str):
            raw_value = raw_value.strip()
        if raw_value in self.true_values:
            return True
        elif raw_value in self.false_values:
            return False

        raise ColumnError('It is expected one of values: {0}'.format(list(self.true_values) + list(self.false_values)))
Exemple #10
0
 def process_value(self, value: Any) -> Any:
     value: Any = self.raw_value_processor(value)
     for item, choice_function in self.choices:
         if not callable(choice_function) and choice_function == value:
             return item
         try:
             if choice_function(value):
                 return item
         except TypeError:
             pass
     raise ColumnError('Unknown value.')
Exemple #11
0
    def process_value(self, value: Any) -> Any:
        int_value = value
        if isinstance(value, float):
            int_value = self._process_float_value(value)
        elif isinstance(value, str):
            int_value = self._process_str_value(value)

        if not isinstance(int_value, int):
            raise ColumnError(f'{value} is not an integer.')

        return int_value
Exemple #12
0
    def process_value(self, value: Any) -> Any:
        if isinstance(value, Decimal):
            decimal_value = value
        elif isinstance(value, (int, float)):
            decimal_value = Decimal(value)
        else:
            try:
                decimal_value = Decimal(str(value).strip().replace(',', '.'))
            except InvalidOperation:
                raise ColumnError(f'{value} is not a floating point number.')

        return decimal_value
Exemple #13
0
    def process_value(self, value: Any) -> Any:
        if isinstance(value, float):
            float_value = value
        elif isinstance(value, int):
            float_value = float(value)
        else:
            try:
                float_value = float(str(value).strip().replace(',', '.'))
            except (ValueError, TypeError):
                raise ColumnError(f'{value} is not a floating point number.')

        return float_value
Exemple #14
0
    def parse_column(self, row: List[Any], column: Column, row_index: int) -> Any:
        try:
            value = row[column.index]
        except IndexError:
            value = None

        try:
            value = column.processor(value)
            value = self.clean_column(column, value)
        except StopParsing as e:
            raise e
        except Exception as e:
            raise ColumnError(getattr(e, 'messages', str(e))) from e

        return value
Exemple #15
0
 def process_value(self, value: Any) -> Any:
     value = self.raw_value_processor(value)
     try:
         return self.choices[value]
     except KeyError:
         raise ColumnError(f'Unknown value {value}.')