2023-04-17 23:11:21 -07:00
|
|
|
|
import json
|
2023-01-09 16:15:14 -05:00
|
|
|
|
import os
|
|
|
|
|
import pathlib
|
2023-01-27 12:08:18 -05:00
|
|
|
|
import warnings
|
2023-05-15 13:23:19 -05:00
|
|
|
|
from importlib import import_module
|
2023-03-10 22:16:05 -05:00
|
|
|
|
from unittest.mock import patch
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
|
|
|
|
import docx
|
2023-02-27 17:30:54 +01:00
|
|
|
|
import pytest
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
2023-05-16 15:40:40 -04:00
|
|
|
|
from unstructured.cleaners.core import clean_extra_whitespace
|
2023-02-27 17:30:54 +01:00
|
|
|
|
from unstructured.documents.elements import (
|
|
|
|
|
Address,
|
2023-05-15 13:23:19 -05:00
|
|
|
|
ElementMetadata,
|
2023-02-27 17:30:54 +01:00
|
|
|
|
ListItem,
|
|
|
|
|
NarrativeText,
|
|
|
|
|
PageBreak,
|
2023-05-16 15:40:40 -04:00
|
|
|
|
Table,
|
2023-02-27 17:30:54 +01:00
|
|
|
|
Text,
|
|
|
|
|
Title,
|
|
|
|
|
)
|
2023-05-15 13:23:19 -05:00
|
|
|
|
from unstructured.file_utils.filetype import FILETYPE_TO_MIMETYPE, FileType
|
2023-02-27 17:30:54 +01:00
|
|
|
|
from unstructured.partition import auto
|
2023-01-09 16:15:14 -05:00
|
|
|
|
from unstructured.partition.auto import partition
|
2023-02-17 09:30:23 -05:00
|
|
|
|
from unstructured.partition.common import convert_office_doc
|
2023-04-17 23:11:21 -07:00
|
|
|
|
from unstructured.staging.base import elements_to_json
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
2023-01-23 12:03:09 -05:00
|
|
|
|
DIRECTORY = pathlib.Path(__file__).parent.resolve()
|
|
|
|
|
EXAMPLE_DOCS_DIRECTORY = os.path.join(DIRECTORY, "..", "..", "example-docs")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
|
|
|
|
EXPECTED_EMAIL_OUTPUT = [
|
|
|
|
|
NarrativeText(text="This is a test email to use for unit tests."),
|
|
|
|
|
Title(text="Important points:"),
|
|
|
|
|
ListItem(text="Roses are red"),
|
|
|
|
|
ListItem(text="Violets are blue"),
|
|
|
|
|
]
|
|
|
|
|
|
2023-03-30 16:54:29 -04:00
|
|
|
|
is_in_docker = os.path.exists("/.dockerenv")
|
|
|
|
|
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
|
|
|
|
def test_auto_partition_email_from_filename():
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-email.eml")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
assert elements == EXPECTED_EMAIL_OUTPUT
|
2023-05-12 11:33:01 -04:00
|
|
|
|
assert elements[0].metadata.filename == os.path.basename(filename)
|
2023-05-15 18:25:39 -04:00
|
|
|
|
assert elements[0].metadata.file_directory == os.path.split(filename)[0]
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_email_from_file():
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-email.eml")
|
2023-02-27 17:30:54 +01:00
|
|
|
|
with open(filename) as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
assert elements == EXPECTED_EMAIL_OUTPUT
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_email_from_file_rb():
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-email.eml")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
with open(filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
assert elements == EXPECTED_EMAIL_OUTPUT
|
|
|
|
|
|
|
|
|
|
|
2023-02-27 17:30:54 +01:00
|
|
|
|
@pytest.fixture()
|
2023-01-09 16:15:14 -05:00
|
|
|
|
def mock_docx_document():
|
|
|
|
|
document = docx.Document()
|
|
|
|
|
|
|
|
|
|
document.add_paragraph("These are a few of my favorite things:", style="Heading 1")
|
|
|
|
|
# NOTE(robinson) - this should get picked up as a list item due to the •
|
|
|
|
|
document.add_paragraph("• Parrots", style="Normal")
|
|
|
|
|
document.add_paragraph("Hockey", style="List Bullet")
|
|
|
|
|
# NOTE(robinson) - this should get picked up as a title
|
|
|
|
|
document.add_paragraph("Analysis", style="Normal")
|
|
|
|
|
# NOTE(robinson) - this should get dropped because it is empty
|
|
|
|
|
document.add_paragraph("", style="Normal")
|
|
|
|
|
# NOTE(robinson) - this should get picked up as a narrative text
|
|
|
|
|
document.add_paragraph("This is my first thought. This is my second thought.", style="Normal")
|
|
|
|
|
document.add_paragraph("This is my third thought.", style="Body Text")
|
|
|
|
|
# NOTE(robinson) - this should just be regular text
|
|
|
|
|
document.add_paragraph("2023")
|
|
|
|
|
|
|
|
|
|
return document
|
|
|
|
|
|
|
|
|
|
|
2023-02-27 17:30:54 +01:00
|
|
|
|
@pytest.fixture()
|
2023-01-09 16:15:14 -05:00
|
|
|
|
def expected_docx_elements():
|
|
|
|
|
return [
|
|
|
|
|
Title("These are a few of my favorite things:"),
|
|
|
|
|
ListItem("Parrots"),
|
|
|
|
|
ListItem("Hockey"),
|
|
|
|
|
Title("Analysis"),
|
|
|
|
|
NarrativeText("This is my first thought. This is my second thought."),
|
|
|
|
|
NarrativeText("This is my third thought."),
|
|
|
|
|
Text("2023"),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_docx_with_filename(mock_docx_document, expected_docx_elements, tmpdir):
|
|
|
|
|
filename = os.path.join(tmpdir.dirname, "mock_document.docx")
|
|
|
|
|
mock_docx_document.save(filename)
|
|
|
|
|
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
assert elements == expected_docx_elements
|
2023-05-12 11:33:01 -04:00
|
|
|
|
assert elements[0].metadata.filename == os.path.basename(filename)
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_docx_with_file(mock_docx_document, expected_docx_elements, tmpdir):
|
|
|
|
|
filename = os.path.join(tmpdir.dirname, "mock_document.docx")
|
|
|
|
|
mock_docx_document.save(filename)
|
|
|
|
|
|
|
|
|
|
with open(filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
assert elements == expected_docx_elements
|
|
|
|
|
|
|
|
|
|
|
2023-03-24 16:32:45 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("pass_file_filename", "content_type"),
|
|
|
|
|
[(False, None), (False, "application/msword"), (True, "application/msword"), (True, None)],
|
|
|
|
|
)
|
|
|
|
|
def test_auto_partition_doc_with_filename(
|
|
|
|
|
mock_docx_document,
|
|
|
|
|
expected_docx_elements,
|
|
|
|
|
tmpdir,
|
|
|
|
|
pass_file_filename,
|
|
|
|
|
content_type,
|
|
|
|
|
):
|
2023-02-17 09:30:23 -05:00
|
|
|
|
docx_filename = os.path.join(tmpdir.dirname, "mock_document.docx")
|
|
|
|
|
doc_filename = os.path.join(tmpdir.dirname, "mock_document.doc")
|
|
|
|
|
mock_docx_document.save(docx_filename)
|
|
|
|
|
convert_office_doc(docx_filename, tmpdir.dirname, "doc")
|
2023-03-24 16:32:45 -07:00
|
|
|
|
file_filename = doc_filename if pass_file_filename else None
|
|
|
|
|
elements = partition(
|
|
|
|
|
filename=doc_filename,
|
|
|
|
|
file_filename=file_filename,
|
|
|
|
|
content_type=content_type,
|
2023-05-15 15:26:53 -04:00
|
|
|
|
strategy="hi_res",
|
2023-03-24 16:32:45 -07:00
|
|
|
|
)
|
2023-02-17 09:30:23 -05:00
|
|
|
|
assert elements == expected_docx_elements
|
2023-05-12 11:33:01 -04:00
|
|
|
|
assert elements[0].metadata.filename == "mock_document.doc"
|
2023-05-15 18:25:39 -04:00
|
|
|
|
assert elements[0].metadata.file_directory == tmpdir.dirname
|
2023-02-17 09:30:23 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# NOTE(robinson) - the application/x-ole-storage mime type is not specific enough to
|
|
|
|
|
# determine that the file is an .doc document
|
2023-02-27 17:30:54 +01:00
|
|
|
|
@pytest.mark.xfail()
|
2023-02-17 09:30:23 -05:00
|
|
|
|
def test_auto_partition_doc_with_file(mock_docx_document, expected_docx_elements, tmpdir):
|
|
|
|
|
docx_filename = os.path.join(tmpdir.dirname, "mock_document.docx")
|
|
|
|
|
doc_filename = os.path.join(tmpdir.dirname, "mock_document.doc")
|
|
|
|
|
mock_docx_document.save(docx_filename)
|
|
|
|
|
convert_office_doc(docx_filename, tmpdir.dirname, "doc")
|
|
|
|
|
|
|
|
|
|
with open(doc_filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-02-17 09:30:23 -05:00
|
|
|
|
assert elements == expected_docx_elements
|
|
|
|
|
|
|
|
|
|
|
2023-03-24 16:32:45 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("pass_file_filename", "content_type"),
|
|
|
|
|
[(False, None), (False, "text/html"), (True, "text/html"), (True, None)],
|
|
|
|
|
)
|
|
|
|
|
def test_auto_partition_html_from_filename(pass_file_filename, content_type):
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "example-10k.html")
|
2023-03-24 16:32:45 -07:00
|
|
|
|
file_filename = filename if pass_file_filename else None
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(
|
|
|
|
|
filename=filename,
|
|
|
|
|
file_filename=file_filename,
|
|
|
|
|
content_type=content_type,
|
|
|
|
|
strategy="hi_res",
|
|
|
|
|
)
|
2023-01-09 16:15:14 -05:00
|
|
|
|
assert len(elements) > 0
|
2023-05-12 11:33:01 -04:00
|
|
|
|
assert elements[0].metadata.filename == os.path.basename(filename)
|
2023-05-15 18:25:39 -04:00
|
|
|
|
assert elements[0].metadata.file_directory == os.path.split(filename)[0]
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
|
|
|
|
|
2023-03-24 16:32:45 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("pass_file_filename", "content_type"),
|
|
|
|
|
[(False, None), (False, "text/html"), (True, "text/html"), (True, None)],
|
|
|
|
|
)
|
|
|
|
|
def test_auto_partition_html_from_file(pass_file_filename, content_type):
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-html.html")
|
2023-03-24 16:32:45 -07:00
|
|
|
|
file_filename = filename if pass_file_filename else None
|
2023-02-27 17:30:54 +01:00
|
|
|
|
with open(filename) as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(
|
|
|
|
|
file=f,
|
|
|
|
|
file_filename=file_filename,
|
|
|
|
|
content_type=content_type,
|
|
|
|
|
strategy="hi_res",
|
|
|
|
|
)
|
2023-01-09 16:15:14 -05:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_html_from_file_rb():
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-html.html")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
with open(filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
|
|
|
|
|
|
2023-04-17 23:11:21 -07:00
|
|
|
|
def test_auto_partition_json_from_filename():
|
|
|
|
|
"""Test auto-processing an unstructured json output file by filename."""
|
|
|
|
|
filename = os.path.join(
|
|
|
|
|
EXAMPLE_DOCS_DIRECTORY,
|
|
|
|
|
"..",
|
|
|
|
|
"test_unstructured_ingest",
|
|
|
|
|
"expected-structured-output",
|
|
|
|
|
"azure-blob-storage",
|
|
|
|
|
"spring-weather.html.json",
|
|
|
|
|
)
|
|
|
|
|
with open(filename) as json_f:
|
|
|
|
|
json_data = json.load(json_f)
|
2023-05-15 15:26:53 -04:00
|
|
|
|
json_elems = json.loads(elements_to_json(partition(filename=filename, strategy="hi_res")))
|
2023-04-17 23:11:21 -07:00
|
|
|
|
for elem in json_elems:
|
|
|
|
|
# coordinates are always in the element data structures, even if None
|
|
|
|
|
elem.pop("coordinates")
|
2023-05-15 13:23:19 -05:00
|
|
|
|
elem.pop("metadata")
|
|
|
|
|
for elem in json_data:
|
|
|
|
|
elem.pop("metadata")
|
2023-04-17 23:11:21 -07:00
|
|
|
|
assert json_data == json_elems
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.xfail(
|
|
|
|
|
reason="parsed as text not json, https://github.com/Unstructured-IO/unstructured/issues/492",
|
|
|
|
|
)
|
|
|
|
|
def test_auto_partition_json_from_file():
|
|
|
|
|
"""Test auto-processing an unstructured json output file by file handle."""
|
|
|
|
|
filename = os.path.join(
|
|
|
|
|
EXAMPLE_DOCS_DIRECTORY,
|
|
|
|
|
"..",
|
|
|
|
|
"test_unstructured_ingest",
|
|
|
|
|
"expected-structured-output",
|
|
|
|
|
"azure-blob-storage",
|
|
|
|
|
"spring-weather.html.json",
|
|
|
|
|
)
|
|
|
|
|
with open(filename) as json_f:
|
|
|
|
|
json_data = json.load(json_f)
|
|
|
|
|
with open(filename, encoding="utf-8") as partition_f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
json_elems = json.loads(elements_to_json(partition(file=partition_f, strategy="hi_res")))
|
2023-04-17 23:11:21 -07:00
|
|
|
|
for elem in json_elems:
|
|
|
|
|
# coordinates are always in the element data structures, even if None
|
|
|
|
|
elem.pop("coordinates")
|
|
|
|
|
assert json_data == json_elems
|
|
|
|
|
|
|
|
|
|
|
2023-01-13 16:39:53 -05:00
|
|
|
|
EXPECTED_TEXT_OUTPUT = [
|
|
|
|
|
NarrativeText(text="This is a test document to use for unit tests."),
|
2023-01-26 10:52:25 -05:00
|
|
|
|
Address(text="Doylestown, PA 18901"),
|
2023-01-13 16:39:53 -05:00
|
|
|
|
Title(text="Important points:"),
|
|
|
|
|
ListItem(text="Hamburgers are delicious"),
|
|
|
|
|
ListItem(text="Dogs are the best"),
|
|
|
|
|
ListItem(text="I love fuzzy blankets"),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_text_from_filename():
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-text.txt")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-01-13 16:39:53 -05:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
assert elements == EXPECTED_TEXT_OUTPUT
|
2023-05-12 11:33:01 -04:00
|
|
|
|
assert elements[0].metadata.filename == os.path.basename(filename)
|
2023-05-15 18:25:39 -04:00
|
|
|
|
assert elements[0].metadata.file_directory == os.path.split(filename)[0]
|
2023-01-13 16:39:53 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_text_from_file():
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-text.txt")
|
2023-02-27 17:30:54 +01:00
|
|
|
|
with open(filename) as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-01-13 16:39:53 -05:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
assert elements == EXPECTED_TEXT_OUTPUT
|
2023-01-27 12:08:18 -05:00
|
|
|
|
|
|
|
|
|
|
2023-03-24 16:32:45 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("pass_file_filename", "content_type"),
|
|
|
|
|
[(False, None), (False, "application/pdf"), (True, "application/pdf"), (True, None)],
|
|
|
|
|
)
|
2023-05-31 13:50:15 -05:00
|
|
|
|
def test_auto_partition_pdf_from_filename(pass_file_filename, content_type, request):
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "layout-parser-paper-fast.pdf")
|
2023-03-24 16:32:45 -07:00
|
|
|
|
file_filename = filename if pass_file_filename else None
|
|
|
|
|
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(
|
|
|
|
|
filename=filename,
|
|
|
|
|
file_filename=file_filename,
|
|
|
|
|
content_type=content_type,
|
|
|
|
|
strategy="hi_res",
|
|
|
|
|
)
|
2023-01-19 09:29:28 -05:00
|
|
|
|
|
|
|
|
|
assert isinstance(elements[0], Title)
|
|
|
|
|
assert elements[0].text.startswith("LayoutParser")
|
|
|
|
|
|
2023-05-12 11:33:01 -04:00
|
|
|
|
assert elements[0].metadata.filename == os.path.basename(filename)
|
2023-05-15 18:25:39 -04:00
|
|
|
|
assert elements[0].metadata.file_directory == os.path.split(filename)[0]
|
2023-02-15 13:26:20 -05:00
|
|
|
|
|
2023-05-31 13:50:15 -05:00
|
|
|
|
# NOTE(alan): Xfail since new model skips the word Zejiang
|
|
|
|
|
request.applymarker(pytest.mark.xfail)
|
|
|
|
|
|
|
|
|
|
assert isinstance(elements[1], NarrativeText)
|
|
|
|
|
assert elements[1].text.startswith("Zejiang Shen")
|
|
|
|
|
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
2023-04-21 12:01:29 -05:00
|
|
|
|
def test_auto_partition_pdf_uses_table_extraction():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "layout-parser-paper-fast.pdf")
|
|
|
|
|
with patch(
|
|
|
|
|
"unstructured_inference.inference.layout.process_file_with_model",
|
|
|
|
|
) as mock_process_file_with_model:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
partition(filename, pdf_infer_table_structure=True, strategy="hi_res")
|
2023-04-21 12:01:29 -05:00
|
|
|
|
assert mock_process_file_with_model.call_args[1]["extract_tables"]
|
|
|
|
|
|
|
|
|
|
|
2023-03-10 22:16:05 -05:00
|
|
|
|
def test_auto_partition_pdf_with_fast_strategy():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "layout-parser-paper-fast.pdf")
|
|
|
|
|
|
|
|
|
|
mock_return = [NarrativeText("Hello there!")]
|
|
|
|
|
with patch.object(auto, "partition_pdf", return_value=mock_return) as mock_partition:
|
|
|
|
|
partition(filename=filename, strategy="fast")
|
|
|
|
|
|
|
|
|
|
mock_partition.assert_called_once_with(
|
|
|
|
|
filename=filename,
|
|
|
|
|
file=None,
|
|
|
|
|
url=None,
|
|
|
|
|
include_page_breaks=False,
|
2023-04-21 13:48:19 -05:00
|
|
|
|
infer_table_structure=False,
|
2023-03-10 22:16:05 -05:00
|
|
|
|
strategy="fast",
|
2023-04-21 09:41:26 -04:00
|
|
|
|
ocr_languages="eng",
|
2023-03-10 22:16:05 -05:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2023-03-24 16:32:45 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("pass_file_filename", "content_type"),
|
|
|
|
|
[(False, None), (False, "application/pdf"), (True, "application/pdf"), (True, None)],
|
|
|
|
|
)
|
2023-05-31 13:50:15 -05:00
|
|
|
|
def test_auto_partition_pdf_from_file(pass_file_filename, content_type, request):
|
2023-01-23 12:03:09 -05:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "layout-parser-paper-fast.pdf")
|
2023-03-24 16:32:45 -07:00
|
|
|
|
file_filename = filename if pass_file_filename else None
|
|
|
|
|
|
2023-01-09 16:15:14 -05:00
|
|
|
|
with open(filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(
|
|
|
|
|
file=f,
|
|
|
|
|
file_filename=file_filename,
|
|
|
|
|
content_type=content_type,
|
|
|
|
|
strategy="hi_res",
|
|
|
|
|
)
|
2023-01-27 12:08:18 -05:00
|
|
|
|
|
|
|
|
|
assert isinstance(elements[0], Title)
|
|
|
|
|
assert elements[0].text.startswith("LayoutParser")
|
|
|
|
|
|
2023-05-31 13:50:15 -05:00
|
|
|
|
# NOTE(alan): Xfail since new model misses the first word Zejiang
|
|
|
|
|
request.applymarker(pytest.mark.xfail)
|
|
|
|
|
|
2023-01-27 12:08:18 -05:00
|
|
|
|
assert isinstance(elements[1], NarrativeText)
|
2023-04-04 19:59:06 -07:00
|
|
|
|
assert elements[1].text.startswith("Zejiang Shen")
|
2023-01-27 12:08:18 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_partition_pdf_doesnt_raise_warning():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "layout-parser-paper-fast.pdf")
|
|
|
|
|
# NOTE(robinson): This is the recommended way to check that no warning is emitted,
|
|
|
|
|
# per the pytest docs.
|
|
|
|
|
# ref: https://docs.pytest.org/en/7.0.x/how-to/capture-warnings.html
|
|
|
|
|
# #additional-use-cases-of-warnings-in-tests
|
|
|
|
|
with warnings.catch_warnings():
|
|
|
|
|
warnings.simplefilter("error")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
partition(filename=filename, strategy="hi_res")
|
2023-01-09 16:15:14 -05:00
|
|
|
|
|
|
|
|
|
|
2023-03-24 16:32:45 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("pass_file_filename", "content_type"),
|
|
|
|
|
[(False, None), (False, "image/jpeg"), (True, "image/jpeg"), (True, None)],
|
|
|
|
|
)
|
|
|
|
|
def test_auto_partition_jpg(pass_file_filename, content_type):
|
2023-05-12 13:45:08 -04:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "layout-parser-paper-fast.jpg")
|
2023-03-24 16:32:45 -07:00
|
|
|
|
file_filename = filename if pass_file_filename else None
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(
|
|
|
|
|
filename=filename,
|
|
|
|
|
file_filename=file_filename,
|
|
|
|
|
content_type=content_type,
|
2023-06-09 13:54:18 -04:00
|
|
|
|
strategy="auto",
|
2023-05-15 15:26:53 -04:00
|
|
|
|
)
|
2023-01-13 22:24:13 -06:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
|
|
|
|
|
|
2023-03-24 16:32:45 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("pass_file_filename", "content_type"),
|
|
|
|
|
[(False, None), (False, "image/jpeg"), (True, "image/jpeg"), (True, None)],
|
|
|
|
|
)
|
|
|
|
|
def test_auto_partition_jpg_from_file(pass_file_filename, content_type):
|
2023-05-12 13:45:08 -04:00
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "layout-parser-paper-fast.jpg")
|
2023-03-24 16:32:45 -07:00
|
|
|
|
file_filename = filename if pass_file_filename else None
|
2023-01-13 22:24:13 -06:00
|
|
|
|
with open(filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(
|
|
|
|
|
file=f,
|
|
|
|
|
file_filename=file_filename,
|
|
|
|
|
content_type=content_type,
|
2023-06-09 13:54:18 -04:00
|
|
|
|
strategy="auto",
|
2023-05-15 15:26:53 -04:00
|
|
|
|
)
|
2023-01-13 22:24:13 -06:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
|
|
|
|
|
|
2023-01-09 16:15:14 -05:00
|
|
|
|
def test_auto_partition_raises_with_bad_type(monkeypatch):
|
|
|
|
|
monkeypatch.setattr(auto, "detect_filetype", lambda *args, **kwargs: None)
|
|
|
|
|
with pytest.raises(ValueError):
|
2023-05-15 15:26:53 -04:00
|
|
|
|
partition(filename="made-up.fake", strategy="hi_res")
|
2023-01-23 12:03:09 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECTED_PPTX_OUTPUT = [
|
|
|
|
|
Title(text="Adding a Bullet Slide"),
|
|
|
|
|
ListItem(text="Find the bullet slide layout"),
|
|
|
|
|
ListItem(text="Use _TextFrame.text for first bullet"),
|
|
|
|
|
ListItem(text="Use _TextFrame.add_paragraph() for subsequent bullets"),
|
|
|
|
|
NarrativeText(text="Here is a lot of text!"),
|
|
|
|
|
NarrativeText(text="Here is some text in a text box!"),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_pptx_from_filename():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-power-point.pptx")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-01-23 12:03:09 -05:00
|
|
|
|
assert elements == EXPECTED_PPTX_OUTPUT
|
2023-05-12 11:33:01 -04:00
|
|
|
|
assert elements[0].metadata.filename == os.path.basename(filename)
|
2023-05-15 18:25:39 -04:00
|
|
|
|
assert elements[0].metadata.file_directory == os.path.split(filename)[0]
|
2023-02-08 10:11:15 -05:00
|
|
|
|
|
|
|
|
|
|
2023-03-30 16:54:29 -04:00
|
|
|
|
@pytest.mark.skipif(is_in_docker, reason="Skipping this test in Docker container")
|
2023-02-17 11:57:08 -05:00
|
|
|
|
def test_auto_partition_ppt_from_filename():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-power-point.ppt")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-02-17 11:57:08 -05:00
|
|
|
|
assert elements == EXPECTED_PPTX_OUTPUT
|
2023-05-12 11:33:01 -04:00
|
|
|
|
assert elements[0].metadata.filename == os.path.basename(filename)
|
2023-05-15 18:25:39 -04:00
|
|
|
|
assert elements[0].metadata.file_directory == os.path.split(filename)[0]
|
2023-02-17 11:57:08 -05:00
|
|
|
|
|
|
|
|
|
|
2023-02-08 10:11:15 -05:00
|
|
|
|
def test_auto_with_page_breaks():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "layout-parser-paper-fast.pdf")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, include_page_breaks=True, strategy="hi_res")
|
2023-02-08 10:11:15 -05:00
|
|
|
|
assert PageBreak() in elements
|
2023-03-14 11:52:21 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_epub_from_filename():
|
|
|
|
|
filename = os.path.join(DIRECTORY, "..", "..", "example-docs", "winter-sports.epub")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-03-14 11:52:21 -04:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
assert elements[0].text.startswith("The Project Gutenberg eBook of Winter Sports")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_epub_from_file():
|
|
|
|
|
filename = os.path.join(DIRECTORY, "..", "..", "example-docs", "winter-sports.epub")
|
|
|
|
|
with open(filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-03-14 11:52:21 -04:00
|
|
|
|
assert len(elements) > 0
|
|
|
|
|
assert elements[0].text.startswith("The Project Gutenberg eBook of Winter Sports")
|
2023-03-28 16:15:22 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECTED_MSG_OUTPUT = [
|
|
|
|
|
NarrativeText(text="This is a test email to use for unit tests."),
|
|
|
|
|
Title(text="Important points:"),
|
|
|
|
|
ListItem(text="Roses are red"),
|
|
|
|
|
ListItem(text="Violets are blue"),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_msg_from_filename():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-email.msg")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-03-28 16:15:22 -04:00
|
|
|
|
assert elements == EXPECTED_MSG_OUTPUT
|
2023-04-10 17:25:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_rtf_from_filename():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-doc.rtf")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-04-10 17:25:03 -04:00
|
|
|
|
assert elements[0] == Title("My First Heading")
|
2023-04-12 14:31:01 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_from_url():
|
|
|
|
|
url = "https://raw.githubusercontent.com/Unstructured-IO/unstructured/main/LICENSE.md"
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(url=url, content_type="text/plain", strategy="hi_res")
|
2023-04-12 14:31:01 -04:00
|
|
|
|
assert elements[0] == Title("Apache License")
|
|
|
|
|
assert elements[0].metadata.url == url
|
2023-04-13 11:04:15 -04:00
|
|
|
|
|
|
|
|
|
|
2023-04-13 12:47:45 -04:00
|
|
|
|
def test_partition_md_works_with_embedded_html():
|
|
|
|
|
url = "https://raw.githubusercontent.com/Unstructured-IO/unstructured/main/README.md"
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(url=url, content_type="text/markdown", strategy="hi_res")
|
2023-04-13 12:47:45 -04:00
|
|
|
|
elements[0].text
|
|
|
|
|
unstructured_found = False
|
|
|
|
|
for element in elements:
|
|
|
|
|
if "unstructured" in elements[0].text:
|
|
|
|
|
unstructured_found = True
|
|
|
|
|
break
|
|
|
|
|
assert unstructured_found is True
|
|
|
|
|
|
|
|
|
|
|
2023-04-13 11:04:15 -04:00
|
|
|
|
def test_auto_partition_warns_if_header_set_and_not_url(caplog):
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-email.eml")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
partition(filename=filename, headers={"Accept": "application/pdf"}, strategy="hi_res")
|
2023-04-13 11:04:15 -04:00
|
|
|
|
assert caplog.records[0].levelname == "WARNING"
|
2023-04-26 13:52:47 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_works_with_unstructured_jsons():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "spring-weather.html.json")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-04-26 13:52:47 -04:00
|
|
|
|
assert elements[0].text == "News Around NOAA"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_works_with_unstructured_jsons_from_file():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "spring-weather.html.json")
|
|
|
|
|
with open(filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-04-26 13:52:47 -04:00
|
|
|
|
assert elements[0].text == "News Around NOAA"
|
2023-05-04 15:28:08 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_odt_from_filename():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake.odt")
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(filename=filename, strategy="hi_res")
|
2023-05-04 15:28:08 -04:00
|
|
|
|
assert elements == [Title("Lorem ipsum dolor sit amet.")]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_odt_from_file():
|
|
|
|
|
filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake.odt")
|
|
|
|
|
with open(filename, "rb") as f:
|
2023-05-15 15:26:53 -04:00
|
|
|
|
elements = partition(file=f, strategy="hi_res")
|
2023-05-04 15:28:08 -04:00
|
|
|
|
|
|
|
|
|
assert elements == [Title("Lorem ipsum dolor sit amet.")]
|
2023-05-15 13:23:19 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("content_type", "routing_func", "expected"),
|
|
|
|
|
[
|
|
|
|
|
("application/json", "json", "application/json"),
|
|
|
|
|
("text/html", "html", "text/html"),
|
|
|
|
|
("jdsfjdfsjkds", "pdf", None),
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
def test_auto_adds_filetype_to_metadata(content_type, routing_func, expected):
|
|
|
|
|
with patch(
|
|
|
|
|
f"unstructured.partition.auto.partition_{routing_func}",
|
|
|
|
|
lambda *args, **kwargs: [Text("text 1"), Text("text 2")],
|
|
|
|
|
):
|
|
|
|
|
elements = partition("example-docs/layout-parser-paper-fast.pdf", content_type=content_type)
|
|
|
|
|
assert len(elements) == 2
|
|
|
|
|
assert all(el.metadata.filetype == expected for el in elements)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
("content_type", "expected"),
|
|
|
|
|
[
|
|
|
|
|
("application/pdf", FILETYPE_TO_MIMETYPE[FileType.PDF]),
|
|
|
|
|
(None, FILETYPE_TO_MIMETYPE[FileType.PDF]),
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
def test_auto_filetype_overrides_file_specific(content_type, expected):
|
|
|
|
|
pdf_metadata = ElementMetadata(filetype="imapdf")
|
|
|
|
|
with patch(
|
|
|
|
|
"unstructured.partition.auto.partition_pdf",
|
|
|
|
|
lambda *args, **kwargs: [
|
|
|
|
|
Text("text 1", metadata=pdf_metadata),
|
|
|
|
|
Text("text 2", metadata=pdf_metadata),
|
|
|
|
|
],
|
|
|
|
|
):
|
|
|
|
|
elements = partition("example-docs/layout-parser-paper-fast.pdf", content_type=content_type)
|
|
|
|
|
assert len(elements) == 2
|
|
|
|
|
assert all(el.metadata.filetype == expected for el in elements)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
supported_filetypes = [
|
|
|
|
|
_
|
|
|
|
|
for _ in FileType
|
|
|
|
|
if _
|
|
|
|
|
not in (
|
|
|
|
|
FileType.UNK,
|
|
|
|
|
FileType.ZIP,
|
|
|
|
|
FileType.XLS,
|
|
|
|
|
)
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FILETYPE_TO_MODULE = {
|
|
|
|
|
FileType.JPG: "image",
|
|
|
|
|
FileType.PNG: "image",
|
|
|
|
|
FileType.TXT: "text",
|
|
|
|
|
FileType.EML: "email",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("filetype", supported_filetypes)
|
|
|
|
|
def test_file_specific_produces_correct_filetype(filetype: FileType):
|
2023-06-09 16:07:50 -04:00
|
|
|
|
if filetype in (FileType.JPG, FileType.PNG, FileType.EMPTY):
|
2023-05-15 13:23:19 -05:00
|
|
|
|
pytest.skip()
|
|
|
|
|
extension = filetype.name.lower()
|
|
|
|
|
filetype_module = (
|
|
|
|
|
extension if filetype not in FILETYPE_TO_MODULE else FILETYPE_TO_MODULE[filetype]
|
|
|
|
|
)
|
|
|
|
|
fun_name = "partition_" + filetype_module
|
|
|
|
|
module = import_module(f"unstructured.partition.{filetype_module}") # noqa
|
|
|
|
|
fun = eval(f"module.{fun_name}")
|
|
|
|
|
for file in pathlib.Path("example-docs").iterdir():
|
|
|
|
|
if file.is_file() and file.suffix == f".{extension}":
|
|
|
|
|
elements = fun(str(file))
|
2023-06-09 16:07:50 -04:00
|
|
|
|
assert all(
|
|
|
|
|
el.metadata.filetype == FILETYPE_TO_MIMETYPE[filetype]
|
|
|
|
|
for el in elements
|
|
|
|
|
if el.metadata.filetype is not None
|
|
|
|
|
)
|
2023-05-15 13:23:19 -05:00
|
|
|
|
break
|
2023-05-16 15:40:40 -04:00
|
|
|
|
|
|
|
|
|
|
2023-05-18 11:40:12 -04:00
|
|
|
|
def test_auto_partition_xml_from_filename(filename="example-docs/factbook.xml"):
|
|
|
|
|
elements = partition(filename=filename, xml_keep_tags=False)
|
|
|
|
|
|
|
|
|
|
assert elements[0].text == "United States"
|
|
|
|
|
assert elements[0].metadata.filename == "factbook.xml"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_xml_from_file(filename="example-docs/factbook.xml"):
|
|
|
|
|
with open(filename, "rb") as f:
|
|
|
|
|
elements = partition(file=f, xml_keep_tags=False)
|
|
|
|
|
|
|
|
|
|
assert elements[0].text == "United States"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_xml_from_filename_with_tags(filename="example-docs/factbook.xml"):
|
|
|
|
|
elements = partition(filename=filename, xml_keep_tags=True)
|
|
|
|
|
|
|
|
|
|
assert elements[5].text == "<name>United States</name>"
|
|
|
|
|
assert elements[5].metadata.filename == "factbook.xml"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_xml_from_file_with_tags(filename="example-docs/factbook.xml"):
|
|
|
|
|
with open(filename, "rb") as f:
|
|
|
|
|
elements = partition(file=f, xml_keep_tags=True)
|
|
|
|
|
|
|
|
|
|
assert elements[5].text == "<name>United States</name>"
|
|
|
|
|
|
|
|
|
|
|
2023-05-16 15:40:40 -04:00
|
|
|
|
EXPECTED_XLSX_TABLE = """<table border="1" class="dataframe">
|
|
|
|
|
<tbody>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>Team</td>
|
|
|
|
|
<td>Location</td>
|
|
|
|
|
<td>Stanley Cups</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>Blues</td>
|
|
|
|
|
<td>STL</td>
|
|
|
|
|
<td>1</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>Flyers</td>
|
|
|
|
|
<td>PHI</td>
|
|
|
|
|
<td>2</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>Maple Leafs</td>
|
|
|
|
|
<td>TOR</td>
|
|
|
|
|
<td>13</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECTED_XLSX_TEXT = "Team Location Stanley Cups Blues STL 1 Flyers PHI 2 Maple Leafs TOR 13"
|
|
|
|
|
|
|
|
|
|
EXPECTED_XLSX_FILETYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_xlsx_from_filename(filename="example-docs/stanley-cups.xlsx"):
|
|
|
|
|
elements = partition(filename=filename)
|
|
|
|
|
|
|
|
|
|
assert all(isinstance(element, Table) for element in elements)
|
|
|
|
|
assert len(elements) == 2
|
|
|
|
|
|
|
|
|
|
assert clean_extra_whitespace(elements[0].text) == EXPECTED_XLSX_TEXT
|
|
|
|
|
assert elements[0].metadata.text_as_html == EXPECTED_XLSX_TABLE
|
|
|
|
|
assert elements[0].metadata.page_number == 1
|
|
|
|
|
assert elements[0].metadata.filetype == EXPECTED_XLSX_FILETYPE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_xlsx_from_file(filename="example-docs/stanley-cups.xlsx"):
|
|
|
|
|
with open(filename, "rb") as f:
|
|
|
|
|
elements = partition(file=f)
|
|
|
|
|
|
|
|
|
|
assert all(isinstance(element, Table) for element in elements)
|
|
|
|
|
assert len(elements) == 2
|
|
|
|
|
|
|
|
|
|
assert clean_extra_whitespace(elements[0].text) == EXPECTED_XLSX_TEXT
|
|
|
|
|
assert elements[0].metadata.text_as_html == EXPECTED_XLSX_TABLE
|
|
|
|
|
assert elements[0].metadata.page_number == 1
|
|
|
|
|
assert elements[0].metadata.filetype == EXPECTED_XLSX_FILETYPE
|
2023-05-19 15:57:42 -04:00
|
|
|
|
|
|
|
|
|
|
2023-05-26 01:55:32 -07:00
|
|
|
|
EXPECTED_XLS_TEXT_LEN = 883
|
|
|
|
|
|
|
|
|
|
EXPECTED_XLS_INITIAL_45_CLEAN_TEXT = "MA What C datatypes are 8 bits? (assume i386)"
|
|
|
|
|
|
|
|
|
|
EXPECTED_XLS_TABLE = (
|
|
|
|
|
"""<table border="1" class="dataframe">
|
|
|
|
|
<tbody>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>MA</td>
|
|
|
|
|
<td>What C datatypes are 8 bits? (assume i386)</td>
|
|
|
|
|
<td>int</td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td>float</td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td>double</td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td>char</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>TF</td>
|
|
|
|
|
<td>Bagpipes are awesome.</td>
|
|
|
|
|
<td>true</td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>ESS</td>
|
|
|
|
|
<td>How have the original Henry Hornbostel buildings """
|
|
|
|
|
"""influenced campus architecture and design in the last 30 years?</td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>ORD</td>
|
|
|
|
|
<td>Rank the following in their order of operation.</td>
|
|
|
|
|
<td>Parentheses</td>
|
|
|
|
|
<td>Exponents</td>
|
|
|
|
|
<td>Division</td>
|
|
|
|
|
<td>Addition</td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>FIB</td>
|
|
|
|
|
<td>The student activities fee is</td>
|
|
|
|
|
<td>95</td>
|
|
|
|
|
<td>dollars for students enrolled in</td>
|
|
|
|
|
<td>19</td>
|
|
|
|
|
<td>units or more,</td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
<td></td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>MAT</td>
|
|
|
|
|
<td>Match the lower-case greek letter with its capital form.</td>
|
|
|
|
|
<td>λ</td>
|
|
|
|
|
<td>Λ</td>
|
|
|
|
|
<td>α</td>
|
|
|
|
|
<td>γ</td>
|
|
|
|
|
<td>Γ</td>
|
|
|
|
|
<td>φ</td>
|
|
|
|
|
<td>Φ</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>"""
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_xls_from_filename(filename="example-docs/tests-example.xls"):
|
|
|
|
|
elements = partition(filename=filename)
|
|
|
|
|
|
|
|
|
|
assert all(isinstance(element, Table) for element in elements)
|
|
|
|
|
assert len(elements) == 3
|
|
|
|
|
|
|
|
|
|
assert clean_extra_whitespace(elements[0].text)[:45] == EXPECTED_XLS_INITIAL_45_CLEAN_TEXT
|
|
|
|
|
assert len(elements[0].text) == EXPECTED_XLS_TEXT_LEN
|
|
|
|
|
assert elements[0].metadata.text_as_html == EXPECTED_XLS_TABLE
|
|
|
|
|
|
|
|
|
|
|
2023-05-19 17:40:26 -04:00
|
|
|
|
@pytest.mark.skipif(is_in_docker, reason="Skipping this test in Docker container")
|
2023-05-19 15:57:42 -04:00
|
|
|
|
def test_auto_partition_csv_from_filename(filename="example-docs/stanley-cups.csv"):
|
|
|
|
|
elements = partition(filename=filename)
|
|
|
|
|
|
|
|
|
|
assert clean_extra_whitespace(elements[0].text) == EXPECTED_XLSX_TEXT
|
|
|
|
|
assert elements[0].metadata.text_as_html == EXPECTED_XLSX_TABLE
|
|
|
|
|
assert elements[0].metadata.filetype == "text/csv"
|
|
|
|
|
|
|
|
|
|
|
2023-05-19 17:40:26 -04:00
|
|
|
|
@pytest.mark.skipif(is_in_docker, reason="Skipping this test in Docker container")
|
2023-05-19 15:57:42 -04:00
|
|
|
|
def test_auto_partition_csv_from_file(filename="example-docs/stanley-cups.csv"):
|
|
|
|
|
with open(filename, "rb") as f:
|
|
|
|
|
elements = partition(file=f)
|
|
|
|
|
|
|
|
|
|
assert clean_extra_whitespace(elements[0].text) == EXPECTED_XLSX_TEXT
|
|
|
|
|
assert isinstance(elements[0], Table)
|
|
|
|
|
assert elements[0].metadata.text_as_html == EXPECTED_XLSX_TABLE
|
|
|
|
|
assert elements[0].metadata.filetype == "text/csv"
|
2023-06-09 16:07:50 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_works_on_empty_filename(filename="example-docs/empty.txt"):
|
|
|
|
|
assert partition(filename=filename) == []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_auto_partition_works_on_empty_file(filename="example-docs/empty.txt"):
|
|
|
|
|
with open(filename, "rb") as f:
|
|
|
|
|
assert partition(file=f) == []
|