|
19 | 19 | from xml.etree import ElementTree |
20 | 20 |
|
21 | 21 | import dictdiffer |
| 22 | +import diff_pdf_visually |
22 | 23 | import jsonpath_ng |
23 | 24 | import yaml |
24 | 25 | from dicttoxml import dicttoxml |
25 | | -from diff_pdf_visually import pdf_similar |
| 26 | +from diff_pdf_visually import pdfdiff_pages |
26 | 27 |
|
27 | 28 | from dir_content_diff.util import diff_msg_formatter |
28 | 29 |
|
@@ -618,35 +619,114 @@ def diff(self, ref, comp, *args, **kwargs): |
618 | 619 |
|
619 | 620 | Keyword Args: |
620 | 621 | threshold (int): The threshold used to compare the images. |
621 | | - tempdir (pathlib.Path): Empty directory where the temporary images will be exported. |
| 622 | + tempdir (pathlib.Path): Directory in which a new ``dir-diff`` directory will be created |
| 623 | + to export the debug images. |
622 | 624 | dpi (int): The resolution used to convert the PDF files into images. |
623 | 625 | verbosity (int): The log verbosity. |
624 | 626 | max_report_pagenos (int): Only this number of the different pages will be logged (only |
625 | 627 | used if the verbosity is greater than 1). |
626 | 628 | num_threads (int): If set to 2 (the default), the image conversion are processed in |
627 | 629 | parallel. If set to 1 it is processed sequentially. |
628 | 630 | """ |
| 631 | + res = pdfdiff_pages(ref, comp, *args, **kwargs) |
| 632 | + if not res: |
| 633 | + return False |
| 634 | + return res |
| 635 | + |
| 636 | + def __call__(self, ref_file, comp_file, *args, **kwargs): |
| 637 | + """Process arguments before calling the diff method.""" |
629 | 638 | tempdir = kwargs.pop("tempdir", None) |
630 | 639 | if tempdir is not None: |
631 | 640 | relative_parts = [] |
632 | | - for i, j in zip(ref.parts[::-1], comp.parts[::-1]): # pragma: no branch |
| 641 | + for i, j in zip( |
| 642 | + ref_file.parts[::-1], comp_file.parts[::-1] |
| 643 | + ): # pragma: no branch |
633 | 644 | if i != j: |
634 | 645 | break |
635 | 646 | relative_parts.append(i) |
| 647 | + if relative_parts and relative_parts[-1] == Path(tempdir).root: |
| 648 | + relative_parts.pop() |
636 | 649 | if not relative_parts: |
637 | | - relative_parts.append(comp.name) |
638 | | - relative_parts[-1] = "diff-pdf-" + relative_parts[-1] |
| 650 | + relative_parts.append(comp_file.name) |
| 651 | + relative_parts.append("diff-pdf") |
639 | 652 | new_tempdir = Path(tempdir) / Path(*relative_parts[::-1]) |
640 | 653 |
|
641 | 654 | # Deduplicate name if needed |
| 655 | + last_part = str(relative_parts[-1]) |
642 | 656 | num = 1 |
643 | 657 | while True: |
644 | | - try: |
| 658 | + root = Path(tempdir) / relative_parts[-1] |
| 659 | + if not root.exists(): |
645 | 660 | new_tempdir.mkdir(parents=True, exist_ok=False) |
646 | 661 | break |
647 | | - except FileExistsError: |
648 | | - new_tempdir = new_tempdir.with_name(new_tempdir.name + f"_{num}") |
649 | | - num += 1 |
| 662 | + relative_parts[-1] = last_part + f"_{num}" |
| 663 | + new_tempdir = Path(tempdir) / Path(*relative_parts[::-1]) |
| 664 | + num += 1 |
650 | 665 |
|
651 | 666 | kwargs["tempdir"] = new_tempdir |
652 | | - return not pdf_similar(ref, comp, *args, **kwargs) |
| 667 | + |
| 668 | + try: |
| 669 | + # Update default verbosity |
| 670 | + if "verbosity" not in kwargs: # pragma: no branch |
| 671 | + current_default_verbosity = int( |
| 672 | + diff_pdf_visually.constants.DEFAULT_VERBOSITY |
| 673 | + ) |
| 674 | + try: |
| 675 | + if ( |
| 676 | + diff_pdf_visually.diff.pdfdiff_pages.__defaults__[1] is None |
| 677 | + ): # pragma: no cover |
| 678 | + diff_pdf_visually.constants.DEFAULT_VERBOSITY = 0 |
| 679 | + else: |
| 680 | + kwargs["verbosity"] = 0 |
| 681 | + finally: |
| 682 | + diff_pdf_visually.constants.DEFAULT_VERBOSITY = ( |
| 683 | + current_default_verbosity |
| 684 | + ) |
| 685 | + return super().__call__(ref_file, comp_file, *args, **kwargs) |
| 686 | + finally: |
| 687 | + diff_pdf_visually.constants.DEFAULT_VERBOSITY = current_default_verbosity |
| 688 | + |
| 689 | + def report( |
| 690 | + self, |
| 691 | + ref_file, |
| 692 | + comp_file, |
| 693 | + formatted_differences, |
| 694 | + diff_args, |
| 695 | + diff_kwargs, |
| 696 | + load_kwargs=None, |
| 697 | + format_data_kwargs=None, |
| 698 | + filter_kwargs=None, |
| 699 | + format_diff_kwargs=None, |
| 700 | + sort_kwargs=None, |
| 701 | + concat_kwargs=None, |
| 702 | + **kwargs, |
| 703 | + ): # pylint: disable=too-many-arguments |
| 704 | + """Add specific information before calling the default method.""" |
| 705 | + if formatted_differences and isinstance(formatted_differences, str): |
| 706 | + formatted_differences = ( |
| 707 | + "The following pages are the most different: " |
| 708 | + + formatted_differences.replace("\n", ", ") |
| 709 | + ) |
| 710 | + if "tempdir" in diff_kwargs: |
| 711 | + formatted_differences += ( |
| 712 | + "\nThe visual differences can be found here: " |
| 713 | + + str(diff_kwargs["tempdir"]) |
| 714 | + ) |
| 715 | + return super().report( |
| 716 | + ref_file, |
| 717 | + comp_file, |
| 718 | + formatted_differences, |
| 719 | + diff_args, |
| 720 | + diff_kwargs, |
| 721 | + load_kwargs=load_kwargs, |
| 722 | + format_data_kwargs=format_data_kwargs, |
| 723 | + filter_kwargs=filter_kwargs, |
| 724 | + format_diff_kwargs=format_diff_kwargs, |
| 725 | + sort_kwargs=sort_kwargs, |
| 726 | + concat_kwargs=concat_kwargs, |
| 727 | + **kwargs, |
| 728 | + ) |
| 729 | + |
| 730 | + def format_diff(self, difference, **kwargs): |
| 731 | + """Format one element difference.""" |
| 732 | + return str(difference) |
0 commit comments