Skip to content

Commit 3c08378

Browse files
authored
Cache the schema (#76)
Signed-off-by: Christian Henkel <christian.henkel2@de.bosch.com>
1 parent 10dd813 commit 3c08378

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/ros_license_toolkit/license_checks/schema_check.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
"""This Module contains SchemaCheck, which implements Check."""
1818

19+
import os
1920
from typing import Optional, Tuple
2021

2122
from lxml import etree
@@ -37,7 +38,7 @@ def _check(self, package: Package):
3738
Also considers version of package.xml for validation."""
3839
version: int = package.package_xml_format_ver
3940
if version in self.accepted_versions:
40-
status, message = self._validate(package)
41+
status, message = self.validate(package)
4142
if status:
4243
self._success(
4344
f"Detected package.xml version {version}, " "validation of scheme successful."
@@ -60,31 +61,40 @@ def _check(self, package: Package):
6061
)
6162
self._failed(reason)
6263

63-
def _validate(self, package: Package) -> Tuple[bool, str]:
64+
def validate(self, package: Package) -> Tuple[bool, str]:
6465
"""This is validating the package.xml schema from given package.
6566
This can only validate for format version 1, 2 or 3. Every other
6667
version WILL FAIL. If everything is correct, returns format number,
6768
else -1."""
6869
version = package.package_xml_format_ver
6970
message = ""
70-
schema = self._get_validation_schema(version)
71+
schema = self.get_validation_schema(version)
7172
if schema:
7273
result = schema.validate(package.parsed_package_xml)
7374
if not result:
7475
message = schema.error_log.last_error
7576
return result, message
7677
return False, "Couldn't get schema, no validation possible."
7778

78-
def _get_validation_schema(self, version: int):
79+
def get_validation_schema(self, version: int):
7980
"""Return validation schema for version 1, 2 or 3. If called for other
8081
version numbers, this WILL FAIL. Version is not checked again.
8182
Only call with version 1, 2 or 3."""
82-
if self.validation_schema is None:
83-
address = "http://download.ros.org/schema/" + f"package_format{version}.xsd"
83+
cache_dir: str = os.path.expanduser("~/.cache/ros_license_toolkit")
84+
os.makedirs(cache_dir, exist_ok=True)
85+
schema_file = os.path.join(cache_dir, f"package_format{version}.xsd")
86+
87+
if not os.path.exists(schema_file):
88+
address = f"http://download.ros.org/schema/package_format{version}.xsd"
8489
try:
8590
schema = etree.parse(address)
86-
self.validation_schema = etree.XMLSchema(schema)
91+
with open(schema_file, "wb") as f:
92+
f.write(etree.tostring(schema))
8793
except (AttributeError, etree.XMLSyntaxError) as error:
8894
print(error)
8995
print("An error encountered while getting " + address)
96+
else:
97+
schema = etree.parse(schema_file)
98+
99+
self.validation_schema = etree.XMLSchema(schema)
90100
return self.validation_schema

0 commit comments

Comments
 (0)