From ebfd1e2bac00a8600bd9e8a6ffd6fa3b2df4f4e1 Mon Sep 17 00:00:00 2001 From: David Read Date: Tue, 12 Nov 2019 21:40:07 +0000 Subject: [PATCH] Remove PDF functionality - pdftables is unmaintained in 6 years --- CHANGELOG.md | 2 + Dockerfile | 1 - doc/index.rst | 13 ------ horror/simple.pdf | Bin 57231 -> 0 bytes messytables/__init__.py | 1 - messytables/any.py | 7 +-- messytables/pdf.py | 97 ---------------------------------------- requirements-test.txt | 1 - setup.py | 5 +-- test/test_any.py | 13 +----- test/test_read.py | 30 +------------ 11 files changed, 8 insertions(+), 162 deletions(-) delete mode 100644 horror/simple.pdf delete mode 100644 messytables/pdf.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e8f8cc..24c149a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +* Remove PDF functionality (PDFTableSet)- pdftables is not maintained + 0.15.2 (8 February 2017) * #165: detect ods types: boolean, currency, time and percentage. support repeated columns * #160: Correct spelling of separator in source diff --git a/Dockerfile b/Dockerfile index b682622..e77d800 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,5 +26,4 @@ WORKDIR /home/messytables COPY ./requirements-test.txt /home/messytables/ RUN pip install --user -r /home/messytables/requirements-test.txt RUN pip3 install --user -r /home/messytables/requirements-test.txt -RUN pip install --user pdftables COPY . /home/messytables/ diff --git a/doc/index.rst b/doc/index.rst index c5ed512..ac13688 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -144,19 +144,6 @@ tables is ill-defined. .. autoclass:: messytables.html.HTMLRowSet -PDF file support ----------------- - -The library supports PDF documents, using -`pdftables `_ to extract tables. - -Works only for PDFs which contain text information: somewhat erratic in quality. - -.. autoclass:: messytables.pdf.PDFTableSet - :members: tables - -.. autoclass:: messytables.pdf.PDFRowSet - ZIP file support ---------------- diff --git a/horror/simple.pdf b/horror/simple.pdf deleted file mode 100644 index 1877b9af3e808d980a4465ed176b3a0cd099c5db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57231 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 KM_EUO{{H~EzWwC@ diff --git a/messytables/__init__.py b/messytables/__init__.py index e2c03b9..8f27efb 100644 --- a/messytables/__init__.py +++ b/messytables/__init__.py @@ -19,7 +19,6 @@ from messytables.zip import ZIPTableSet from messytables.html import HTMLTableSet, HTMLRowSet -from messytables.pdf import PDFTableSet, PDFRowSet from messytables.any import any_tableset, AnyTableSet from messytables.jts import rowset_as_jts, headers_and_typed_as_jts diff --git a/messytables/any.py b/messytables/any.py index fd9dfc5..a6cd1ab 100644 --- a/messytables/any.py +++ b/messytables/any.py @@ -1,4 +1,4 @@ -from messytables import (ZIPTableSet, PDFTableSet, CSVTableSet, XLSTableSet, +from messytables import (ZIPTableSet, CSVTableSet, XLSTableSet, HTMLTableSet, ODSTableSet) import messytables import re @@ -21,7 +21,6 @@ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheetapplication/zip': 'XLS', 'text/html': 'HTML', 'application/xml': 'HTML', # XHTML is often served as application-xml - 'application/pdf': 'PDF', 'text/plain': 'CSV', # could be TAB. 'application/CDFV2-corrupt': 'XLS', 'application/CDFV2-unknown': 'XLS', @@ -38,8 +37,7 @@ def TABTableSet(fileobj): 'XLS': XLSTableSet, 'HTML': HTMLTableSet, 'CSV': CSVTableSet, - 'ODS': ODSTableSet, - 'PDF': PDFTableSet} + 'ODS': ODSTableSet} def clean_ext(filename): @@ -99,7 +97,6 @@ def guess_ext(ext): 'xlsx': 'XLS', 'htm': 'HTML', 'html': 'HTML', - 'pdf': 'PDF', 'xlt': 'XLS', # obscure Excel extensions taken from # http://en.wikipedia.org/wiki/List_of_Microsoft_Office_filename_extensions diff --git a/messytables/pdf.py b/messytables/pdf.py deleted file mode 100644 index 4f9052e..0000000 --- a/messytables/pdf.py +++ /dev/null @@ -1,97 +0,0 @@ -from messytables.core import RowSet, TableSet, Cell - -from messytables.types import StringType - -try: - from pdftables import get_tables -except ImportError as exc: - if "No module named" not in exc.args[0]: - raise - get_tables = None - - -class PDFCell(Cell): - - def __init__(self, pdftables_cell): - - self._cell = pdftables_cell - - if pdftables_cell.topleft: - w, h = pdftables_cell.size - self._properties = dict( - colspan=w, - rowspan=h, - ) - self.value = pdftables_cell.content - - else: - self._properties = {} - self.value = "" - - self.column = None - self.column_autogenerated = False - self.type = StringType() - - @property - def topleft(self): - return self._cell.topleft - - @property - def properties(self): - return self._properties - - -class PDFTableSet(TableSet): - """ - A TableSet from a PDF document. - """ - def __init__(self, fileobj=None, filename=None, **kw): - if get_tables is None: - raise ImportError("pdftables is not installed") - if filename is not None: - self.fh = open(filename, 'r') - elif fileobj is not None: - self.fh = fileobj - else: - raise TypeError('You must provide one of filename or fileobj') - self.raw_tables = get_tables(self.fh) - - def make_tables(self): - """ - Return a listing of tables (as PDFRowSets) in the table set. - """ - def table_name(table): - return "Table {0} of {1} on page {2} of {3}".format( - table.table_number_on_page, - table.total_tables_on_page, - table.page_number, - table.total_pages) - return [PDFRowSet(table_name(table), table) - for table in self.raw_tables] - - -class PDFRowSet(RowSet): - """ - A RowSet representing a PDF table. - """ - def __init__(self, name, table): - if get_tables is None: - raise ImportError("pdftables is not installed") - super(PDFRowSet, self).__init__() - self.name = name - self.table = table - self.meta = dict( - page_number=table.page_number + 1, - ) - - def raw(self, sample=False): - """ - Yield one row of cells at a time - """ - if hasattr(self.table, "cell_data"): - # New style of cell data. - for row in self.table.cell_data: - yield [PDFCell(pdf_cell) for pdf_cell in row] - else: - for row in self.table: - yield [Cell(pdf_cell) for pdf_cell in row] diff --git a/requirements-test.txt b/requirements-test.txt index 5fe995e..d3c62db 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,7 +1,6 @@ httpretty==0.8.6 nose==1.3.6 requests==2.20.0 -# pdftables==0.0.4 xlrd==0.9.3 python-magic==0.4.12 chardet==2.3.0 diff --git a/setup.py b/setup.py index 4f8f8ed..630a6cf 100644 --- a/setup.py +++ b/setup.py @@ -45,11 +45,10 @@ 'python-dateutil>=1.5.0', 'lxml>=3.2', 'requests', - 'six>=1.9', # until messytables->html5lib releases https://github.com/html5lib/html5lib-python/pull/301 - 'html5lib', + 'six>=1.9', # until messytables->html5lib releases https://github.com/html5lib/html5lib-python/pull/301 + 'html5lib', 'json-table-schema>=0.2, <=0.2.1' ], - extras_require={'pdf': ['pdftables>=0.0.4']}, tests_require=[], entry_points=\ """ diff --git a/test/test_any.py b/test/test_any.py index 1fbfe78..0aba8cd 100644 --- a/test/test_any.py +++ b/test/test_any.py @@ -4,7 +4,7 @@ from . import horror_fobj from nose.tools import assert_equal from nose.plugins.skip import SkipTest -from messytables import (any_tableset, XLSTableSet, ZIPTableSet, PDFTableSet, +from messytables import (any_tableset, XLSTableSet, ZIPTableSet, CSVTableSet, ODSTableSet, ReadError) @@ -17,17 +17,6 @@ 'tableset': XLSTableSet}, ] -# Special handling for PDFTables - skip if not installed -try: - import pdftables -except ImportError: - got_pdftables = False - suite.append({"filename": "simple.pdf", "tableset": False}) -else: - from messytables import PDFTableSet - got_pdftables = True - suite.append({"filename": "simple.pdf", "tableset": PDFTableSet}) - def test_simple(): for d in suite: diff --git a/test/test_read.py b/test/test_read.py index ec4dbdc..3e6e94c 100644 --- a/test/test_read.py +++ b/test/test_read.py @@ -14,7 +14,7 @@ from .shim26 import assert_is_instance, assert_greater_equal from messytables import (CSVTableSet, StringType, HTMLTableSet, - ZIPTableSet, XLSTableSet, XLSXTableSet, PDFTableSet, + ZIPTableSet, XLSTableSet, XLSXTableSet, ODSTableSet, headers_guess, headers_processor, offset_processor, DateType, FloatType, IntegerType, BoolType, rowset_as_jts, @@ -669,31 +669,3 @@ def test_html_table_name(self): assert_equal('Table 1 of 3', table_set.tables[0].name) assert_equal('Table 2 of 3', table_set.tables[1].name) assert_equal('Table 3 of 3', table_set.tables[2].name) - - -class ReadPdfTest(unittest.TestCase): - def setUp(self): - with horror_fobj('simple.pdf') as fh: - try: - PDFTableSet(fh) - except ImportError: - # Optional library isn't installed. Skip the tests. - raise SkipTest( - "pdftables is not installed, skipping PDF tests") - - def test_read_simple_pdf(self): - with horror_fobj('simple.pdf') as fh: - table_set = PDFTableSet(fh) - - assert_equal(1, len(list(table_set.tables))) - - (table,) = table_set.tables - rows = list(table) - - assert_greater_equal(len(rows), 1) - - def test_pdf_names(self): - with horror_fobj('simple.pdf') as fh: - table_set = PDFTableSet(fh) - assert_equal('Table 1 of 1 on page 1 of 1', - table_set.tables[0].name)