299):
300 """
301 Compare the in-file metadata in two given files. Uses PyUtils.MetaReader
302 to obtain file content. Generates list of string that show difference.
303 Returns empty list if no difference is found
304
305 Keyword arguments:
306 files -- Names of two files to compare
307 verbose -- toggle to get debug information
308 ordered -- whether to check order of lists in the metadata
309 drop -- keys to drop from metadata retrieved by MetaReader
310 mode -- MetaReader argument setting amount of content (default 'lite').
311 Allowed values are: tiny, lite, peeker, and full
312 meta_key_filter -- MetaReader argument selecting keys to retrieve (default
313 get all)
314 file_type -- Type of files, POOL or BS (default: auto-configure)
315 promote -- MetaReader argument (default: False)
316 diff_format -- Return 'simple' or 'diff' style string (default: 'simple')
317 regex -- Use regex for the drop filter (default: False)
318 key_only -- Show only the keys instead of their value (default: False)
319 """
320 if len(files) != 2:
321 raise ValueError("Wrong number of files passes, need two")
322
323 reader_msg = logging.getLogger("MetaReader")
324 reader_msg.setLevel(logging.INFO if verbose else logging.WARNING)
325
326 msg = logging.getLogger("MetaDiff")
327 msg.setLevel(logging.DEBUG if verbose else logging.INFO)
328
329 msg.debug("Reading from %s and %s", files[0], files[1])
330
331 metadata = read_metadata(
332 files,
333 file_type,
334 mode=mode,
335 meta_key_filter=meta_key_filter,
336 promote=promote,
337 )
338
339 if drop is not None and regex:
340 for i in range(len(drop)):
341 drop[i] = re.compile( drop[i] )
342
343 def filter_metadata_items(key):
344 key_str = str(key)
345
346 if drop is not None:
347 for drop_key in drop:
348 if not drop_key.startswith("metadata_items/"):
349 continue
350
351 drop_key = drop_key[len("metadata_items/"):]
352
353 if not regex:
354 if key_str.startswith(drop_key):
355 return False
356 else:
357 if drop_key.match(key_str):
358 return False
359
360 return True
361
362 def filter_key(key):
363 key_str = str(key)
364
365 if drop is not None:
366 for drop_key in drop:
367 if not regex:
368 if key_str.startswith(drop_key):
369 return False
370 else:
371 if drop_key.match(key_str):
372 return False
373
374 if ignore_trigger:
375 for trigger_key in trigger_keys:
376 if key_str.startswith(trigger_key):
377 return False
378
379 return True
380
381 result = compare_dicts(
382 metadata[files[0]],
383 metadata[files[1]],
384 ordered=ordered,
385 diff_format=diff_format,
386 filter_key=filter_key,
387 filter_metadata_items=filter_metadata_items,
388 key_only=key_only
389 )
390
391 if not result:
392 msg.info("No differences found")
393
394 return list(sorted([r for r in result if r is not None ]))