def validate(self, line: str) -> None: try: record_id = record_id_from_line(line) except ValueError: raise InvalidS1Format("Does not contain S1 separator") try: spec = spec_from_record_id(record_id) except KeyError: raise UnknownRecordType( f"Encountered unknown record id of '{record_id}'") try: # Tossing away this data, but catching field length errors parse_line_with_spec(line, spec) except InvalidFieldLength: raise InvalidS1Line()
def handle_new_line(self, line: str) -> Tuple[RecordSpec, RecordType]: record_id = record_id_from_line(line) try: spec = spec_from_record_id(record_id) except KeyError: raise UnknownRecordType() record = parse_line_with_spec(line, spec) self.total_lines += 1 return spec, record
def test_parse_repeat(correct_repeat_line, repeat_spec): parsed = parse_line_with_spec(correct_repeat_line, repeat_spec) assert parsed == { "record_id": "2", "a": "1", "b": "2", "c": "3", "repeats": [{"d": "4", "e": "5"}, {"d": "6", "e": "7"}], }
def test_parsing_invalid_length_no_repeat(bad_line, basic_spec): with pytest.raises(InvalidFieldLength): parse_line_with_spec(bad_line, basic_spec)
def test_incorrect_record_ids(basic_spec): """ Should raise when a record_id doesn't match the spec.record_id """ bad_line = "abcd|a|b|c" assert basic_spec.record_id == "1" with pytest.raises(ValueError): parse_line_with_spec(bad_line, basic_spec)
def test_basic_parse(correct_basic_line, basic_spec): parsed = parse_line_with_spec(correct_basic_line, basic_spec) assert parsed == {"record_id": "1", "a": "foo", "b": "bar", "c": "bat"}