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):
345
346 if drop is not None:
347 for drop_key in drop:
348 if not regex:
349 if not drop_key.startswith("metadata_items/"):
350 continue
351
352 drop_key = drop_key[len("metadata_items/"):]
353
354 if key_str.startswith(drop_key):
355 return False
356 else:
357 if not drop_key.pattern.startswith("metadata_items/"):
358 continue
359
360 drop_key = re.compile(drop_key.pattern[len("metadata_items/"):])
361
362 if drop_key.match(key_str):
363 return False
364
365 return True
366
367 def filter_key(key):
369
370 if drop is not None:
371 for drop_key in drop:
372 if not regex:
373 if key_str.startswith(drop_key):
374 return False
375 else:
376 if drop_key.match(key_str):
377 return False
378
379 if ignore_trigger:
380 for trigger_key in trigger_keys:
381 if key_str.startswith(trigger_key):
382 return False
383
384 return True
385
386 result = compare_dicts(
387 metadata[files[0]],
388 metadata[files[1]],
389 ordered=ordered,
390 diff_format=diff_format,
391 filter_key=filter_key,
392 filter_metadata_items=filter_metadata_items,
393 key_only=key_only
394 )
395
396 if not result:
397 msg.info("No differences found")
398
399 return list(sorted([r for r in result if r is not None ]))