Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions databusclient/filehandling/format.py
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ def read(self, source: str, input_format: str) -> list:
f"Supported: {list(TABULAR_FORMATS)}"
)
delimiter = TABULAR_FORMATS[input_format]
with open(source, "r", newline="", encoding="utf-8") as f:
with open(source, "r", newline="", encoding="utf-8-sig") as f:
reader = csv.reader(f, delimiter=delimiter)
return list(reader)

Expand Down Expand Up @@ -592,4 +592,4 @@ def convert_file(
raise ValueError(
f"Conversion from '{input_format}' ({input_class}) to "
f"'{convert_format}' ({output_class}) is not supported."
)
)
33 changes: 33 additions & 0 deletions tests/test_tabular_bom.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""UTF-8 signatures must not become part of tabular column names."""

import csv

import pytest
from rdflib import Graph, Literal, URIRef

from databusclient.filehandling.format import TSDHandler
from databusclient.filehandling.mapping import convert_csv_to_rdf


@pytest.mark.parametrize("input_format,delimiter", [("csv", ","), ("tsv", "\t")])
@pytest.mark.parametrize("encoding", ["utf-8", "utf-8-sig"])
def test_tabular_conversion_accepts_utf8_bom(tmp_path, input_format, delimiter, encoding):
source = tmp_path / f"input.{input_format}"
rows = [["resource", "https://example.org/name"], ["alice", "Zoë\ufeff Smith"]]
with source.open("w", encoding=encoding, newline="") as stream:
csv.writer(stream, delimiter=delimiter).writerows(rows)

assert TSDHandler().read(str(source), input_format) == rows

output = tmp_path / "output.ttl"
convert_csv_to_rdf(
str(source), str(output), input_format, "turtle", "https://example.org"
)
graph = Graph().parse(output, format="turtle")
assert set(graph) == {
(
URIRef("https://example.org/alice"),
URIRef("https://example.org/name"),
Literal("Zoë\ufeff Smith"),
)
}