Skip to content

Commit ef61acf

Browse files
committed
[issue-456] add helper method to remove prefix to support Python 3.7 and Python 3.8
Signed-off-by: Meret Behrens <meret.behrens@tngtech.com>
1 parent dba5086 commit ef61acf

File tree

7 files changed

+32
-13
lines changed

7 files changed

+32
-13
lines changed

src/spdx/parser/rdf/checksum_parser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from spdx.model.checksum import Checksum, ChecksumAlgorithm
1414
from spdx.parser.logger import Logger
1515
from spdx.parser.parsing_functions import construct_or_raise_parsing_error, raise_parsing_error_if_logger_has_messages
16-
from spdx.parser.rdf.graph_parsing_functions import parse_literal
16+
from spdx.parser.rdf.graph_parsing_functions import parse_literal, remove_prefix
1717
from spdx.rdfschema.namespace import SPDX_NAMESPACE
1818

1919

@@ -29,7 +29,7 @@ def parse_checksum(parent_node: URIRef, graph: Graph) -> Checksum:
2929

3030

3131
def convert_rdf_to_algorithm(algorithm: str) -> ChecksumAlgorithm:
32-
algorithm = algorithm.removeprefix(SPDX_NAMESPACE.checksumAlgorithm_).upper()
32+
algorithm = remove_prefix(algorithm, SPDX_NAMESPACE.checksumAlgorithm_).upper()
3333
if "BLAKE2B" in algorithm:
3434
algorithm = algorithm.replace("BLAKE2B", "BLAKE2B_")
3535

src/spdx/parser/rdf/creation_info_parser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from spdx.parser.logger import Logger
2020
from spdx.parser.parsing_functions import construct_or_raise_parsing_error, raise_parsing_error_if_logger_has_messages
2121
from spdx.parser.rdf.checksum_parser import parse_checksum
22-
from spdx.parser.rdf.graph_parsing_functions import parse_literal, parse_spdx_id
22+
from spdx.parser.rdf.graph_parsing_functions import parse_literal, parse_spdx_id, remove_prefix
2323
from spdx.rdfschema.namespace import SPDX_NAMESPACE, LICENSE_NAMESPACE
2424

2525
from spdx.datetime_conversions import datetime_from_str
@@ -34,7 +34,7 @@ def parse_creation_info(graph: Graph) -> Tuple[CreationInfo, URIRef]:
3434
namespace, spdx_id, doc_node = parse_namespace_and_spdx_id(graph)
3535
spec_version = parse_literal(logger, graph, doc_node, SPDX_NAMESPACE.specVersion)
3636
data_license = parse_literal(logger, graph, doc_node, SPDX_NAMESPACE.dataLicense,
37-
parsing_method=lambda x: x.removeprefix(LICENSE_NAMESPACE))
37+
parsing_method=lambda x: remove_prefix(x, LICENSE_NAMESPACE))
3838
comment = parse_literal(logger, graph, doc_node, RDFS.comment)
3939
name = parse_literal(logger, graph, doc_node, SPDX_NAMESPACE.name)
4040

src/spdx/parser/rdf/file_parser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from spdx.parser.parsing_functions import construct_or_raise_parsing_error, raise_parsing_error_if_logger_has_messages
1616
from spdx.parser.rdf.checksum_parser import parse_checksum
1717
from spdx.parser.rdf.graph_parsing_functions import parse_literal, parse_spdx_id, parse_literal_or_no_assertion_or_none, \
18-
get_correct_typed_value
18+
get_correct_typed_value, remove_prefix
1919
from spdx.parser.rdf.license_expression_parser import parse_license_expression
2020
from spdx.rdfschema.namespace import SPDX_NAMESPACE
2121

@@ -67,5 +67,5 @@ def parse_file(file_node: URIRef, graph: Graph, doc_namespace: str) -> File:
6767

6868

6969
def convert_uri_ref_to_file_type(file_type_ref: URIRef) -> FileType:
70-
file_type = file_type_ref.removeprefix(SPDX_NAMESPACE).replace("fileType_", "").upper()
70+
file_type = remove_prefix(file_type_ref, SPDX_NAMESPACE.fileType_).upper()
7171
return FileType[file_type]

src/spdx/parser/rdf/graph_parsing_functions.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def apply_parsing_method_or_log_error(logger: Logger, value: Any, parsing_method
4141
logger.extend(err.args[0])
4242
return default
4343

44+
4445
def parse_literal_or_no_assertion_or_none(logger: Logger, graph: Graph, subject: Node, predicate: Node,
4546
parsing_method: Callable = str, default: Any = None):
4647
value = get_unique_value(logger, graph, subject, predicate, default)
@@ -84,7 +85,7 @@ def get_unique_value(logger: Logger, graph: Graph, subject: Node, predicate: Nod
8485

8586
def parse_enum_value(enum_str: str, enum_class: Type[Enum], prefix: str) -> Enum:
8687
try:
87-
enum_without_rdf_prefix = enum_str.removeprefix(prefix)
88+
enum_without_rdf_prefix = remove_prefix(enum_str, prefix)
8889
value = camel_case_to_snake_case(enum_without_rdf_prefix).upper()
8990
return enum_class[value]
9091
except KeyError:
@@ -100,3 +101,11 @@ def parse_spdx_id(resource: URIRef, doc_namespace: str, graph: Graph) -> Optiona
100101
namespace_manager = NamespaceManager(graph)
101102
return namespace_manager.normalizeUri(resource)
102103
return resource.toPython() or None
104+
105+
106+
# Python 3.9 introduced the method removeprefix() for strings, but as we are also supporting Python 3.7 and 3.8 we need
107+
# to write our own helper method to delete prefixes.
108+
def remove_prefix(string: str, prefix: str) -> str:
109+
if string.startswith(prefix):
110+
return string[len(prefix):]
111+
return string

src/spdx/parser/rdf/license_expression_parser.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@
1414
from license_expression import LicenseExpression, get_spdx_licensing
1515
from rdflib.term import Identifier, URIRef, BNode, Node
1616
from spdx.parser.error import SPDXParsingError
17+
from spdx.parser.rdf.graph_parsing_functions import remove_prefix
1718

1819
from spdx.rdfschema.namespace import SPDX_NAMESPACE, LICENSE_NAMESPACE
1920

2021

21-
def parse_license_expression(license_expression_node: Union[URIRef, BNode, Node], graph: Graph, doc_namespace: str) -> LicenseExpression:
22+
def parse_license_expression(license_expression_node: Union[URIRef, BNode, Node], graph: Graph,
23+
doc_namespace: str) -> LicenseExpression:
2224
spdx_licensing = get_spdx_licensing()
2325
expression = ""
2426
if license_expression_node.startswith(LICENSE_NAMESPACE):
25-
expression = license_expression_node.removeprefix(LICENSE_NAMESPACE)
27+
expression = remove_prefix(license_expression_node, LICENSE_NAMESPACE)
2628
return spdx_licensing.parse(expression)
2729
if license_expression_node.startswith(doc_namespace):
2830
expression = license_expression_node.fragment
@@ -60,7 +62,7 @@ def parse_license_expression(license_expression_node: Union[URIRef, BNode, Node]
6062

6163
def parse_license_exception(exception_node: Identifier, graph: Graph) -> str:
6264
if exception_node.startswith(LICENSE_NAMESPACE):
63-
exception = exception_node.removeprefix(LICENSE_NAMESPACE)
65+
exception = remove_prefix(exception_node, LICENSE_NAMESPACE)
6466
else:
6567
exception = graph.value(exception_node, SPDX_NAMESPACE.licenseExceptionId).toPython()
6668
return exception

src/spdx/parser/rdf/package_parser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from spdx.parser.parsing_functions import raise_parsing_error_if_logger_has_messages, construct_or_raise_parsing_error
2121
from spdx.parser.rdf.checksum_parser import parse_checksum
2222
from spdx.parser.rdf.graph_parsing_functions import parse_spdx_id, parse_literal, parse_enum_value, \
23-
parse_literal_or_no_assertion_or_none, get_correct_typed_value, parse_literal_or_no_assertion
23+
parse_literal_or_no_assertion_or_none, get_correct_typed_value, parse_literal_or_no_assertion, remove_prefix
2424
from spdx.parser.rdf.license_expression_parser import parse_license_expression
2525
from spdx.rdfschema.namespace import SPDX_NAMESPACE, REFERENCE_NAMESPACE
2626

@@ -128,7 +128,7 @@ def parse_external_package_ref(external_package_ref_node: URIRef, graph: Graph)
128128
logger, graph, external_package_ref_node, SPDX_NAMESPACE.referenceCategory,
129129
parsing_method=lambda x: parse_enum_value(x, ExternalPackageRefCategory, SPDX_NAMESPACE.referenceCategory_, ))
130130
ref_type = parse_literal(logger, graph, external_package_ref_node, SPDX_NAMESPACE.referenceType,
131-
parsing_method=lambda x: x.removeprefix(REFERENCE_NAMESPACE))
131+
parsing_method=lambda x: remove_prefix(x, REFERENCE_NAMESPACE))
132132
comment = parse_literal(logger, graph, external_package_ref_node, RDFS.comment)
133133

134134
raise_parsing_error_if_logger_has_messages(logger)

tests/spdx/parser/rdf/test_graph_parsing_function.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import pytest
1212
from rdflib import URIRef, Graph, Namespace
1313

14-
from spdx.parser.rdf.graph_parsing_functions import parse_spdx_id
14+
from spdx.parser.rdf.graph_parsing_functions import parse_spdx_id, remove_prefix
1515

1616

1717
@pytest.mark.parametrize("resource,doc_namespace,ext_namespace_mapping,expected",
@@ -27,3 +27,11 @@ def test_parse_spdx_id(resource, doc_namespace, ext_namespace_mapping, expected)
2727
spdx_id = parse_spdx_id(resource, doc_namespace, graph)
2828

2929
assert spdx_id == expected
30+
31+
32+
@pytest.mark.parametrize("string,prefix,expected", [("prefixString", "prefix", "String"),
33+
("prefixString", "refix", "prefixString")])
34+
def test_remove_prefix(string, prefix, expected):
35+
shorten_string = remove_prefix(string, prefix)
36+
37+
assert expected == shorten_string

0 commit comments

Comments
 (0)