|
13 | 13 | # limitations under the License. |
14 | 14 |
|
15 | 15 | from io import TextIOBase |
16 | | -from typing import Generator, List |
| 16 | +from typing import Generator, List, Optional, Union |
17 | 17 |
|
18 | 18 | from simple_syslog.builder import DefaultBuilder |
19 | 19 | from simple_syslog.data import SyslogDataSet |
| 20 | +from simple_syslog.exceptions import DeviationError, ParseError |
20 | 21 | from simple_syslog.keys import ( |
21 | 22 | DefaultKeyProvider, |
22 | 23 | SyslogFieldKey, |
23 | 24 | SyslogFieldKeyDefaults, |
24 | 25 | ) |
25 | 26 | from simple_syslog.parser import ( |
26 | 27 | AbstractSyslogParser, |
| 28 | + ErrorConsumer, |
27 | 29 | Rfc3164SyslogParser, |
28 | 30 | SyslogConsumer, |
29 | 31 | ) |
@@ -163,12 +165,42 @@ def fun(data_set: SyslogDataSet): |
163 | 165 | consume_from_file(f, parser, fun) |
164 | 166 |
|
165 | 167 |
|
| 168 | +def test_parse_line_consumer_and_error(file_of_3164_many_with_errors_txt) -> None: |
| 169 | + """Test parsing with consumer callback.""" |
| 170 | + builder = DefaultBuilder( |
| 171 | + specification=SyslogSpecification.RFC_3164, |
| 172 | + key_provider=DefaultKeyProvider(), |
| 173 | + nil_policy=None, |
| 174 | + allowed_deviations=None, |
| 175 | + ) |
| 176 | + parser = Rfc3164SyslogParser(builder) |
| 177 | + set_count = 0 |
| 178 | + err_count = 0 |
| 179 | + |
| 180 | + def fun(_: SyslogDataSet): |
| 181 | + nonlocal set_count |
| 182 | + set_count = set_count + 1 |
| 183 | + |
| 184 | + def er(line: str, err: Union[ParseError, DeviationError]) -> None: |
| 185 | + nonlocal err_count |
| 186 | + err_count = err_count + 1 |
| 187 | + assert isinstance(err, ParseError) |
| 188 | + |
| 189 | + with file_of_3164_many_with_errors_txt.open("r") as f: |
| 190 | + consume_from_file(f, parser, fun, er) |
| 191 | + assert set_count == 3 |
| 192 | + assert err_count == 1 |
| 193 | + |
| 194 | + |
166 | 195 | def consume_from_file( |
167 | 196 | f: TextIOBase, |
168 | 197 | parser: AbstractSyslogParser[SyslogDataSet], |
169 | 198 | consumer: SyslogConsumer[SyslogDataSet], |
| 199 | + error_consumer: Optional[ErrorConsumer] = None, |
170 | 200 | ) -> None: |
171 | | - """Open parse with callback.""" |
| 201 | + """Open parse with callback and optional error consumer.""" |
| 202 | + if error_consumer is not None: |
| 203 | + return parser.consume_stream_with_errors(f, consumer, error_consumer) |
172 | 204 | return parser.consume_stream(f, consumer) |
173 | 205 |
|
174 | 206 |
|
|
0 commit comments