From 9e385bf8fcb023b603ed1369c0e0982e8965a839 Mon Sep 17 00:00:00 2001 From: Frh Date: Thu, 30 Apr 2020 16:54:37 -0700 Subject: [PATCH] Fix plotting unit tests Enforce order of textline plotting for unit test consistency in 3.6. Create wrapper around camelot plot that enforces backwards consistency with older versions of matplotlib. --- .gitignore | 1 + camelot/parsers/hybrid.py | 2 +- camelot/plotting.py | 6 +- .../test_hybrid_contour_plot.png | Bin 105048 -> 105070 bytes .../test_hybrid_table_areas_text_plot.png | Bin 90041 -> 89989 bytes ...est_hybrid_table_regions_textedge_plot.png | Bin 91726 -> 91718 bytes .../test_hybrid_textedge_plot.png | Bin 103784 -> 104498 bytes tests/test_plotting.py | 58 +++++++----------- 8 files changed, 30 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index 3af88c1..da5b19a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ dist/ prof/ *.egg-info/ .eggs/ +.tox/ .coverage coverage.xml diff --git a/camelot/parsers/hybrid.py b/camelot/parsers/hybrid.py index 2488ed3..b80afc1 100644 --- a/camelot/parsers/hybrid.py +++ b/camelot/parsers/hybrid.py @@ -333,7 +333,7 @@ class TextNetworks(TextAlignments): key=lambda textline: ( self._textline_to_alignments[textline].alignment_score(), - -textline.y0 + -textline.y0, -textline.x0 ), default=None ) diff --git a/camelot/plotting.py b/camelot/plotting.py index e390464..7f009be 100644 --- a/camelot/plotting.py +++ b/camelot/plotting.py @@ -326,7 +326,11 @@ class PlotMethods(): alpha=0.5 ) ) - for tl, alignments in network._textline_to_alignments.items(): + for tl in sorted( + network._textline_to_alignments.keys(), + key=lambda textline: (-textline.y0, textline.x0) + ): + alignments = network._textline_to_alignments[tl] coords = get_textline_coords(tl) alignment_id_h, tls_h = alignments.max_v() alignment_id_v, tls_v = alignments.max_h() diff --git a/tests/files/baseline_plots/test_hybrid_contour_plot.png b/tests/files/baseline_plots/test_hybrid_contour_plot.png index 1b40ee918267fb52cd161c2055a25c0eecd9fd6f..10b3b1de1a812768533fbfd329be8d2d3d683d9b 100644 GIT binary patch delta 67090 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