1616
1717"""This Module contains SchemaCheck, which implements Check."""
1818
19+ import os
1920from typing import Optional , Tuple
2021
2122from 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