mirror of
				https://git.dn42.dev/dn42/registry.git
				synced 2025-10-31 11:40:40 +08:00 
			
		
		
		
	fixes to handle unparsable files
This commit is contained in:
		
							parent
							
								
									6b6eae06ec
								
							
						
					
					
						commit
						fef09c2f22
					
				
					 1 changed files with 49 additions and 36 deletions
				
			
		|  | @ -16,14 +16,11 @@ SCHEMA_NAMESPACE = "dn42." | |||
| 
 | ||||
| 
 | ||||
| class SchemaDOM: | ||||
|     src = None | ||||
|     schema = None | ||||
|     name = None | ||||
|     ref = None | ||||
|     primary = None | ||||
|     type = None | ||||
| 
 | ||||
|     def __init__(self, fn): | ||||
|         self.name = None | ||||
|         self.ref = None | ||||
|         self.primary = None | ||||
|         self.type = None | ||||
|         self.src = fn | ||||
|         f = FileDOM(fn) | ||||
|         self.schema = self.__parse_schema(f) | ||||
|  | @ -78,6 +75,10 @@ class SchemaDOM: | |||
| 
 | ||||
|     def check_file(self, f, lookups=None): | ||||
|         status = "PASS" | ||||
|         if not f.valid: | ||||
|            log.error("%s Line 0: File does not parse" % (f.src)) | ||||
|            status = "FAIL" | ||||
| 
 | ||||
|         for k, v in self.schema.items(): | ||||
|             if 'required' in v and k not in f.keys: | ||||
|                 log.error( | ||||
|  | @ -150,18 +151,28 @@ class SchemaDOM: | |||
| class FileDOM: | ||||
| 
 | ||||
|     def __init__(self, fn): | ||||
|         self.valid = True | ||||
|         self.dom = [] | ||||
|         self.keys = {} | ||||
|         self.multi = {} | ||||
|         self.mntner = [] | ||||
|         self.schema = None | ||||
|         self.src = fn | ||||
| 
 | ||||
|         with open(fn, mode='r', encoding='utf-8') as f: | ||||
|             dom = [] | ||||
|             keys = {} | ||||
|             multi = {} | ||||
|             mntner = [] | ||||
|             last_multi = None | ||||
|         schema = None | ||||
|         src = fn | ||||
| 
 | ||||
|         with open(fn, mode='r', encoding='utf-8') as f: | ||||
|             for lineno, i in enumerate(f.readlines(), 1): | ||||
| 
 | ||||
|                 if re.match(r'[ \t]', i): | ||||
|                     if len(dom) == 0: | ||||
|                         log.error("File %s does not parse properly" % (fn) ) | ||||
|                         self.valid = False | ||||
|                         return | ||||
| 
 | ||||
|                     dom[-1][1] += "\n" + i.strip() | ||||
| 
 | ||||
|                     if dom[-1][0] not in multi: | ||||
|  | @ -193,7 +204,6 @@ class FileDOM: | |||
|         self.multi = multi | ||||
|         self.mntner = mntner | ||||
|         self.schema = SCHEMA_NAMESPACE + dom[0][0] | ||||
|         self.src = src | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         length = 19 | ||||
|  | @ -275,11 +285,12 @@ def scan_files(path, mntner=None, use_file=None): | |||
|     idx = {} | ||||
|     schemas = {} | ||||
| 
 | ||||
|     for line in arr: | ||||
|     for dom in arr: | ||||
|         line = (dom.schema, dom.src.split("/")[-1].replace("_", "/"), dom.src, ",".join(dom.mntner), dom) | ||||
| 
 | ||||
|         idx[(line[0], line[1])] = line[2:] | ||||
|         if line[0] == SCHEMA_NAMESPACE + 'schema': | ||||
|             s = SchemaDOM(line[2]) | ||||
|             log.info("read schema: %s" % (s.name)) | ||||
|             schemas[s.ref] = s | ||||
| 
 | ||||
|     return __scan_index(idx, schemas, mntner, use_file) | ||||
|  | @ -287,7 +298,16 @@ def scan_files(path, mntner=None, use_file=None): | |||
| def __scan_index(idx, schemas, mntner, use_file): | ||||
|     ok = True | ||||
|     for k, v in idx.items(): | ||||
|         log.debug(k) | ||||
|         if use_file is not None and use_file != v[0]: | ||||
|             continue | ||||
| 
 | ||||
|         s = schemas.get(k[0], None) | ||||
|         if s is None: | ||||
|             log.error("No schema found for %s" % (k[1])) | ||||
|             print("CHECK\t%-54s\tFAIL\tMNTNERS: UNKNOWN" %(v[2].src)) | ||||
|             ok = "FAIL" | ||||
| 
 | ||||
|         else: | ||||
|             mlist = [] | ||||
|             if len(v) > 1: | ||||
|                 mlist = v[1].split(",") | ||||
|  | @ -295,21 +315,14 @@ def __scan_index(idx, schemas, mntner, use_file): | |||
|             if mntner is not None and mntner not in mlist: | ||||
|                 continue | ||||
| 
 | ||||
|         if use_file is not None and use_file != v[0]: | ||||
|             continue | ||||
| 
 | ||||
|         s = schemas.get(k[0], None) | ||||
|         if s is None: | ||||
|             log.error("No schema found for %s" % (k[1])) | ||||
|             ok = False | ||||
|             continue | ||||
|         c = FileDOM(v[0]) | ||||
|             c = v[2] | ||||
|             ck = s.check_file(c, idx.keys()) | ||||
| 
 | ||||
|             if ck == "INFO" and ok != "FAIL": | ||||
|                 ok = ck | ||||
|             if ck == "FAIL": | ||||
|                 ok = ck | ||||
| 
 | ||||
|     return ok | ||||
| 
 | ||||
| def __index_files(path, use_file): | ||||
|  | @ -342,11 +355,11 @@ def __index_files(path, use_file): | |||
| 
 | ||||
|         for f in files: | ||||
|             dom = FileDOM(os.path.join(root, f)) | ||||
|             yield (dom.schema, dom.src.split("/")[-1].replace("_", "/"), dom.src, ",".join(dom.mntner)) | ||||
|             yield dom | ||||
| 
 | ||||
|     if use_file is not None: | ||||
|             dom = FileDOM(use_file) | ||||
|             yield (dom.schema, dom.src.split("/")[-1].replace("_", "/"), dom.src, ",".join(dom.mntner)) | ||||
|             yield dom | ||||
| 
 | ||||
| def index_files(path): | ||||
|     idx = __index_files(path) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 xuu
						xuu