From 44196efd14de18aa1363a6ffd6c8c332433e1056 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Thu, 7 Sep 2023 13:05:14 +0200 Subject: [PATCH 01/32] add `encoding` parameter for parsing files Signed-off-by: Christian Decker --- src/spdx_tools/spdx/parser/json/json_parser.py | 5 +++-- src/spdx_tools/spdx/parser/parse_anything.py | 14 ++++++++------ src/spdx_tools/spdx/parser/rdf/rdf_parser.py | 6 ++++-- .../spdx/parser/tagvalue/tagvalue_parser.py | 6 ++++-- src/spdx_tools/spdx/parser/xml/xml_parser.py | 6 ++++-- src/spdx_tools/spdx/parser/yaml/yaml_parser.py | 6 ++++-- .../spdx/data/SPDXJSONExample-UTF-16.spdx.json | Bin 0 -> 42164 bytes .../data/SPDXRdfExample-UTF-16.spdx.rdf.xml | Bin 0 -> 685454 bytes tests/spdx/data/SPDXTagExample-UTF-16.spdx | Bin 0 -> 36852 bytes tests/spdx/data/SPDXXMLExample-UTF-16.spdx.xml | Bin 0 -> 48912 bytes .../spdx/data/SPDXYAMLExample-UTF-16.spdx.yaml | Bin 0 -> 40556 bytes .../parser/all_formats/test_parse_from_file.py | 15 ++++++++++++++- 12 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 tests/spdx/data/SPDXJSONExample-UTF-16.spdx.json create mode 100644 tests/spdx/data/SPDXRdfExample-UTF-16.spdx.rdf.xml create mode 100644 tests/spdx/data/SPDXTagExample-UTF-16.spdx create mode 100644 tests/spdx/data/SPDXXMLExample-UTF-16.spdx.xml create mode 100644 tests/spdx/data/SPDXYAMLExample-UTF-16.spdx.yaml diff --git a/src/spdx_tools/spdx/parser/json/json_parser.py b/src/spdx_tools/spdx/parser/json/json_parser.py index 9ca35fd85..269e968a4 100644 --- a/src/spdx_tools/spdx/parser/json/json_parser.py +++ b/src/spdx_tools/spdx/parser/json/json_parser.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 import json +from typing import Optional from beartype.typing import Dict @@ -9,8 +10,8 @@ from spdx_tools.spdx.parser.jsonlikedict.json_like_dict_parser import JsonLikeDictParser -def parse_from_file(file_name: str) -> Document: - with open(file_name) as file: +def parse_from_file(file_name: str, encoding: Optional[str] = None) -> Document: + with open(file_name, encoding=encoding) as file: input_doc_as_dict: Dict = json.load(file) return JsonLikeDictParser().parse(input_doc_as_dict) diff --git a/src/spdx_tools/spdx/parser/parse_anything.py b/src/spdx_tools/spdx/parser/parse_anything.py index b91f76111..ae5e69568 100644 --- a/src/spdx_tools/spdx/parser/parse_anything.py +++ b/src/spdx_tools/spdx/parser/parse_anything.py @@ -9,6 +9,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from typing import Optional + from spdx_tools.spdx.formats import FileFormat, file_name_to_format from spdx_tools.spdx.parser.json import json_parser from spdx_tools.spdx.parser.rdf import rdf_parser @@ -17,15 +19,15 @@ from spdx_tools.spdx.parser.yaml import yaml_parser -def parse_file(file_name: str): +def parse_file(file_name: str, encoding: Optional[str] = None): input_format = file_name_to_format(file_name) if input_format == FileFormat.RDF_XML: - return rdf_parser.parse_from_file(file_name) + return rdf_parser.parse_from_file(file_name, encoding) elif input_format == FileFormat.TAG_VALUE: - return tagvalue_parser.parse_from_file(file_name) + return tagvalue_parser.parse_from_file(file_name, encoding) elif input_format == FileFormat.JSON: - return json_parser.parse_from_file(file_name) + return json_parser.parse_from_file(file_name, encoding) elif input_format == FileFormat.XML: - return xml_parser.parse_from_file(file_name) + return xml_parser.parse_from_file(file_name, encoding) elif input_format == FileFormat.YAML: - return yaml_parser.parse_from_file(file_name) + return yaml_parser.parse_from_file(file_name, encoding) diff --git a/src/spdx_tools/spdx/parser/rdf/rdf_parser.py b/src/spdx_tools/spdx/parser/rdf/rdf_parser.py index 3856f8d59..cfa7054d4 100644 --- a/src/spdx_tools/spdx/parser/rdf/rdf_parser.py +++ b/src/spdx_tools/spdx/parser/rdf/rdf_parser.py @@ -1,6 +1,8 @@ # SPDX-FileCopyrightText: 2023 spdx contributors # # SPDX-License-Identifier: Apache-2.0 +from typing import Optional + from beartype.typing import Any, Dict from rdflib import RDF, Graph @@ -22,9 +24,9 @@ from spdx_tools.spdx.rdfschema.namespace import SPDX_NAMESPACE -def parse_from_file(file_name: str) -> Document: +def parse_from_file(file_name: str, encoding: Optional[str] = None) -> Document: graph = Graph() - with open(file_name) as file: + with open(file_name, encoding=encoding) as file: graph.parse(file, format="xml") document: Document = translate_graph_to_document(graph) diff --git a/src/spdx_tools/spdx/parser/tagvalue/tagvalue_parser.py b/src/spdx_tools/spdx/parser/tagvalue/tagvalue_parser.py index c28596363..b2c9c9e56 100644 --- a/src/spdx_tools/spdx/parser/tagvalue/tagvalue_parser.py +++ b/src/spdx_tools/spdx/parser/tagvalue/tagvalue_parser.py @@ -1,13 +1,15 @@ # SPDX-FileCopyrightText: 2023 spdx contributors # # SPDX-License-Identifier: Apache-2.0 +from typing import Optional + from spdx_tools.spdx.model import Document from spdx_tools.spdx.parser.tagvalue.parser import Parser -def parse_from_file(file_name: str) -> Document: +def parse_from_file(file_name: str, encoding: Optional[str] = None) -> Document: parser = Parser() - with open(file_name) as file: + with open(file_name, encoding=encoding) as file: data = file.read() document: Document = parser.parse(data) return document diff --git a/src/spdx_tools/spdx/parser/xml/xml_parser.py b/src/spdx_tools/spdx/parser/xml/xml_parser.py index f0cd77025..4d18fdfd3 100644 --- a/src/spdx_tools/spdx/parser/xml/xml_parser.py +++ b/src/spdx_tools/spdx/parser/xml/xml_parser.py @@ -1,6 +1,8 @@ # SPDX-FileCopyrightText: 2023 spdx contributors # # SPDX-License-Identifier: Apache-2.0 +from typing import Optional + import xmltodict from beartype.typing import Any, Dict @@ -36,8 +38,8 @@ ] -def parse_from_file(file_name: str) -> Document: - with open(file_name) as file: +def parse_from_file(file_name: str, encoding: Optional[str] = None) -> Document: + with open(file_name, encoding=encoding) as file: parsed_xml: Dict = xmltodict.parse(file.read(), encoding="utf-8") input_doc_as_dict: Dict = _fix_list_like_fields(parsed_xml).get("Document") diff --git a/src/spdx_tools/spdx/parser/yaml/yaml_parser.py b/src/spdx_tools/spdx/parser/yaml/yaml_parser.py index 1a7349eb8..5a269e84d 100644 --- a/src/spdx_tools/spdx/parser/yaml/yaml_parser.py +++ b/src/spdx_tools/spdx/parser/yaml/yaml_parser.py @@ -1,6 +1,8 @@ # SPDX-FileCopyrightText: 2023 spdx contributors # # SPDX-License-Identifier: Apache-2.0 +from typing import Optional + import yaml from beartype.typing import Dict @@ -8,8 +10,8 @@ from spdx_tools.spdx.parser.jsonlikedict.json_like_dict_parser import JsonLikeDictParser -def parse_from_file(file_name: str) -> Document: - with open(file_name) as file: +def parse_from_file(file_name: str, encoding: Optional[str] = None) -> Document: + with open(file_name, encoding=encoding) as file: input_doc_as_dict: Dict = yaml.safe_load(file) return JsonLikeDictParser().parse(input_doc_as_dict) diff --git a/tests/spdx/data/SPDXJSONExample-UTF-16.spdx.json b/tests/spdx/data/SPDXJSONExample-UTF-16.spdx.json new file mode 100644 index 0000000000000000000000000000000000000000..570d67d3e2ea238e572047f46da8574146f82c8f GIT binary patch literal 42164 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 B5(NMN literal 0 HcmV?d00001 diff --git a/tests/spdx/data/SPDXRdfExample-UTF-16.spdx.rdf.xml b/tests/spdx/data/SPDXRdfExample-UTF-16.spdx.rdf.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3760c7c8d2a1f0d0c6e05c22b24700f33d1b85b GIT binary patch literal 685454 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%0AW z`KU(sdv6A5V(X{NxL}$pbfw(yv~ES3G>!oK{2ObktdJ4bqsNyJQ|Iaq`si^@lsght zjIqx0KxkXpF`nJN%5%`t!kw^- zpTg%o4qa8X#W9O~QGX31u{6F39clSWM1U;G6eQE~tufiHy_Ibub3xeyvAcAAH(F9e zNF=WP$ja(PNeTT@muJi`qFUMaetrLGT`p}F-4_*(4|a!jHOyq#dZm}NX?`+7#d(s7 zR)QuEdi)Ysk_*m=sr%9w+*TzDj#F<{l;Y?c>GsE!cHXm!K8G|q?5&OwRXxzGL;ASP z2=&}{lz=N}vfJ%(N$;^(ANqblS)g)1Ap-C95h=Zh))^Bx#EK~9c+o%JH)c%A;WOT& zvW3pEIzA(<9$m{aVERI%dOEMHgkD^|NAr69qf_EDo;&vH{muRMXcT-cMZILf%kWem6xIV|6`P zGOTsMw1ZgEWxWk-ixN%dXKNMTMeDSnXkA(g-?@hE^r&hx8)8+rua!cwKt_jTTx*fv z(5OXeV#vJAtov<@H_k5bLiX@WR`r8Cw#<5u8v9Li0t6{nK+5YVN|LT3Rn1>$%^b4s z@edlo4)`IDi1z2Y&k|RXHarzb!8%DYd#sM=iRg~C@tV<<&rc1R>Yr>)JByYvf_14s zQpP9mkDrs4P`54LsWaO3TbiQAc!up`V_=B+yQEj{L0;;0jx$HyJ#bU~0vDy+c%ayoQ970{tAM$G%>8(}^|g%D zwMCFXwa72x+ElF#3qT{7M-XSTqEBoAHjqn#ZseYdvgCyn#gY#)n$z;iVzqL5RQgm*Q}P*`1yS%|a11JplU#R<1^?&rA$VnUbakvx=NRL}CVf9f%+uqRlBj6PcmQT5FKrTM?V91Dbj6)eoQpeq$48z0sQM z8cQ7)9*xV6;Z9qX_>WsuX{3knZfrS51L?STjd!jsZ)DE5xtO?adEkriR>CYqRt2VF6Zk!^ujXA6q5hNj zW?J?