From 2596a484746c27bf18f5c594d24d51e9c9e9f514 Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Fri, 11 Jul 2025 16:45:06 +0200 Subject: [PATCH 01/24] chore: update pyproject.toml and ingestion parsers - Reformatted authors and dependencies in pyproject.toml for consistency. - Added PptxDocumentParser to the list of exported components in the ingestion parsers. - Updated the router to use PptxDocumentParser for PPTX document types. --- .../ragbits-document-search/pyproject.toml | 19 +- .../ingestion/parsers/__init__.py | 9 +- .../ingestion/parsers/pptx/__init__.py | 5 + .../parsers/pptx/extractors/__init__.py | 21 ++ .../parsers/pptx/extractors/extractors.py | 245 ++++++++++++++++++ .../ingestion/parsers/pptx/parser.py | 56 ++++ .../ingestion/parsers/router.py | 3 +- 7 files changed, 348 insertions(+), 10 deletions(-) create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py diff --git a/packages/ragbits-document-search/pyproject.toml b/packages/ragbits-document-search/pyproject.toml index 9272f8bbb..e432cfdc9 100644 --- a/packages/ragbits-document-search/pyproject.toml +++ b/packages/ragbits-document-search/pyproject.toml @@ -5,9 +5,7 @@ description = "Document Search module for Ragbits" readme = "README.md" requires-python = ">=3.10" license = "MIT" -authors = [ - { name = "deepsense.ai", email = "ragbits@deepsense.ai"} -] +authors = [{ name = "deepsense.ai", email = "ragbits@deepsense.ai" }] keywords = [ "Retrieval Augmented Generation", "RAG", @@ -15,7 +13,7 @@ keywords = [ "LLMs", "Generative AI", "GenAI", - "Document Search" + "Document Search", ] classifiers = [ "Development Status :: 4 - Beta", @@ -31,7 +29,14 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["docling>=2.15.1,<3.0.0", "opencv-python>=4.11.0.86,<5.0.0.0", "rerankers>=0.6.1,<1.0.0", "filetype>=1.2.0,<2.0.0", "ragbits-core==1.1.0"] +dependencies = [ + "docling>=2.15.1,<3.0.0", + "opencv-python>=4.11.0.86,<5.0.0.0", + "rerankers>=0.6.1,<1.0.0", + "filetype>=1.2.0,<2.0.0", + "ragbits-core==1.1.0", + "python-pptx>=1.0.0,<2.0.0", +] [project.urls] "Homepage" = "https://github.com/deepsense-ai/ragbits" @@ -44,9 +49,7 @@ unstructured = [ "unstructured>=0.16.9,<1.0.0", "unstructured-client>=0.26.0,<1.0.0", ] -ray = [ - "ray[data]>=2.43.0,<3.0.0", -] +ray = ["ray[data]>=2.43.0,<3.0.0"] [tool.uv] dev-dependencies = [ diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/__init__.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/__init__.py index e2a5ef78d..2dc6acf65 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/__init__.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/__init__.py @@ -1,4 +1,11 @@ from ragbits.document_search.ingestion.parsers.base import DocumentParser, ImageDocumentParser, TextDocumentParser +from ragbits.document_search.ingestion.parsers.pptx import PptxDocumentParser from ragbits.document_search.ingestion.parsers.router import DocumentParserRouter -__all__ = ["DocumentParser", "DocumentParserRouter", "ImageDocumentParser", "TextDocumentParser"] +__all__ = [ + "DocumentParser", + "DocumentParserRouter", + "ImageDocumentParser", + "PptxDocumentParser", + "TextDocumentParser", +] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py new file mode 100644 index 000000000..a46247ba1 --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py @@ -0,0 +1,5 @@ +from .parser import PptxDocumentParser + +__all__ = [ + "PptxDocumentParser", +] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py new file mode 100644 index 000000000..95b4446dc --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py @@ -0,0 +1,21 @@ +from .extractors import ( + DEFAULT_EXTRACTORS, + BasePptxExtractor, + HyperlinkExtractor, + ImageExtractor, + MetadataExtractor, + ShapeExtractor, + SpeakerNotesExtractor, + TextExtractor, +) + +__all__ = [ + "DEFAULT_EXTRACTORS", + "BasePptxExtractor", + "PptxHyperlinkExtractor", + "PptxImageExtractor", + "PptxMetadataExtractor", + "PptxShapeExtractor", + "PptxSpeakerNotesExtractor", + "PptxTextExtractor", +] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py new file mode 100644 index 000000000..7a3e6974d --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py @@ -0,0 +1,245 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import Callable, Any + +from pptx.presentation import Presentation +from pptx.slide import Slide +from pptx.shapes.base import BaseShape + +from ragbits.document_search.documents.document import DocumentMeta +from ragbits.document_search.documents.element import ElementLocation, TextElement + + +class BasePptxExtractor(ABC): + """Base class for all PPTX content extractors.""" + + def _get_slides(self, presentation: Presentation, slide: Slide | None = None) -> list[tuple[int, Slide]]: + """Get slides with their indices.""" + slides = [slide] if slide else list(presentation.slides) + return list(enumerate(slides, start=1)) + + def _create_text_element( + self, + element_type: str, + document_meta: DocumentMeta, + content: str, + slide_idx: int, + shape: BaseShape | None = None, + coordinates: dict[str, Any] | None = None + ) -> TextElement: + """Create a TextElement with standardized location.""" + if coordinates is None and shape is not None: + coordinates = { + "left": shape.left, + "top": shape.top, + "width": shape.width, + "height": shape.height + } + + location = ElementLocation( + page_number=slide_idx, + coordinates=coordinates or {} + ) + + return TextElement( + element_type=element_type, + document_meta=document_meta, + location=location, + content=content + ) + + def _extract_from_shapes( + self, + presentation: Presentation, + document_meta: DocumentMeta, + slide: Slide | None, + shape_filter: Callable[[BaseShape], bool], + content_extractor: Callable[[BaseShape], str], + element_type: str = "text" + ) -> list[TextElement]: + """Generic method to extract content from shapes based on filter and extractor.""" + elements: list[TextElement] = [] + + for slide_idx, sld in self._get_slides(presentation, slide): + for shape in sld.shapes: + if shape_filter(shape): + try: + content = content_extractor(shape) + if content.strip(): + element = self._create_text_element( + element_type=element_type, + document_meta=document_meta, + content=content, + slide_idx=slide_idx, + shape=shape + ) + elements.append(element) + except (AttributeError, TypeError): + continue + + return elements + + @abstractmethod + def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + """Extract content from the presentation or specific slide.""" + + @abstractmethod + def get_extractor_name(self) -> str: + """Get the name of this extractor.""" + + +class PptxTextExtractor(BasePptxExtractor): + """Extracts text content from text frames.""" + + def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + """Extract text content from the presentation or a specific slide.""" + return self._extract_from_shapes( + presentation=presentation, + document_meta=document_meta, + slide=slide, + shape_filter=lambda shape: shape.has_text_frame, + content_extractor=lambda shape: str(shape.text_frame.text).strip() + ) + + def get_extractor_name(self) -> str: + """Get the name of this extractor.""" + return "pptx_text_extractor" + + +class PptxHyperlinkExtractor(BasePptxExtractor): + """Extracts hyperlink addresses from shapes.""" + + def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + """Extract hyperlink content from the presentation or a specific slide.""" + return self._extract_from_shapes( + presentation=presentation, + document_meta=document_meta, + slide=slide, + shape_filter=lambda shape: hasattr(shape, 'click_action') and shape.click_action.hyperlink.address, + content_extractor=lambda shape: shape.click_action.hyperlink.address, + element_type="hyperlink" + ) + + def get_extractor_name(self) -> str: + """Get the name of this extractor.""" + return "pptx_hyperlink_extractor" + + +class PptxImageExtractor(BasePptxExtractor): + """Extracts image information from shapes.""" + + def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + """Extract image content from the presentation or a specific slide.""" + return self._extract_from_shapes( + presentation=presentation, + document_meta=document_meta, + slide=slide, + shape_filter=lambda shape: shape.image and shape.image is not None, + content_extractor=lambda shape: f"Image: {shape.image.filename if hasattr(shape.image, 'filename') else 'embedded_image'}", + element_type="image" + ) + + def get_extractor_name(self) -> str: + """Get the name of this extractor.""" + return "pptx_image_extractor" + + +class PptxShapeExtractor(BasePptxExtractor): + """Extracts shape information and metadata.""" + + def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + """Extract shape metadata from the presentation or a specific slide.""" + return self._extract_from_shapes( + presentation=presentation, + document_meta=document_meta, + slide=slide, + shape_filter=lambda shape: hasattr(shape, 'shape_type'), + content_extractor=lambda shape: f"Shape: {shape.shape_type}", + element_type="shape" + ) + + def get_extractor_name(self) -> str: + """Get the name of this extractor.""" + return "pptx_shape_extractor" + + +class PptxMetadataExtractor(BasePptxExtractor): + """Extracts document metadata.""" + + def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + """Extract metadata from the presentation.""" + core_properties = presentation.core_properties + properties = [ + ("author", core_properties.author), + ("title", core_properties.title), + ("subject", core_properties.subject), + ("keywords", core_properties.keywords), + ("category", core_properties.category), + ("created", str(core_properties.created) if core_properties.created else None), + ("modified", str(core_properties.modified) if core_properties.modified else None), + ] + + elements = [] + for prop_name, prop_value in properties: + if prop_value is not None and str(prop_value).strip(): + element = self._create_text_element( + element_type="metadata", + document_meta=document_meta, + content=f"{prop_name}: {prop_value}", + slide_idx=0 + ) + elements.append(element) + + return elements + + def get_extractor_name(self) -> str: + """Get the name of this extractor.""" + return "pptx_metadata_extractor" + + +class PptxSpeakerNotesExtractor(BasePptxExtractor): + """Extracts speaker notes from slides.""" + + def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + """Extract speaker notes from the presentation or a specific slide.""" + elements: list[TextElement] = [] + + for slide_idx, sld in self._get_slides(presentation, slide): + if sld.has_notes_slide and sld.notes_slide.notes_text_frame is not None: + notes_slide = sld.notes_slide + notes_text_frame = notes_slide.notes_text_frame + text = notes_text_frame.text.strip() if notes_text_frame is not None else None + + if text and notes_text_frame is not None: + coordinates = { + "left": notes_text_frame.margin_left, + "right": notes_text_frame.margin_right, + "top": notes_text_frame.margin_top, + "bottom": notes_text_frame.margin_bottom + } + + element = self._create_text_element( + element_type="speaker_notes", + document_meta=document_meta, + content=text, + slide_idx=slide_idx, + coordinates=coordinates + ) + elements.append(element) + + return elements + + def get_extractor_name(self) -> str: + """Get the name of this extractor.""" + return "pptx_speaker_notes_extractor" + + +DEFAULT_EXTRACTORS = [ + PptxTextExtractor(), + PptxHyperlinkExtractor(), + PptxImageExtractor(), + PptxShapeExtractor(), + PptxSpeakerNotesExtractor(), + PptxMetadataExtractor(), +] \ No newline at end of file diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py new file mode 100644 index 000000000..22c36c47f --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +import logging + +from pptx import Presentation + +from ragbits.document_search.documents.document import Document, DocumentType +from ragbits.document_search.documents.element import Element +from ragbits.document_search.ingestion.parsers.base import DocumentParser +from ragbits.document_search.ingestion.parsers.pptx.extractors import ( + DEFAULT_EXTRACTORS, + BaseExtractor, +) + +logger = logging.getLogger(__name__) + + +class PptxDocumentParser(DocumentParser): + """ + A comprehensive PPTX parser using python-pptx library with modular extractor architecture. + """ + + supported_document_types = {DocumentType.PPTX} + + def __init__( + self, + extractors: list[BaseExtractor] | None = None, + ) -> None: + """ + Initialize the PPTX parser with configurable extractors. + + Args: + extractors: List of extractors to use. If None, uses DEFAULT_EXTRACTORS. + """ + self.extractors = extractors or DEFAULT_EXTRACTORS + + async def parse(self, document: Document) -> list[Element]: + """ + Parse the PPTX document and return extracted elements. + + Args: + document: The document to parse. + + Returns: + List of extracted elements. + """ + self.validate_document_type(document.metadata.document_type) + + extracted_elements = [] + presentation = Presentation(document.local_path.as_posix()) + + for extractor in self.extractors: + for slide in presentation.slides: + extracted_elements.extend(extractor.extract(presentation, slide)) + + return extracted_elements diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/router.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/router.py index 2c4456e67..a30630f4d 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/router.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/router.py @@ -8,6 +8,7 @@ from ragbits.document_search.ingestion.parsers.base import DocumentParser from ragbits.document_search.ingestion.parsers.docling import DoclingDocumentParser from ragbits.document_search.ingestion.parsers.exceptions import ParserNotFoundError +from ragbits.document_search.ingestion.parsers.pptx.parser import PptxDocumentParser _default_parser = DoclingDocumentParser() @@ -16,7 +17,7 @@ DocumentType.MD: _default_parser, DocumentType.PDF: _default_parser, DocumentType.DOCX: _default_parser, - DocumentType.PPTX: _default_parser, + DocumentType.PPTX: PptxDocumentParser(), DocumentType.XLSX: _default_parser, DocumentType.HTML: _default_parser, DocumentType.JPG: _default_parser, From 00ad9dc91b2b7cb8b91fb4e3b6a57e795e672fe6 Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Tue, 15 Jul 2025 14:39:36 +0200 Subject: [PATCH 02/24] feat(pptx): add temporary testing script and enhance PPTX parser - Introduced a new script for creating dummy PPTX files to facilitate testing of the PPTX parser. - Updated the PptxDocumentParser to utilize DocumentMeta for improved document handling. - Refactored extractor classes to enhance clarity and maintainability, including renaming to follow a consistent naming convention. - Improved extraction methods for text, hyperlinks, images, shapes, metadata, and speaker notes. --- examples/document-search/test_pptx_parser.py | 99 +++++++++++ .../parsers/pptx/extractors/__init__.py | 12 +- .../parsers/pptx/extractors/extractors.py | 162 ++++++++++-------- .../ingestion/parsers/pptx/parser.py | 17 +- 4 files changed, 210 insertions(+), 80 deletions(-) create mode 100644 examples/document-search/test_pptx_parser.py diff --git a/examples/document-search/test_pptx_parser.py b/examples/document-search/test_pptx_parser.py new file mode 100644 index 000000000..0c90660a2 --- /dev/null +++ b/examples/document-search/test_pptx_parser.py @@ -0,0 +1,99 @@ +# This is a temporary script for development purposes and PR testing. +# It will be removed before merging. + +from __future__ import annotations + +import asyncio +import os +from pathlib import Path + +from pptx import Presentation +from pptx.util import Inches + +from ragbits.core.sources.local import LocalFileSource +from ragbits.document_search.documents.document import Document, DocumentMeta, DocumentType +from ragbits.document_search.ingestion.parsers.pptx.parser import PptxDocumentParser + + +async def create_dummy_pptx(file_path: str): + """Creates a dummy PPTX file for testing.""" + prs = Presentation() + + # Slide 1: Title Slide + title_slide_layout = prs.slide_layouts[0] + slide1 = prs.slides.add_slide(title_slide_layout) + title = slide1.shapes.title + subtitle = slide1.placeholders[1] + if title and title.has_text_frame: + title.text_frame.text = "Test Presentation" + if subtitle and subtitle.has_text_frame: + subtitle.text_frame.text = "A presentation for testing the PPTX parser." + + # Slide 2: Text, Shape, and Hyperlink + bullet_slide_layout = prs.slide_layouts[1] + slide2 = prs.slides.add_slide(bullet_slide_layout) + shapes = slide2.shapes + title_shape = shapes.title + if title_shape and title_shape.has_text_frame: + title_shape.text_frame.text = "This is a slide with text, a shape, and a hyperlink." + + body_shape = shapes.placeholders[1] + if body_shape and body_shape.has_text_frame: + tf = body_shape.text_frame + tf.text = "This is a bullet point." + + p = tf.add_paragraph() + p.text = "This is a line with a " + r = p.add_run() + r.text = "hyperlink" + if r.hyperlink: + r.hyperlink.address = "https://www.google.com" + + # Slide 3: Image + img_slide_layout = prs.slide_layouts[5] + slide3 = prs.slides.add_slide(img_slide_layout) + img_path = "packages/ragbits-core/tests/assets/img/test.png" + if os.path.exists(img_path): + left = top = Inches(1) + slide3.shapes.add_picture(img_path, left, top) + + # Slide 4: With speaker notes + notes_slide_layout = prs.slide_layouts[1] + slide4 = prs.slides.add_slide(notes_slide_layout) + if slide4.has_notes_slide: + notes_slide = slide4.notes_slide + if notes_slide.notes_text_frame: + text_frame = notes_slide.notes_text_frame + text_frame.text = "These are speaker notes for slide 4." + + prs.save(file_path) + + +async def main(): + """Main function to test the PPTX parser.""" + pptx_file = "test_pptx.pptx" + await create_dummy_pptx(pptx_file) + + try: + document_meta = DocumentMeta( + document_type=DocumentType.PPTX, + source=LocalFileSource(path=Path(pptx_file)), + ) + document = Document.from_document_meta(document_meta, Path(pptx_file)) + + parser = PptxDocumentParser() + elements = await parser.parse(document) + + print(f"--- Extracted {len(elements)} elements ---") + for element in elements: + print(f"Type: {element.element_type}") + print(f"Content: {element.text_representation}") + print(f"Location: {element.location}") + print("-" * 20) + + except Exception as e: + print(f"Error: {e}") + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py index 95b4446dc..d1af5dd2b 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py @@ -1,12 +1,12 @@ from .extractors import ( DEFAULT_EXTRACTORS, BasePptxExtractor, - HyperlinkExtractor, - ImageExtractor, - MetadataExtractor, - ShapeExtractor, - SpeakerNotesExtractor, - TextExtractor, + PptxHyperlinkExtractor, + PptxImageExtractor, + PptxMetadataExtractor, + PptxShapeExtractor, + PptxSpeakerNotesExtractor, + PptxTextExtractor, ) __all__ = [ diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py index 7a3e6974d..3d192d2d7 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py @@ -1,11 +1,15 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import Callable, Any +from collections.abc import Callable +from typing import Any from pptx.presentation import Presentation -from pptx.slide import Slide +from pptx.shapes.autoshape import Shape from pptx.shapes.base import BaseShape +from pptx.shapes.group import GroupShape +from pptx.shapes.picture import Picture +from pptx.slide import Slide from ragbits.document_search.documents.document import DocumentMeta from ragbits.document_search.documents.element import ElementLocation, TextElement @@ -26,62 +30,49 @@ def _create_text_element( content: str, slide_idx: int, shape: BaseShape | None = None, - coordinates: dict[str, Any] | None = None + coordinates: dict[str, Any] | None = None, ) -> TextElement: """Create a TextElement with standardized location.""" if coordinates is None and shape is not None: - coordinates = { - "left": shape.left, - "top": shape.top, - "width": shape.width, - "height": shape.height - } - - location = ElementLocation( - page_number=slide_idx, - coordinates=coordinates or {} - ) - - return TextElement( - element_type=element_type, - document_meta=document_meta, - location=location, - content=content - ) + coordinates = {"left": shape.left, "top": shape.top, "width": shape.width, "height": shape.height} + + location = ElementLocation(page_number=slide_idx, coordinates=coordinates or {}) + + return TextElement(element_type=element_type, document_meta=document_meta, location=location, content=content) def _extract_from_shapes( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None, - shape_filter: Callable[[BaseShape], bool], - content_extractor: Callable[[BaseShape], str], - element_type: str = "text" + content_extractor: Callable[[BaseShape], str | None], + element_type: str = "text", ) -> list[TextElement]: - """Generic method to extract content from shapes based on filter and extractor.""" + """Generic method to extract content from shapes based on extractor.""" elements: list[TextElement] = [] - + for slide_idx, sld in self._get_slides(presentation, slide): for shape in sld.shapes: - if shape_filter(shape): - try: - content = content_extractor(shape) - if content.strip(): - element = self._create_text_element( - element_type=element_type, - document_meta=document_meta, - content=content, - slide_idx=slide_idx, - shape=shape - ) - elements.append(element) - except (AttributeError, TypeError): - continue - + try: + content = content_extractor(shape) + if content and content.strip(): + element = self._create_text_element( + element_type=element_type, + document_meta=document_meta, + content=content, + slide_idx=slide_idx, + shape=shape, + ) + elements.append(element) + except (AttributeError, TypeError): + continue + return elements @abstractmethod - def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + def extract( + self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None + ) -> list[TextElement]: """Extract content from the presentation or specific slide.""" @abstractmethod @@ -92,14 +83,21 @@ def get_extractor_name(self) -> str: class PptxTextExtractor(BasePptxExtractor): """Extracts text content from text frames.""" - def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + def _extract_text_content(self, shape: BaseShape) -> str | None: + """Extract text content from a shape.""" + if not isinstance(shape, Shape): + return None + return str(shape.text_frame.text).strip() if shape.text_frame.text else None + + def extract( + self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None + ) -> list[TextElement]: """Extract text content from the presentation or a specific slide.""" return self._extract_from_shapes( presentation=presentation, document_meta=document_meta, slide=slide, - shape_filter=lambda shape: shape.has_text_frame, - content_extractor=lambda shape: str(shape.text_frame.text).strip() + content_extractor=self._extract_text_content, ) def get_extractor_name(self) -> str: @@ -110,15 +108,24 @@ def get_extractor_name(self) -> str: class PptxHyperlinkExtractor(BasePptxExtractor): """Extracts hyperlink addresses from shapes.""" - def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + def _extract_hyperlink_content(self, shape: BaseShape) -> str | None: + """Extract hyperlink content from a shape.""" + if not hasattr(shape, "click_action") or isinstance(shape, GroupShape): + return None + if not shape.click_action.hyperlink.address: + return None + return shape.click_action.hyperlink.address + + def extract( + self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None + ) -> list[TextElement]: """Extract hyperlink content from the presentation or a specific slide.""" return self._extract_from_shapes( presentation=presentation, document_meta=document_meta, slide=slide, - shape_filter=lambda shape: hasattr(shape, 'click_action') and shape.click_action.hyperlink.address, - content_extractor=lambda shape: shape.click_action.hyperlink.address, - element_type="hyperlink" + content_extractor=self._extract_hyperlink_content, + element_type="hyperlink", ) def get_extractor_name(self) -> str: @@ -129,15 +136,25 @@ def get_extractor_name(self) -> str: class PptxImageExtractor(BasePptxExtractor): """Extracts image information from shapes.""" - def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + def _extract_image_content(self, shape: BaseShape) -> str | None: + """Extract image content from a shape.""" + if not isinstance(shape, Picture): + return None + if not hasattr(shape, "image") or shape.image is None: + return None + filename = shape.image.filename if hasattr(shape.image, "filename") else "embedded_image" + return f"Image: {filename}" + + def extract( + self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None + ) -> list[TextElement]: """Extract image content from the presentation or a specific slide.""" return self._extract_from_shapes( presentation=presentation, document_meta=document_meta, slide=slide, - shape_filter=lambda shape: shape.image and shape.image is not None, - content_extractor=lambda shape: f"Image: {shape.image.filename if hasattr(shape.image, 'filename') else 'embedded_image'}", - element_type="image" + content_extractor=self._extract_image_content, + element_type="image", ) def get_extractor_name(self) -> str: @@ -148,15 +165,22 @@ def get_extractor_name(self) -> str: class PptxShapeExtractor(BasePptxExtractor): """Extracts shape information and metadata.""" - def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + def _extract_shape_content(self, shape: BaseShape) -> str | None: + """Extract shape metadata from a shape.""" + if not hasattr(shape, "shape_type"): + return None + return f"Shape: {shape.shape_type}" + + def extract( + self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None + ) -> list[TextElement]: """Extract shape metadata from the presentation or a specific slide.""" return self._extract_from_shapes( presentation=presentation, document_meta=document_meta, slide=slide, - shape_filter=lambda shape: hasattr(shape, 'shape_type'), - content_extractor=lambda shape: f"Shape: {shape.shape_type}", - element_type="shape" + content_extractor=self._extract_shape_content, + element_type="shape", ) def get_extractor_name(self) -> str: @@ -167,7 +191,9 @@ def get_extractor_name(self) -> str: class PptxMetadataExtractor(BasePptxExtractor): """Extracts document metadata.""" - def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + def extract( + self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None + ) -> list[TextElement]: """Extract metadata from the presentation.""" core_properties = presentation.core_properties properties = [ @@ -179,7 +205,7 @@ def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide ("created", str(core_properties.created) if core_properties.created else None), ("modified", str(core_properties.modified) if core_properties.modified else None), ] - + elements = [] for prop_name, prop_value in properties: if prop_value is not None and str(prop_value).strip(): @@ -187,7 +213,7 @@ def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide element_type="metadata", document_meta=document_meta, content=f"{prop_name}: {prop_value}", - slide_idx=0 + slide_idx=0, ) elements.append(element) @@ -201,30 +227,32 @@ def get_extractor_name(self) -> str: class PptxSpeakerNotesExtractor(BasePptxExtractor): """Extracts speaker notes from slides.""" - def extract(self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None) -> list[TextElement]: + def extract( + self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None + ) -> list[TextElement]: """Extract speaker notes from the presentation or a specific slide.""" elements: list[TextElement] = [] - + for slide_idx, sld in self._get_slides(presentation, slide): if sld.has_notes_slide and sld.notes_slide.notes_text_frame is not None: notes_slide = sld.notes_slide notes_text_frame = notes_slide.notes_text_frame text = notes_text_frame.text.strip() if notes_text_frame is not None else None - + if text and notes_text_frame is not None: coordinates = { "left": notes_text_frame.margin_left, "right": notes_text_frame.margin_right, "top": notes_text_frame.margin_top, - "bottom": notes_text_frame.margin_bottom + "bottom": notes_text_frame.margin_bottom, } - + element = self._create_text_element( element_type="speaker_notes", document_meta=document_meta, content=text, slide_idx=slide_idx, - coordinates=coordinates + coordinates=coordinates, ) elements.append(element) @@ -242,4 +270,4 @@ def get_extractor_name(self) -> str: PptxShapeExtractor(), PptxSpeakerNotesExtractor(), PptxMetadataExtractor(), -] \ No newline at end of file +] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py index 22c36c47f..f9ee8dbad 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py @@ -4,12 +4,12 @@ from pptx import Presentation -from ragbits.document_search.documents.document import Document, DocumentType +from ragbits.document_search.documents.document import Document, DocumentType, DocumentMeta from ragbits.document_search.documents.element import Element from ragbits.document_search.ingestion.parsers.base import DocumentParser from ragbits.document_search.ingestion.parsers.pptx.extractors import ( DEFAULT_EXTRACTORS, - BaseExtractor, + BasePptxExtractor, ) logger = logging.getLogger(__name__) @@ -24,7 +24,7 @@ class PptxDocumentParser(DocumentParser): def __init__( self, - extractors: list[BaseExtractor] | None = None, + extractors: list[BasePptxExtractor] | None = None, ) -> None: """ Initialize the PPTX parser with configurable extractors. @@ -46,11 +46,14 @@ async def parse(self, document: Document) -> list[Element]: """ self.validate_document_type(document.metadata.document_type) - extracted_elements = [] - presentation = Presentation(document.local_path.as_posix()) + document_path = document.local_path + document_meta = DocumentMeta.from_local_path(document_path) + extracted_elements: list[Element] = [] + presentation = Presentation(document_path.as_posix()) for extractor in self.extractors: - for slide in presentation.slides: - extracted_elements.extend(extractor.extract(presentation, slide)) + extracted_elements.extend( + extractor.extract(presentation, document_meta) + ) return extracted_elements From 55fee9c5650f5c63f90860bd79079758290d0e9d Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Tue, 15 Jul 2025 14:41:40 +0200 Subject: [PATCH 03/24] fix(test): cast shapes in PPTX parser test for correct type handling - Updated the test script to cast shapes to the correct type before accessing text frames, ensuring proper functionality of the PPTX parser during testing. --- examples/document-search/test_pptx_parser.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/document-search/test_pptx_parser.py b/examples/document-search/test_pptx_parser.py index 0c90660a2..53d6ca971 100644 --- a/examples/document-search/test_pptx_parser.py +++ b/examples/document-search/test_pptx_parser.py @@ -6,9 +6,11 @@ import asyncio import os from pathlib import Path +from typing import cast from pptx import Presentation from pptx.util import Inches +from pptx.shapes.autoshape import Shape from ragbits.core.sources.local import LocalFileSource from ragbits.document_search.documents.document import Document, DocumentMeta, DocumentType @@ -27,7 +29,8 @@ async def create_dummy_pptx(file_path: str): if title and title.has_text_frame: title.text_frame.text = "Test Presentation" if subtitle and subtitle.has_text_frame: - subtitle.text_frame.text = "A presentation for testing the PPTX parser." + shape = cast(Shape, subtitle) + shape.text_frame.text = "A presentation for testing the PPTX parser." # Slide 2: Text, Shape, and Hyperlink bullet_slide_layout = prs.slide_layouts[1] @@ -39,7 +42,7 @@ async def create_dummy_pptx(file_path: str): body_shape = shapes.placeholders[1] if body_shape and body_shape.has_text_frame: - tf = body_shape.text_frame + tf = cast(Shape, body_shape).text_frame tf.text = "This is a bullet point." p = tf.add_paragraph() From 2c4c5ee92fb3a4797641b1d353773e9c1529b31b Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Tue, 15 Jul 2025 14:54:20 +0200 Subject: [PATCH 04/24] feat: add pptx document parser to changelog --- packages/ragbits-document-search/CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/ragbits-document-search/CHANGELOG.md b/packages/ragbits-document-search/CHANGELOG.md index d13707530..530ffaa00 100644 --- a/packages/ragbits-document-search/CHANGELOG.md +++ b/packages/ragbits-document-search/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- feat: add pptx document parser (#693) + ## 1.1.0 (2025-07-09) ### Changed @@ -179,6 +181,7 @@ ## 0.7.0 (2025-01-21) ### Added + - Add CLI command to perform search on DocumentSearch instance (#290). ### Changed @@ -202,7 +205,7 @@ ### Added -- Distributed ingestion with usage of https://www.ray.io/ (#207) +- Distributed ingestion with usage of (#207) - Documents can be now replaced in existing VectorStore (#210) ### Changed @@ -228,7 +231,6 @@ - Add location metadata to documents ingested into DocumentSearch (#122). - Add LiteLLM Reranker (#109). - ### Changed - ragbits-core updated to version v0.3.0 From d5a3e281f175594876ddfb587de00d454e8d9ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maksymilian=20Pil=C5=BCys?= <43760021+maxpill@users.noreply.github.com> Date: Tue, 15 Jul 2025 14:57:51 +0200 Subject: [PATCH 05/24] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../ingestion/parsers/pptx/extractors/extractors.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py index 3d192d2d7..90997b083 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py @@ -112,7 +112,7 @@ def _extract_hyperlink_content(self, shape: BaseShape) -> str | None: """Extract hyperlink content from a shape.""" if not hasattr(shape, "click_action") or isinstance(shape, GroupShape): return None - if not shape.click_action.hyperlink.address: + if not shape.click_action.hyperlink or not shape.click_action.hyperlink.address: return None return shape.click_action.hyperlink.address @@ -237,9 +237,10 @@ def extract( if sld.has_notes_slide and sld.notes_slide.notes_text_frame is not None: notes_slide = sld.notes_slide notes_text_frame = notes_slide.notes_text_frame - text = notes_text_frame.text.strip() if notes_text_frame is not None else None + text = getattr(notes_text_frame, "text", None) + text = text.strip() if text else None - if text and notes_text_frame is not None: + if text: coordinates = { "left": notes_text_frame.margin_left, "right": notes_text_frame.margin_right, From da462ae3a89e7310afb8b8e004c23b046c343b46 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Wed, 16 Jul 2025 09:54:47 -0400 Subject: [PATCH 06/24] application/pdf export to mime map --- packages/ragbits-core/src/ragbits/core/sources/google_drive.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py index 144219bf0..9ba1b736c 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py +++ b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py @@ -28,7 +28,7 @@ _GOOGLE_EXPORT_MIME_MAP = { "application/vnd.google-apps.document": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", # noqa: E501 "application/vnd.google-apps.spreadsheet": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", # noqa: E501 - "application/vnd.google-apps.presentation": "application/vnd.openxmlformats-officedocument.presentationml.presentation", # noqa: E501 + "application/vnd.google-apps.presentation": "application/pdf", "application/vnd.google-apps.drawing": "image/png", "application/vnd.google-apps.script": "application/vnd.google-apps.script+json", "application/vnd.google-apps.site": "text/html", From 5f6b8a6abac9054e158b950a49c2814330970001 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Wed, 16 Jul 2025 15:13:34 -0400 Subject: [PATCH 07/24] impersonation feature for client. --- .../src/ragbits/core/sources/google_drive.py | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py index 9ba1b736c..eb1f8337b 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py +++ b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py @@ -20,10 +20,17 @@ _SCOPES = ["https://www.googleapis.com/auth/drive"] +# Scopes that the service account is delegated for in the Google Workspace Admin Console. +_IMPERSONATION_SCOPES = [ + "https://www.googleapis.com/auth/cloud-platform", # General Cloud access (if needed) + "https://www.googleapis.com/auth/drive", # Example: For Google Drive API +] + # HTTP status codes _HTTP_NOT_FOUND = 404 _HTTP_FORBIDDEN = 403 + # Maps Google-native Drive MIME types → export MIME types _GOOGLE_EXPORT_MIME_MAP = { "application/vnd.google-apps.document": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", # noqa: E501 @@ -60,6 +67,9 @@ class GoogleDriveSource(Source): is_folder: bool = False protocol: ClassVar[str] = "google_drive" + _impersonate: bool = False + _impersonate_target_email: str | None = None + _google_drive_client: ClassVar["GoogleAPIResource | None"] = None _credentials_file_path: ClassVar[str | None] = None @@ -68,6 +78,23 @@ def set_credentials_file_path(cls, path: str) -> None: """Set the path to the service account credentials file.""" cls._credentials_file_path = path + @classmethod + def set_impersonation_target(cls, target_mail: str): + """ + Sets the email address to impersonate when accessing Google Drive resources. + + Args: + target_mail (str): The email address to impersonate. + + Raises: + ValueError: If the provided email address is invalid (empty or missing '@'). + """ + # check if email is a valid email. + if not target_mail or "@" not in target_mail: + raise ValueError("Invalid email address provided for impersonation.") + cls._impersonate = True + cls._impersonate_target_email = target_mail + @classmethod def _initialize_client_from_creds(cls) -> None: """ @@ -82,7 +109,22 @@ def _initialize_client_from_creds(cls) -> None: HttpError: If the Google Drive API is not enabled or accessible. Exception: If any other error occurs during client initialization. """ - creds = service_account.Credentials.from_service_account_file(cls._credentials_file_path, scopes=_SCOPES) + + + cred_kwargs = { + "filename": cls._credentials_file_path, + "scopes": _SCOPES, + } + + # handle impersonation + if cls._impersonate: + if not cls._impersonate_target_email: + raise ValueError("Impersonation target email must be set when impersonation is enabled.") + cred_kwargs["subject"] = cls._impersonate_target_email + cred_kwargs["scopes"] = _IMPERSONATION_SCOPES + + creds = service_account.Credentials.from_service_account_file(**cred_kwargs) + cls._google_drive_client = build("drive", "v3", credentials=creds) cls._google_drive_client.files().list( pageSize=1, fields="files(id)", supportsAllDrives=True, includeItemsFromAllDrives=True From 310968da06effa5ec585723e0ab73d2472f65d0e Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Thu, 17 Jul 2025 10:39:47 +0200 Subject: [PATCH 08/24] feat(pptx): implement error handling and logging in PPTX parser - Added custom exceptions for PPTX parsing errors, including PptxExtractionError, PptxExtractorError, PptxParserError, PptxPresentationError, and PptxSlideProcessingError. - Enhanced the PptxDocumentParser to raise appropriate exceptions during parsing failures and log detailed error messages. - Improved logging throughout the extraction process to track successful and failed extractions, including shape processing and metadata extraction. - Updated extractor classes to handle errors gracefully and provide informative logs for debugging. --- .../ingestion/parsers/pptx/__init__.py | 12 + .../ingestion/parsers/pptx/exceptions.py | 94 +++++++ .../parsers/pptx/extractors/extractors.py | 260 +++++++++++++----- .../ingestion/parsers/pptx/parser.py | 70 ++++- 4 files changed, 367 insertions(+), 69 deletions(-) create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/exceptions.py diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py index a46247ba1..8d482cd1e 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py @@ -1,5 +1,17 @@ +from .exceptions import ( + PptxExtractionError, + PptxExtractorError, + PptxParserError, + PptxPresentationError, + PptxSlideProcessingError, +) from .parser import PptxDocumentParser __all__ = [ "PptxDocumentParser", + "PptxExtractionError", + "PptxExtractorError", + "PptxParserError", + "PptxPresentationError", + "PptxSlideProcessingError", ] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/exceptions.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/exceptions.py new file mode 100644 index 000000000..80540f632 --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/exceptions.py @@ -0,0 +1,94 @@ +from ragbits.document_search.ingestion.parsers.exceptions import ParserError + + +class PptxParserError(ParserError): + """ + Base class for all PPTX parser related exceptions. + """ + + +class PptxExtractionError(PptxParserError): + """ + Raised when an extractor fails to extract content from a shape or slide. + """ + + def __init__(self, extractor_name: str, slide_idx: int, shape_info: str, original_error: Exception) -> None: + """ + Initialize the PptxExtractionError. + + Args: + extractor_name: Name of the extractor that failed. + slide_idx: Index of the slide where extraction failed. + shape_info: Information about the shape that caused the failure. + original_error: The original exception that caused the failure. + """ + message = ( + f"Extractor '{extractor_name}' failed to extract content from slide {slide_idx}. " + f"Shape info: {shape_info}. Original error: {original_error}" + ) + super().__init__(message) + self.extractor_name = extractor_name + self.slide_idx = slide_idx + self.shape_info = shape_info + self.original_error = original_error + + +class PptxSlideProcessingError(PptxParserError): + """ + Raised when processing of an entire slide fails. + """ + + def __init__(self, extractor_name: str, slide_idx: int, original_error: Exception) -> None: + """ + Initialize the PptxSlideProcessingError. + + Args: + extractor_name: Name of the extractor that failed. + slide_idx: Index of the slide that failed to process. + original_error: The original exception that caused the failure. + """ + message = ( + f"Extractor '{extractor_name}' failed to process slide {slide_idx}. " f"Original error: {original_error}" + ) + super().__init__(message) + self.extractor_name = extractor_name + self.slide_idx = slide_idx + self.original_error = original_error + + +class PptxPresentationError(PptxParserError): + """ + Raised when the PPTX presentation cannot be loaded or processed. + """ + + def __init__(self, file_path: str, original_error: Exception) -> None: + """ + Initialize the PptxPresentationError. + + Args: + file_path: Path to the PPTX file that failed to load. + original_error: The original exception that caused the failure. + """ + message = f"Failed to load or process PPTX presentation from '{file_path}'. Original error: {original_error}" + super().__init__(message) + self.file_path = file_path + self.original_error = original_error + + +class PptxExtractorError(PptxParserError): + """ + Raised when an extractor fails completely. + """ + + def __init__(self, extractor_name: str, original_error: Exception) -> None: + """ + Initialize the PptxExtractorError. + + Args: + extractor_name: Name of the extractor that failed. + original_error: The original exception that caused the failure. + """ + message = f"Extractor '{extractor_name}' failed completely. Original error: {original_error}" + super().__init__(message) + self.extractor_name = extractor_name + self.original_error = original_error diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py index 90997b083..8454f15d9 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py @@ -1,5 +1,6 @@ from __future__ import annotations +import logging from abc import ABC, abstractmethod from collections.abc import Callable from typing import Any @@ -13,6 +14,12 @@ from ragbits.document_search.documents.document import DocumentMeta from ragbits.document_search.documents.element import ElementLocation, TextElement +from ragbits.document_search.ingestion.parsers.pptx.exceptions import ( + PptxExtractorError, + PptxSlideProcessingError, +) + +logger = logging.getLogger(__name__) class BasePptxExtractor(ABC): @@ -23,6 +30,16 @@ def _get_slides(self, presentation: Presentation, slide: Slide | None = None) -> slides = [slide] if slide else list(presentation.slides) return list(enumerate(slides, start=1)) + def _get_shape_info(self, shape: BaseShape) -> str: + """Get descriptive information about a shape for logging purposes.""" + try: + shape_type = getattr(shape, "shape_type", "unknown") + shape_name = getattr(shape, "name", "unnamed") + shape_id = getattr(shape, "shape_id", "no_id") + return f"type={shape_type}, name={shape_name}, id={shape_id}" + except Exception: + return "unknown_shape" + def _create_text_element( self, element_type: str, @@ -50,22 +67,99 @@ def _extract_from_shapes( ) -> list[TextElement]: """Generic method to extract content from shapes based on extractor.""" elements: list[TextElement] = [] + extractor_name = self.get_extractor_name() + total_shapes_processed = 0 + failed_extractions = 0 + + logger.debug( + "Starting shape extraction for %s on %d slides", + extractor_name, + len(list(self._get_slides(presentation, slide))), + ) for slide_idx, sld in self._get_slides(presentation, slide): - for shape in sld.shapes: - try: - content = content_extractor(shape) - if content and content.strip(): - element = self._create_text_element( - element_type=element_type, - document_meta=document_meta, - content=content, - slide_idx=slide_idx, - shape=shape, + slide_shapes_count = 0 + slide_extracted_count = 0 + slide_failed_count = 0 + + try: + for shape in sld.shapes: + total_shapes_processed += 1 + slide_shapes_count += 1 + + try: + content = content_extractor(shape) + if content and content.strip(): + element = self._create_text_element( + element_type=element_type, + document_meta=document_meta, + content=content, + slide_idx=slide_idx, + shape=shape, + ) + elements.append(element) + slide_extracted_count += 1 + logger.debug( + "Successfully extracted %s content from shape on slide %d", element_type, slide_idx + ) + except (AttributeError, TypeError) as e: + failed_extractions += 1 + slide_failed_count += 1 + shape_info = self._get_shape_info(shape) + logger.warning( + "Failed to extract content from shape on slide %d using %s: %s. Shape: %s", + slide_idx, + extractor_name, + str(e), + shape_info, + exc_info=False, ) - elements.append(element) - except (AttributeError, TypeError): - continue + except Exception as e: + failed_extractions += 1 + slide_failed_count += 1 + shape_info = self._get_shape_info(shape) + logger.error( + "Unexpected error extracting content from shape on slide %d using %s: %s. Shape: %s", + slide_idx, + extractor_name, + str(e), + shape_info, + exc_info=True, + ) + + logger.debug( + "Slide %d processing complete: %d shapes total, %d extracted, %d failed", + slide_idx, + slide_shapes_count, + slide_extracted_count, + slide_failed_count, + ) + + except Exception as e: + logger.error( + "Failed to process slide %d with %s: %s", + slide_idx, + extractor_name, + str(e), + exc_info=True, + ) + raise PptxSlideProcessingError(extractor_name, slide_idx, e) from e + + success_rate = ( + ((total_shapes_processed - failed_extractions) / total_shapes_processed * 100) + if total_shapes_processed > 0 + else 100.0 + ) + + logger.info( + "%s extraction completed: %d elements extracted, %d total shapes processed, " + "%d failed extractions (%.1f%% success rate)", + extractor_name, + len(elements), + total_shapes_processed, + failed_extractions, + success_rate, + ) return elements @@ -93,12 +187,19 @@ def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None ) -> list[TextElement]: """Extract text content from the presentation or a specific slide.""" - return self._extract_from_shapes( - presentation=presentation, - document_meta=document_meta, - slide=slide, - content_extractor=self._extract_text_content, - ) + logger.debug("Starting text extraction from PPTX document") + try: + elements = self._extract_from_shapes( + presentation=presentation, + document_meta=document_meta, + slide=slide, + content_extractor=self._extract_text_content, + ) + logger.debug("Text extraction completed: %d elements found", len(elements)) + return elements + except Exception as e: + logger.error("Text extraction failed: %s", str(e), exc_info=True) + raise PptxExtractorError(self.get_extractor_name(), e) from e def get_extractor_name(self) -> str: """Get the name of this extractor.""" @@ -195,29 +296,36 @@ def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None ) -> list[TextElement]: """Extract metadata from the presentation.""" - core_properties = presentation.core_properties - properties = [ - ("author", core_properties.author), - ("title", core_properties.title), - ("subject", core_properties.subject), - ("keywords", core_properties.keywords), - ("category", core_properties.category), - ("created", str(core_properties.created) if core_properties.created else None), - ("modified", str(core_properties.modified) if core_properties.modified else None), - ] - - elements = [] - for prop_name, prop_value in properties: - if prop_value is not None and str(prop_value).strip(): - element = self._create_text_element( - element_type="metadata", - document_meta=document_meta, - content=f"{prop_name}: {prop_value}", - slide_idx=0, - ) - elements.append(element) + logger.debug("Starting metadata extraction from PPTX document") + try: + core_properties = presentation.core_properties + properties = [ + ("author", core_properties.author), + ("title", core_properties.title), + ("subject", core_properties.subject), + ("keywords", core_properties.keywords), + ("category", core_properties.category), + ("created", str(core_properties.created) if core_properties.created else None), + ("modified", str(core_properties.modified) if core_properties.modified else None), + ] + + elements = [] + for prop_name, prop_value in properties: + if prop_value is not None and str(prop_value).strip(): + element = self._create_text_element( + element_type="metadata", + document_meta=document_meta, + content=f"{prop_name}: {prop_value}", + slide_idx=0, + ) + elements.append(element) + logger.debug("Extracted metadata property: %s", prop_name) - return elements + logger.debug("Metadata extraction completed: %d properties found", len(elements)) + return elements + except Exception as e: + logger.error("Metadata extraction failed: %s", str(e), exc_info=True) + raise PptxExtractorError(self.get_extractor_name(), e) from e def get_extractor_name(self) -> str: """Get the name of this extractor.""" @@ -231,33 +339,55 @@ def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None ) -> list[TextElement]: """Extract speaker notes from the presentation or a specific slide.""" - elements: list[TextElement] = [] - - for slide_idx, sld in self._get_slides(presentation, slide): - if sld.has_notes_slide and sld.notes_slide.notes_text_frame is not None: - notes_slide = sld.notes_slide - notes_text_frame = notes_slide.notes_text_frame - text = getattr(notes_text_frame, "text", None) - text = text.strip() if text else None - - if text: - coordinates = { - "left": notes_text_frame.margin_left, - "right": notes_text_frame.margin_right, - "top": notes_text_frame.margin_top, - "bottom": notes_text_frame.margin_bottom, - } + logger.debug("Starting speaker notes extraction from PPTX document") + try: + elements: list[TextElement] = [] + slides_with_notes = 0 + total_slides = len(list(self._get_slides(presentation, slide))) - element = self._create_text_element( - element_type="speaker_notes", - document_meta=document_meta, - content=text, - slide_idx=slide_idx, - coordinates=coordinates, + for slide_idx, sld in self._get_slides(presentation, slide): + try: + if sld.has_notes_slide and sld.notes_slide.notes_text_frame is not None: + notes_slide = sld.notes_slide + notes_text_frame = notes_slide.notes_text_frame + text = getattr(notes_text_frame, "text", None) + text = text.strip() if text else None + + if text: + slides_with_notes += 1 + try: + coordinates = { + "left": getattr(notes_text_frame, "margin_left", 0), + "right": getattr(notes_text_frame, "margin_right", 0), + "top": getattr(notes_text_frame, "margin_top", 0), + "bottom": getattr(notes_text_frame, "margin_bottom", 0), + } + except (AttributeError, TypeError): + coordinates = {} + + element = self._create_text_element( + element_type="speaker_notes", + document_meta=document_meta, + content=text, + slide_idx=slide_idx, + coordinates=coordinates, + ) + elements.append(element) + logger.debug("Extracted speaker notes from slide %d", slide_idx) + except Exception as e: + logger.warning( + "Failed to extract speaker notes from slide %d: %s", slide_idx, str(e), exc_info=False ) - elements.append(element) - return elements + logger.debug( + "Speaker notes extraction completed: %d slides with notes out of %d total slides", + slides_with_notes, + total_slides, + ) + return elements + except Exception as e: + logger.error("Speaker notes extraction failed: %s", str(e), exc_info=True) + raise PptxExtractorError(self.get_extractor_name(), e) from e def get_extractor_name(self) -> str: """Get the name of this extractor.""" diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py index f9ee8dbad..1ede7be09 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py @@ -4,9 +4,12 @@ from pptx import Presentation -from ragbits.document_search.documents.document import Document, DocumentType, DocumentMeta +from ragbits.document_search.documents.document import Document, DocumentMeta, DocumentType from ragbits.document_search.documents.element import Element from ragbits.document_search.ingestion.parsers.base import DocumentParser +from ragbits.document_search.ingestion.parsers.pptx.exceptions import ( + PptxPresentationError, +) from ragbits.document_search.ingestion.parsers.pptx.extractors import ( DEFAULT_EXTRACTORS, BasePptxExtractor, @@ -33,6 +36,7 @@ def __init__( extractors: List of extractors to use. If None, uses DEFAULT_EXTRACTORS. """ self.extractors = extractors or DEFAULT_EXTRACTORS + logger.debug("Initialized PptxDocumentParser with %d extractors", len(self.extractors)) async def parse(self, document: Document) -> list[Element]: """ @@ -43,17 +47,75 @@ async def parse(self, document: Document) -> list[Element]: Returns: List of extracted elements. + + Raises: + PptxPresentationError: If the PPTX file cannot be loaded or processed. + PptxExtractorError: If an extractor fails completely. """ self.validate_document_type(document.metadata.document_type) document_path = document.local_path document_meta = DocumentMeta.from_local_path(document_path) extracted_elements: list[Element] = [] - presentation = Presentation(document_path.as_posix()) + + logger.info("Starting PPTX parsing for document: %s", document_path.name) + + try: + presentation = Presentation(document_path.as_posix()) + logger.debug("Successfully loaded PPTX presentation with %d slides", len(presentation.slides)) + except Exception as e: + logger.error("Failed to load PPTX presentation from %s: %s", document_path, str(e), exc_info=True) + raise PptxPresentationError(str(document_path), e) from e + + successful_extractors = 0 + failed_extractors = 0 + total_elements_extracted = 0 for extractor in self.extractors: - extracted_elements.extend( - extractor.extract(presentation, document_meta) + extractor_name = extractor.get_extractor_name() + logger.debug("Running extractor: %s", extractor_name) + + try: + extractor_elements = extractor.extract(presentation, document_meta) + extracted_elements.extend(extractor_elements) + successful_extractors += 1 + total_elements_extracted += len(extractor_elements) + + logger.debug( + "Extractor %s completed successfully: %d elements extracted", + extractor_name, + len(extractor_elements), + ) + + except Exception as e: + failed_extractors += 1 + logger.error( + "Extractor %s failed completely: %s", + extractor_name, + str(e), + exc_info=True, + ) + + # For now, we continue with other extractors instead of raising + # This allows partial extraction if some extractors fail + logger.warning("Continuing with remaining extractors despite %s failure", extractor_name) + + logger.info( + "PPTX parsing completed for %s: %d total elements extracted, %d/%d extractors successful", + document_path.name, + total_elements_extracted, + successful_extractors, + len(self.extractors), + ) + + if failed_extractors > 0: + logger.warning( + "Some extractors failed during parsing: %d successful, %d failed", + successful_extractors, + failed_extractors, ) + if not extracted_elements: + logger.warning("No elements were extracted from the PPTX document: %s", document_path.name) + return extracted_elements From 426a6ba2833cef70d1421df0ce7b89e99d9dba75 Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Thu, 17 Jul 2025 11:14:28 +0200 Subject: [PATCH 09/24] chore: remove temporary PPTX parser test script - Deleted the test script for creating dummy PPTX files, which was used for development and PR testing purposes. This script will not be included in the final merge. --- examples/document-search/test_pptx_parser.py | 102 ------------------- 1 file changed, 102 deletions(-) delete mode 100644 examples/document-search/test_pptx_parser.py diff --git a/examples/document-search/test_pptx_parser.py b/examples/document-search/test_pptx_parser.py deleted file mode 100644 index 53d6ca971..000000000 --- a/examples/document-search/test_pptx_parser.py +++ /dev/null @@ -1,102 +0,0 @@ -# This is a temporary script for development purposes and PR testing. -# It will be removed before merging. - -from __future__ import annotations - -import asyncio -import os -from pathlib import Path -from typing import cast - -from pptx import Presentation -from pptx.util import Inches -from pptx.shapes.autoshape import Shape - -from ragbits.core.sources.local import LocalFileSource -from ragbits.document_search.documents.document import Document, DocumentMeta, DocumentType -from ragbits.document_search.ingestion.parsers.pptx.parser import PptxDocumentParser - - -async def create_dummy_pptx(file_path: str): - """Creates a dummy PPTX file for testing.""" - prs = Presentation() - - # Slide 1: Title Slide - title_slide_layout = prs.slide_layouts[0] - slide1 = prs.slides.add_slide(title_slide_layout) - title = slide1.shapes.title - subtitle = slide1.placeholders[1] - if title and title.has_text_frame: - title.text_frame.text = "Test Presentation" - if subtitle and subtitle.has_text_frame: - shape = cast(Shape, subtitle) - shape.text_frame.text = "A presentation for testing the PPTX parser." - - # Slide 2: Text, Shape, and Hyperlink - bullet_slide_layout = prs.slide_layouts[1] - slide2 = prs.slides.add_slide(bullet_slide_layout) - shapes = slide2.shapes - title_shape = shapes.title - if title_shape and title_shape.has_text_frame: - title_shape.text_frame.text = "This is a slide with text, a shape, and a hyperlink." - - body_shape = shapes.placeholders[1] - if body_shape and body_shape.has_text_frame: - tf = cast(Shape, body_shape).text_frame - tf.text = "This is a bullet point." - - p = tf.add_paragraph() - p.text = "This is a line with a " - r = p.add_run() - r.text = "hyperlink" - if r.hyperlink: - r.hyperlink.address = "https://www.google.com" - - # Slide 3: Image - img_slide_layout = prs.slide_layouts[5] - slide3 = prs.slides.add_slide(img_slide_layout) - img_path = "packages/ragbits-core/tests/assets/img/test.png" - if os.path.exists(img_path): - left = top = Inches(1) - slide3.shapes.add_picture(img_path, left, top) - - # Slide 4: With speaker notes - notes_slide_layout = prs.slide_layouts[1] - slide4 = prs.slides.add_slide(notes_slide_layout) - if slide4.has_notes_slide: - notes_slide = slide4.notes_slide - if notes_slide.notes_text_frame: - text_frame = notes_slide.notes_text_frame - text_frame.text = "These are speaker notes for slide 4." - - prs.save(file_path) - - -async def main(): - """Main function to test the PPTX parser.""" - pptx_file = "test_pptx.pptx" - await create_dummy_pptx(pptx_file) - - try: - document_meta = DocumentMeta( - document_type=DocumentType.PPTX, - source=LocalFileSource(path=Path(pptx_file)), - ) - document = Document.from_document_meta(document_meta, Path(pptx_file)) - - parser = PptxDocumentParser() - elements = await parser.parse(document) - - print(f"--- Extracted {len(elements)} elements ---") - for element in elements: - print(f"Type: {element.element_type}") - print(f"Content: {element.text_representation}") - print(f"Location: {element.location}") - print("-" * 20) - - except Exception as e: - print(f"Error: {e}") - - -if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file From ea41ed310ed5525d42bae5c358391bf1918773fd Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Thu, 17 Jul 2025 11:27:17 +0200 Subject: [PATCH 10/24] refactor(pptx): convert extractor methods to static methods - Updated several methods in the BasePptxExtractor and its subclasses to be static, improving clarity and reducing unnecessary instance dependencies. - Methods modified include _get_slides, _get_shape_info, _extract_text_content, _extract_hyperlink_content, _extract_image_content, _extract_shape_content, and get_extractor_name across various extractor classes. --- .../parsers/pptx/extractors/extractors.py | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py index 8454f15d9..c37d6ee56 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py @@ -25,12 +25,14 @@ class BasePptxExtractor(ABC): """Base class for all PPTX content extractors.""" - def _get_slides(self, presentation: Presentation, slide: Slide | None = None) -> list[tuple[int, Slide]]: + @staticmethod + def _get_slides(presentation: Presentation, slide: Slide | None = None) -> list[tuple[int, Slide]]: """Get slides with their indices.""" slides = [slide] if slide else list(presentation.slides) return list(enumerate(slides, start=1)) - def _get_shape_info(self, shape: BaseShape) -> str: + @staticmethod + def _get_shape_info(shape: BaseShape) -> str: """Get descriptive information about a shape for logging purposes.""" try: shape_type = getattr(shape, "shape_type", "unknown") @@ -40,8 +42,8 @@ def _get_shape_info(self, shape: BaseShape) -> str: except Exception: return "unknown_shape" + @staticmethod def _create_text_element( - self, element_type: str, document_meta: DocumentMeta, content: str, @@ -177,7 +179,8 @@ def get_extractor_name(self) -> str: class PptxTextExtractor(BasePptxExtractor): """Extracts text content from text frames.""" - def _extract_text_content(self, shape: BaseShape) -> str | None: + @staticmethod + def _extract_text_content(shape: BaseShape) -> str | None: """Extract text content from a shape.""" if not isinstance(shape, Shape): return None @@ -201,7 +204,8 @@ def extract( logger.error("Text extraction failed: %s", str(e), exc_info=True) raise PptxExtractorError(self.get_extractor_name(), e) from e - def get_extractor_name(self) -> str: + @staticmethod + def get_extractor_name() -> str: """Get the name of this extractor.""" return "pptx_text_extractor" @@ -209,7 +213,8 @@ def get_extractor_name(self) -> str: class PptxHyperlinkExtractor(BasePptxExtractor): """Extracts hyperlink addresses from shapes.""" - def _extract_hyperlink_content(self, shape: BaseShape) -> str | None: + @staticmethod + def _extract_hyperlink_content(shape: BaseShape) -> str | None: """Extract hyperlink content from a shape.""" if not hasattr(shape, "click_action") or isinstance(shape, GroupShape): return None @@ -229,7 +234,8 @@ def extract( element_type="hyperlink", ) - def get_extractor_name(self) -> str: + @staticmethod + def get_extractor_name() -> str: """Get the name of this extractor.""" return "pptx_hyperlink_extractor" @@ -237,7 +243,8 @@ def get_extractor_name(self) -> str: class PptxImageExtractor(BasePptxExtractor): """Extracts image information from shapes.""" - def _extract_image_content(self, shape: BaseShape) -> str | None: + @staticmethod + def _extract_image_content(shape: BaseShape) -> str | None: """Extract image content from a shape.""" if not isinstance(shape, Picture): return None @@ -258,7 +265,8 @@ def extract( element_type="image", ) - def get_extractor_name(self) -> str: + @staticmethod + def get_extractor_name() -> str: """Get the name of this extractor.""" return "pptx_image_extractor" @@ -266,7 +274,8 @@ def get_extractor_name(self) -> str: class PptxShapeExtractor(BasePptxExtractor): """Extracts shape information and metadata.""" - def _extract_shape_content(self, shape: BaseShape) -> str | None: + @staticmethod + def _extract_shape_content(shape: BaseShape) -> str | None: """Extract shape metadata from a shape.""" if not hasattr(shape, "shape_type"): return None @@ -284,7 +293,8 @@ def extract( element_type="shape", ) - def get_extractor_name(self) -> str: + @staticmethod + def get_extractor_name() -> str: """Get the name of this extractor.""" return "pptx_shape_extractor" @@ -327,7 +337,8 @@ def extract( logger.error("Metadata extraction failed: %s", str(e), exc_info=True) raise PptxExtractorError(self.get_extractor_name(), e) from e - def get_extractor_name(self) -> str: + @staticmethod + def get_extractor_name() -> str: """Get the name of this extractor.""" return "pptx_metadata_extractor" @@ -389,7 +400,8 @@ def extract( logger.error("Speaker notes extraction failed: %s", str(e), exc_info=True) raise PptxExtractorError(self.get_extractor_name(), e) from e - def get_extractor_name(self) -> str: + @staticmethod + def get_extractor_name() -> str: """Get the name of this extractor.""" return "pptx_speaker_notes_extractor" From 38ffe8b174f24855fc31aa6bf2f36c681af401b9 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Fri, 18 Jul 2025 08:51:44 -0400 Subject: [PATCH 11/24] remove impersonation at class level and define it at instance level. --- .../src/ragbits/core/sources/google_drive.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py index eb1f8337b..9622b355e 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py +++ b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py @@ -67,9 +67,6 @@ class GoogleDriveSource(Source): is_folder: bool = False protocol: ClassVar[str] = "google_drive" - _impersonate: bool = False - _impersonate_target_email: str | None = None - _google_drive_client: ClassVar["GoogleAPIResource | None"] = None _credentials_file_path: ClassVar[str | None] = None @@ -92,8 +89,8 @@ def set_impersonation_target(cls, target_mail: str): # check if email is a valid email. if not target_mail or "@" not in target_mail: raise ValueError("Invalid email address provided for impersonation.") - cls._impersonate = True - cls._impersonate_target_email = target_mail + cls.impersonate = True + cls.impersonate_target_email = target_mail @classmethod def _initialize_client_from_creds(cls) -> None: @@ -117,10 +114,10 @@ def _initialize_client_from_creds(cls) -> None: } # handle impersonation - if cls._impersonate: - if not cls._impersonate_target_email: + if not (cls.impersonate is None) and cls.impersonate: + if not cls.impersonate_target_email: raise ValueError("Impersonation target email must be set when impersonation is enabled.") - cred_kwargs["subject"] = cls._impersonate_target_email + cred_kwargs["subject"] = cls.impersonate_target_email cred_kwargs["scopes"] = _IMPERSONATION_SCOPES creds = service_account.Credentials.from_service_account_file(**cred_kwargs) From 466fe37cfbbb210a1d6f2b11fe5be492f9643720 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Fri, 18 Jul 2025 09:26:22 -0400 Subject: [PATCH 12/24] updated tests --- .../src/ragbits/core/sources/google_drive.py | 3 +++ .../tests/unit/sources/test_google_drive.py | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py index 9622b355e..0223e14ee 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py +++ b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py @@ -59,6 +59,9 @@ class GoogleDriveSource(Source): """ Handles source connection for Google Drive and provides methods to fetch files. + + NOTE(Do not define variables at class level that you pass to google client, define them at instance level, or else + google client will complain.): """ file_id: str diff --git a/packages/ragbits-core/tests/unit/sources/test_google_drive.py b/packages/ragbits-core/tests/unit/sources/test_google_drive.py index 223ae2ec6..3e9539f85 100644 --- a/packages/ragbits-core/tests/unit/sources/test_google_drive.py +++ b/packages/ragbits-core/tests/unit/sources/test_google_drive.py @@ -49,6 +49,18 @@ def setup_local_storage_dir(tmp_path: Path): else: del os.environ["LOCAL_STORAGE_DIR"] +@pytest.mark.asnycio +async def test_google_drive_impersonate(): + """Test service account impersonation with better error handling.""" + target_email = os.environ.get("GOOGLE_DRIVE_TARGET_EMAIL") + credentials_file = "test_clientid.json" + + GoogleDriveSource.set_credentials_file_path(credentials_file) + GoogleDriveSource.set_impersonation_target(target_email) + + unit_test_folder_id = os.environ.get("GOOGLE_SOURCE_UNIT_TEST_FOLDER") + + sources_to_download = await GoogleDriveSource.from_uri(f"{unit_test_folder_id}/**") @pytest.mark.asyncio async def test_google_drive_source_fetch_file_not_found(): @@ -86,7 +98,6 @@ async def test_google_drive_source_unsupported_uri_pattern(): with pytest.raises(ValueError, match="Unsupported Google Drive URI pattern:"): await GoogleDriveSource.from_uri("just_a_path/to/a/file.txt") - @pytest.mark.asyncio async def test_google_drive_source_fetch_file(): """ From 5dd7fe4d649f3deb7f08cd03b9091134120d3947 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Fri, 18 Jul 2025 09:33:10 -0400 Subject: [PATCH 13/24] impersonation same loop --- .../tests/unit/sources/test_google_drive.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/ragbits-core/tests/unit/sources/test_google_drive.py b/packages/ragbits-core/tests/unit/sources/test_google_drive.py index 3e9539f85..a14dc8ddc 100644 --- a/packages/ragbits-core/tests/unit/sources/test_google_drive.py +++ b/packages/ragbits-core/tests/unit/sources/test_google_drive.py @@ -61,6 +61,38 @@ async def test_google_drive_impersonate(): unit_test_folder_id = os.environ.get("GOOGLE_SOURCE_UNIT_TEST_FOLDER") sources_to_download = await GoogleDriveSource.from_uri(f"{unit_test_folder_id}/**") + downloaded_count = 0 + + try: + # Iterate through each source (file or folder) found + for source in sources_to_download: + # Only attempt to fetch files, as folders cannot be "downloaded" in the same way + if not source.is_folder: + try: + # Attempt to fetch (download) the file. + local_path = await source.fetch() + print(f" Downloaded: '{source.file_name}' (ID: {source.file_id}) to '{local_path}'") + downloaded_count += 1 + except HttpError as e: + # Catch Google API specific HTTP errors (e.g., permission denied, file not found) + print(f" Google API Error downloading '{source.file_name}' (ID: {source.file_id}): {e}") + except Exception as e: + # Catch any other general exceptions during the download process + print(f" Failed to download '{source.file_name}' (ID: {source.file_id}): {e}") + else: + print(f" Skipping folder: '{source.file_name}' (ID: {source.file_id})") + + except Exception as e: + # Catch any exceptions that occur during the initial setup or `from_uri` call + print(f"An error occurred during test setup or source retrieval: {e}") + + finally: + # This block ensures the final summary is printed regardless of errors + print(f"\n--- Successfully downloaded {downloaded_count} files from '{unit_test_folder_id}' ---") + # Assert that at least one file was downloaded if that's an expectation for the test + # If no files are expected, or it's acceptable for 0 files to be downloaded, remove or adjust this assertion. + assert downloaded_count > 0, "Expected to download at least one file, but downloaded 0." + @pytest.mark.asyncio async def test_google_drive_source_fetch_file_not_found(): From 238f8fd1596297f0285b72c2a0a0d6c27c3c3a59 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Fri, 18 Jul 2025 09:35:08 -0400 Subject: [PATCH 14/24] updated environment variables. --- .github/workflows/shared-packages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/shared-packages.yml b/.github/workflows/shared-packages.yml index de9a73067..71c623680 100644 --- a/.github/workflows/shared-packages.yml +++ b/.github/workflows/shared-packages.yml @@ -200,6 +200,7 @@ jobs: env: GOOGLE_DRIVE_CLIENTID_JSON: ${{ secrets.GOOGLE_DRIVE_CLIENTID_JSON }} GOOGLE_SOURCE_UNIT_TEST_FOLDER: ${{ secrets.GOOGLE_SOURCE_UNIT_TEST_FOLDER }} + GOOGLE_DRIVE_TARGET_EMAIL: ${{ secrets.GOOGLE_DRIVE_TARGET_EMAIL }} - name: Test Report uses: mikepenz/action-junit-report@v4 From 45249894627e9c0ec2f8b744f3f241919c3acd1c Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Fri, 18 Jul 2025 09:44:24 -0400 Subject: [PATCH 15/24] impersonation support changelog --- packages/ragbits-core/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ragbits-core/CHANGELOG.md b/packages/ragbits-core/CHANGELOG.md index 058b7bb71..099407059 100644 --- a/packages/ragbits-core/CHANGELOG.md +++ b/packages/ragbits-core/CHANGELOG.md @@ -6,6 +6,7 @@ - Add LLM Usage to LLMResponseWithMetadata (#700) - Split usage per model type (#715) - Add support for batch generation (#608) +- Added Google Drive support for impersonation and presentation-to-pdf (#724) ## 1.1.0 (2025-07-09) From 6a6535411ea81dd0872fdbb143b94183c1d99ee7 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Fri, 18 Jul 2025 10:24:43 -0400 Subject: [PATCH 16/24] updated how to and formatted. --- docs/how-to/sources/google-drive.md | 37 +++++++++++++++++++ .../src/ragbits/core/sources/google_drive.py | 11 +++--- .../tests/unit/sources/test_google_drive.py | 4 +- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/docs/how-to/sources/google-drive.md b/docs/how-to/sources/google-drive.md index 6fab274e1..75ccfb6dd 100644 --- a/docs/how-to/sources/google-drive.md +++ b/docs/how-to/sources/google-drive.md @@ -187,6 +187,43 @@ async def process_drive_documents(): asyncio.run(process_drive_documents()) ``` +## Impersonating Google Accounts + +You can configure your Google service account to impersonate other users in your Google Workspace domain. This is useful when you need to access files or perform actions on behalf of specific users. + +### Step 1: Enable Domain-Wide Delegation + +1. **Sign in to the [Google Admin Console](https://admin.google.com/) as a Super Admin.** +2. Navigate to: + **Security > Access and data control > API controls > MANAGE DOMAIN WIDE DELEGATION** +3. Add a new API client or edit an existing one, and include the following OAuth scopes: + - `https://www.googleapis.com/auth/cloud-platform` + - `https://www.googleapis.com/auth/drive` +4. Click **Authorize** or **Save** to apply the changes. + +### Step 2: Impersonate a User in Your Code + +After configuring domain-wide delegation, you can specify a target user to impersonate when using the `GoogleDriveSource` in your code. + +```python +from ragbits.core.sources.google_drive import GoogleDriveSource + +target_email = "johnDoe@yourdomain.com" +credentials_file = "service-account-key.json" + +# Set the path to your service account key file +GoogleDriveSource.set_credentials_file_path(credentials_file) + +# Set the email address of the user to impersonate +GoogleDriveSource.set_impersonation_target(target_email) +``` + +**Note:** +- The `target_email` must be a valid user in your Google Workspace domain. +- Ensure your service account has been granted domain-wide delegation as described above. + +This setup allows your service account to act on behalf of the specified user, enabling access to their Google Drive files and resources as permitted by the assigned scopes. + ## Troubleshooting ### Common Issues diff --git a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py index 0223e14ee..2c2c52dd2 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py +++ b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py @@ -35,7 +35,7 @@ _GOOGLE_EXPORT_MIME_MAP = { "application/vnd.google-apps.document": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", # noqa: E501 "application/vnd.google-apps.spreadsheet": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", # noqa: E501 - "application/vnd.google-apps.presentation": "application/pdf", + "application/vnd.google-apps.presentation": "application/pdf", "application/vnd.google-apps.drawing": "image/png", "application/vnd.google-apps.script": "application/vnd.google-apps.script+json", "application/vnd.google-apps.site": "text/html", @@ -79,17 +79,17 @@ def set_credentials_file_path(cls, path: str) -> None: cls._credentials_file_path = path @classmethod - def set_impersonation_target(cls, target_mail: str): + def set_impersonation_target(cls, target_mail: str): """ Sets the email address to impersonate when accessing Google Drive resources. - + Args: target_mail (str): The email address to impersonate. Raises: ValueError: If the provided email address is invalid (empty or missing '@'). """ - # check if email is a valid email. + # check if email is a valid email. if not target_mail or "@" not in target_mail: raise ValueError("Invalid email address provided for impersonation.") cls.impersonate = True @@ -110,13 +110,12 @@ def _initialize_client_from_creds(cls) -> None: Exception: If any other error occurs during client initialization. """ - cred_kwargs = { "filename": cls._credentials_file_path, "scopes": _SCOPES, } - # handle impersonation + # handle impersonation if not (cls.impersonate is None) and cls.impersonate: if not cls.impersonate_target_email: raise ValueError("Impersonation target email must be set when impersonation is enabled.") diff --git a/packages/ragbits-core/tests/unit/sources/test_google_drive.py b/packages/ragbits-core/tests/unit/sources/test_google_drive.py index a14dc8ddc..2d7a025dd 100644 --- a/packages/ragbits-core/tests/unit/sources/test_google_drive.py +++ b/packages/ragbits-core/tests/unit/sources/test_google_drive.py @@ -62,8 +62,8 @@ async def test_google_drive_impersonate(): sources_to_download = await GoogleDriveSource.from_uri(f"{unit_test_folder_id}/**") downloaded_count = 0 - - try: + + try: # Iterate through each source (file or folder) found for source in sources_to_download: # Only attempt to fetch files, as folders cannot be "downloaded" in the same way From 20df7d2d91b010877c1f7b86a3211c71294e7134 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Fri, 18 Jul 2025 10:30:39 -0400 Subject: [PATCH 17/24] updated for ruff --- packages/ragbits-core/tests/unit/sources/test_google_drive.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/ragbits-core/tests/unit/sources/test_google_drive.py b/packages/ragbits-core/tests/unit/sources/test_google_drive.py index 2d7a025dd..6d80298e1 100644 --- a/packages/ragbits-core/tests/unit/sources/test_google_drive.py +++ b/packages/ragbits-core/tests/unit/sources/test_google_drive.py @@ -49,6 +49,7 @@ def setup_local_storage_dir(tmp_path: Path): else: del os.environ["LOCAL_STORAGE_DIR"] + @pytest.mark.asnycio async def test_google_drive_impersonate(): """Test service account impersonation with better error handling.""" @@ -130,6 +131,7 @@ async def test_google_drive_source_unsupported_uri_pattern(): with pytest.raises(ValueError, match="Unsupported Google Drive URI pattern:"): await GoogleDriveSource.from_uri("just_a_path/to/a/file.txt") + @pytest.mark.asyncio async def test_google_drive_source_fetch_file(): """ From 54da82bf941100d24eb9fda500f454b6d77f6c42 Mon Sep 17 00:00:00 2001 From: pocucan-ds Date: Fri, 18 Jul 2025 10:34:54 -0400 Subject: [PATCH 18/24] updated signature --- .../ragbits-core/src/ragbits/core/sources/google_drive.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py index 2c2c52dd2..086ac4481 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py +++ b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py @@ -79,7 +79,7 @@ def set_credentials_file_path(cls, path: str) -> None: cls._credentials_file_path = path @classmethod - def set_impersonation_target(cls, target_mail: str): + def set_impersonation_target(cls, target_mail: str) -> None: """ Sets the email address to impersonate when accessing Google Drive resources. @@ -109,14 +109,13 @@ def _initialize_client_from_creds(cls) -> None: HttpError: If the Google Drive API is not enabled or accessible. Exception: If any other error occurs during client initialization. """ - cred_kwargs = { "filename": cls._credentials_file_path, "scopes": _SCOPES, } # handle impersonation - if not (cls.impersonate is None) and cls.impersonate: + if cls.impersonate is not None and cls.impersonate: if not cls.impersonate_target_email: raise ValueError("Impersonation target email must be set when impersonation is enabled.") cred_kwargs["subject"] = cls.impersonate_target_email From da272a831717fdf939c99acc3f2e73365bab3e2f Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Mon, 21 Jul 2025 14:44:21 +0200 Subject: [PATCH 19/24] Add impersonation attributes to GoogleDriveSource and update tests for environment variable checks --- .../src/ragbits/core/sources/google_drive.py | 2 ++ .../tests/unit/sources/test_google_drive.py | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py index 086ac4481..b6301c02b 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py +++ b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py @@ -72,6 +72,8 @@ class GoogleDriveSource(Source): _google_drive_client: ClassVar["GoogleAPIResource | None"] = None _credentials_file_path: ClassVar[str | None] = None + impersonate: ClassVar[bool | None] = None + impersonate_target_email: ClassVar[str | None] = None @classmethod def set_credentials_file_path(cls, path: str) -> None: diff --git a/packages/ragbits-core/tests/unit/sources/test_google_drive.py b/packages/ragbits-core/tests/unit/sources/test_google_drive.py index 6d80298e1..1230fdf0b 100644 --- a/packages/ragbits-core/tests/unit/sources/test_google_drive.py +++ b/packages/ragbits-core/tests/unit/sources/test_google_drive.py @@ -57,10 +57,17 @@ async def test_google_drive_impersonate(): credentials_file = "test_clientid.json" GoogleDriveSource.set_credentials_file_path(credentials_file) + + if target_email is None: + pytest.skip("GOOGLE_DRIVE_TARGET_EMAIL environment variable not set") + GoogleDriveSource.set_impersonation_target(target_email) unit_test_folder_id = os.environ.get("GOOGLE_SOURCE_UNIT_TEST_FOLDER") + if unit_test_folder_id is None: + pytest.skip("GOOGLE_SOURCE_UNIT_TEST_FOLDER environment variable not set") + sources_to_download = await GoogleDriveSource.from_uri(f"{unit_test_folder_id}/**") downloaded_count = 0 @@ -144,6 +151,9 @@ async def test_google_drive_source_fetch_file(): """ unit_test_folder_id = os.environ.get("GOOGLE_SOURCE_UNIT_TEST_FOLDER") + if unit_test_folder_id is None: + pytest.skip("GOOGLE_SOURCE_UNIT_TEST_FOLDER environment variable not set") + # Initialize a counter for successfully downloaded files downloaded_count = 0 From 55c3f348bfdf70d3e4e191fd8caeee3b04f0e757 Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Thu, 24 Jul 2025 22:10:43 +0200 Subject: [PATCH 20/24] Add GoogleDriveExportFormat enum and update MIME type handling in GoogleDriveSource - Introduced GoogleDriveExportFormat enum to standardize export MIME types. - Updated _GOOGLE_EXPORT_MIME_MAP and _EXPORT_EXTENSION_MAP to use the new enum. - Modified fetch method to accept an optional export_format parameter for overriding MIME types. - Enhanced _determine_file_extension method to support MIME type overrides. - Added unit test for verifying correct file extension determination with overridden MIME types. --- .../src/ragbits/core/sources/google_drive.py | 86 +++++++++++++------ .../tests/unit/sources/test_google_drive.py | 20 ++++- 2 files changed, 78 insertions(+), 28 deletions(-) diff --git a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py index b6301c02b..ccd3d4f02 100644 --- a/packages/ragbits-core/src/ragbits/core/sources/google_drive.py +++ b/packages/ragbits-core/src/ragbits/core/sources/google_drive.py @@ -1,6 +1,7 @@ -import os # Import os for path joining and potential directory checks +import os from collections.abc import Iterable from contextlib import suppress +from enum import Enum from pathlib import Path from typing import Any, ClassVar @@ -31,28 +32,41 @@ _HTTP_FORBIDDEN = 403 +class GoogleDriveExportFormat(str, Enum): + """Supported export MIME types for Google Drive downloads.""" + + DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation" + PDF = "application/pdf" + PNG = "image/png" + HTML = "text/html" + TXT = "text/plain" + JSON = "application/json" + + # Maps Google-native Drive MIME types → export MIME types -_GOOGLE_EXPORT_MIME_MAP = { - "application/vnd.google-apps.document": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", # noqa: E501 - "application/vnd.google-apps.spreadsheet": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", # noqa: E501 - "application/vnd.google-apps.presentation": "application/pdf", - "application/vnd.google-apps.drawing": "image/png", - "application/vnd.google-apps.script": "application/vnd.google-apps.script+json", - "application/vnd.google-apps.site": "text/html", - "application/vnd.google-apps.map": "application/json", - "application/vnd.google-apps.form": "application/pdf", +_GOOGLE_EXPORT_MIME_MAP: dict[str, GoogleDriveExportFormat] = { + "application/vnd.google-apps.document": GoogleDriveExportFormat.DOCX, + "application/vnd.google-apps.spreadsheet": GoogleDriveExportFormat.XLSX, + "application/vnd.google-apps.presentation": GoogleDriveExportFormat.PDF, + "application/vnd.google-apps.drawing": GoogleDriveExportFormat.PNG, + "application/vnd.google-apps.script": GoogleDriveExportFormat.JSON, + "application/vnd.google-apps.site": GoogleDriveExportFormat.HTML, + "application/vnd.google-apps.map": GoogleDriveExportFormat.JSON, + "application/vnd.google-apps.form": GoogleDriveExportFormat.PDF, } # Maps export MIME types → file extensions -_EXPORT_EXTENSION_MAP = { - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": ".docx", - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ".xlsx", - "application/vnd.openxmlformats-officedocument.presentationml.presentation": ".pptx", - "image/png": ".png", - "application/pdf": ".pdf", - "text/html": ".html", - "text/plain": ".txt", - "application/json": ".json", +_EXPORT_EXTENSION_MAP: dict[GoogleDriveExportFormat, str] = { + GoogleDriveExportFormat.DOCX: ".docx", + GoogleDriveExportFormat.XLSX: ".xlsx", + GoogleDriveExportFormat.PPTX: ".pptx", + GoogleDriveExportFormat.PNG: ".png", + GoogleDriveExportFormat.PDF: ".pdf", + GoogleDriveExportFormat.HTML: ".html", + GoogleDriveExportFormat.TXT: ".txt", + GoogleDriveExportFormat.JSON: ".json", } @@ -204,7 +218,11 @@ def verify_drive_api_enabled(cls) -> None: @traceable @requires_dependencies(["googleapiclient"], "google_drive") - async def fetch(self) -> Path: + async def fetch( + self, + *, + export_format: "GoogleDriveExportFormat | None" = None, + ) -> Path: """ Fetch the file from Google Drive and store it locally. @@ -213,6 +231,9 @@ async def fetch(self) -> Path: The local directory is determined by the environment variable `LOCAL_STORAGE_DIR`. If this environment variable is not set, a temporary directory is used. + Args: + export_format: Optional override for the export MIME type when downloading Google-native documents. + Returns: The local path to the downloaded file. @@ -228,7 +249,8 @@ async def fetch(self) -> Path: file_local_dir = local_dir / self.file_id file_local_dir.mkdir(parents=True, exist_ok=True) - export_mime_type, file_extension = self._determine_file_extension() + override_mime = export_format.value if export_format else None + export_mime_type, file_extension = self._determine_file_extension(override_mime=override_mime) local_file_name = f"{self.file_name}{file_extension}" path = file_local_dir / local_file_name @@ -538,22 +560,36 @@ async def from_uri(cls, path: str) -> Iterable[Self]: else: raise ValueError(f"Unsupported Google Drive URI pattern: {path}") - def _determine_file_extension(self) -> tuple[str, str]: + def _determine_file_extension(self, override_mime: str | None = None) -> tuple[str, str]: """ Determine the appropriate file extension and export MIME type for the file. Returns: A tuple of (export_mime_type, file_extension) """ + if override_mime is not None: + export_mime_type = override_mime + try: + export_format = GoogleDriveExportFormat(override_mime) + file_extension = _EXPORT_EXTENSION_MAP.get(export_format, ".bin") + except ValueError: + file_extension = Path(self.file_name).suffix if "." in self.file_name else ".bin" + return export_mime_type, file_extension + export_mime_type = self.mime_type file_extension = "" if self.mime_type.startswith("application/vnd.google-apps"): - export_mime_type = _GOOGLE_EXPORT_MIME_MAP.get(self.mime_type, "application/pdf") - file_extension = _EXPORT_EXTENSION_MAP.get(export_mime_type, ".bin") + export_format = _GOOGLE_EXPORT_MIME_MAP.get(self.mime_type, GoogleDriveExportFormat.PDF) + export_mime_type = export_format.value + file_extension = _EXPORT_EXTENSION_MAP.get(export_format, ".bin") elif "." in self.file_name: file_extension = Path(self.file_name).suffix else: - file_extension = _EXPORT_EXTENSION_MAP.get(self.mime_type, ".bin") + try: + export_format = GoogleDriveExportFormat(self.mime_type) + file_extension = _EXPORT_EXTENSION_MAP.get(export_format, ".bin") + except ValueError: + file_extension = ".bin" return export_mime_type, file_extension diff --git a/packages/ragbits-core/tests/unit/sources/test_google_drive.py b/packages/ragbits-core/tests/unit/sources/test_google_drive.py index 1230fdf0b..776dd5efb 100644 --- a/packages/ragbits-core/tests/unit/sources/test_google_drive.py +++ b/packages/ragbits-core/tests/unit/sources/test_google_drive.py @@ -1,11 +1,11 @@ -import json # Import json for potential validation or pretty printing +import json import os from pathlib import Path import pytest from googleapiclient.errors import HttpError -from ragbits.core.sources.google_drive import GoogleDriveSource +from ragbits.core.sources.google_drive import GoogleDriveExportFormat, GoogleDriveSource @pytest.fixture(autouse=True) @@ -50,7 +50,7 @@ def setup_local_storage_dir(tmp_path: Path): del os.environ["LOCAL_STORAGE_DIR"] -@pytest.mark.asnycio +@pytest.mark.asyncio async def test_google_drive_impersonate(): """Test service account impersonation with better error handling.""" target_email = os.environ.get("GOOGLE_DRIVE_TARGET_EMAIL") @@ -196,3 +196,17 @@ async def test_google_drive_source_fetch_file(): # Assert that at least one file was downloaded if that's an expectation for the test # If no files are expected, or it's acceptable for 0 files to be downloaded, remove or adjust this assertion. assert downloaded_count > 0, "Expected to download at least one file, but downloaded 0." + + +def test_determine_file_extension_override(): + """Ensure overriding export MIME type yields expected extension.""" + src = GoogleDriveSource( + file_id="dummy", + file_name="MyDoc", + mime_type="application/vnd.google-apps.document", + ) + + export_mime, extension = src._determine_file_extension(override_mime=GoogleDriveExportFormat.PDF.value) + + assert export_mime == GoogleDriveExportFormat.PDF.value + assert extension == ".pdf" From 1ca84ef97769667f681e80a01538b6c03a09fc2c Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Fri, 1 Aug 2025 14:37:16 +0200 Subject: [PATCH 21/24] refactor(pptx): streamline extraction process and enhance element creation - Removed unnecessary logging and commented code in the PptxDocumentParser and BasePptxExtractor classes. - Consolidated element creation methods for text and images, improving clarity and maintainability. - Updated extraction methods to handle elements more generically, allowing for better extensibility. --- .../parsers/pptx/extractors/extractors.py | 365 +++++++----------- .../ingestion/parsers/pptx/parser.py | 2 - 2 files changed, 139 insertions(+), 228 deletions(-) diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py index c37d6ee56..2841a23b0 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py @@ -1,6 +1,5 @@ from __future__ import annotations -import logging from abc import ABC, abstractmethod from collections.abc import Callable from typing import Any @@ -13,13 +12,7 @@ from pptx.slide import Slide from ragbits.document_search.documents.document import DocumentMeta -from ragbits.document_search.documents.element import ElementLocation, TextElement -from ragbits.document_search.ingestion.parsers.pptx.exceptions import ( - PptxExtractorError, - PptxSlideProcessingError, -) - -logger = logging.getLogger(__name__) +from ragbits.document_search.documents.element import Element, ElementLocation, ImageElement, TextElement class BasePptxExtractor(ABC): @@ -31,16 +24,6 @@ def _get_slides(presentation: Presentation, slide: Slide | None = None) -> list[ slides = [slide] if slide else list(presentation.slides) return list(enumerate(slides, start=1)) - @staticmethod - def _get_shape_info(shape: BaseShape) -> str: - """Get descriptive information about a shape for logging purposes.""" - try: - shape_type = getattr(shape, "shape_type", "unknown") - shape_name = getattr(shape, "name", "unnamed") - shape_id = getattr(shape, "shape_id", "no_id") - return f"type={shape_type}, name={shape_name}, id={shape_id}" - except Exception: - return "unknown_shape" @staticmethod def _create_text_element( @@ -59,6 +42,38 @@ def _create_text_element( return TextElement(element_type=element_type, document_meta=document_meta, location=location, content=content) + @staticmethod + def _get_coordinates(shape: BaseShape | None) -> dict[str, Any]: + """Extract coordinates from a shape.""" + if shape is None: + return {} + try: + return {"left": shape.left, "top": shape.top, "width": shape.width, "height": shape.height} + except AttributeError: + return {} + + @staticmethod + def _create_image_element( + document_meta: DocumentMeta, + image_bytes: bytes, + slide_idx: int, + shape: BaseShape | None = None, + description: str | None = None, + coordinates: dict[str, Any] | None = None, + ) -> ImageElement: + """Create an ImageElement with standardized location.""" + if coordinates is None: + coordinates = BasePptxExtractor._get_coordinates(shape) + + location = ElementLocation(page_number=slide_idx, coordinates=coordinates) + + return ImageElement( + document_meta=document_meta, + location=location, + image_bytes=image_bytes, + description=description, + ) + def _extract_from_shapes( self, presentation: Presentation, @@ -66,109 +81,32 @@ def _extract_from_shapes( slide: Slide | None, content_extractor: Callable[[BaseShape], str | None], element_type: str = "text", - ) -> list[TextElement]: + ) -> list[Element]: """Generic method to extract content from shapes based on extractor.""" - elements: list[TextElement] = [] - extractor_name = self.get_extractor_name() - total_shapes_processed = 0 - failed_extractions = 0 - - logger.debug( - "Starting shape extraction for %s on %d slides", - extractor_name, - len(list(self._get_slides(presentation, slide))), - ) - + elements: list[Element] = [] + for slide_idx, sld in self._get_slides(presentation, slide): - slide_shapes_count = 0 - slide_extracted_count = 0 - slide_failed_count = 0 - - try: - for shape in sld.shapes: - total_shapes_processed += 1 - slide_shapes_count += 1 - - try: - content = content_extractor(shape) - if content and content.strip(): - element = self._create_text_element( - element_type=element_type, - document_meta=document_meta, - content=content, - slide_idx=slide_idx, - shape=shape, - ) - elements.append(element) - slide_extracted_count += 1 - logger.debug( - "Successfully extracted %s content from shape on slide %d", element_type, slide_idx - ) - except (AttributeError, TypeError) as e: - failed_extractions += 1 - slide_failed_count += 1 - shape_info = self._get_shape_info(shape) - logger.warning( - "Failed to extract content from shape on slide %d using %s: %s. Shape: %s", - slide_idx, - extractor_name, - str(e), - shape_info, - exc_info=False, - ) - except Exception as e: - failed_extractions += 1 - slide_failed_count += 1 - shape_info = self._get_shape_info(shape) - logger.error( - "Unexpected error extracting content from shape on slide %d using %s: %s. Shape: %s", - slide_idx, - extractor_name, - str(e), - shape_info, - exc_info=True, + for shape in sld.shapes: + try: + content = content_extractor(shape) + if content and content.strip(): + element = self._create_text_element( + element_type=element_type, + document_meta=document_meta, + content=content, + slide_idx=slide_idx, + shape=shape, ) - - logger.debug( - "Slide %d processing complete: %d shapes total, %d extracted, %d failed", - slide_idx, - slide_shapes_count, - slide_extracted_count, - slide_failed_count, - ) - - except Exception as e: - logger.error( - "Failed to process slide %d with %s: %s", - slide_idx, - extractor_name, - str(e), - exc_info=True, - ) - raise PptxSlideProcessingError(extractor_name, slide_idx, e) from e - - success_rate = ( - ((total_shapes_processed - failed_extractions) / total_shapes_processed * 100) - if total_shapes_processed > 0 - else 100.0 - ) - - logger.info( - "%s extraction completed: %d elements extracted, %d total shapes processed, " - "%d failed extractions (%.1f%% success rate)", - extractor_name, - len(elements), - total_shapes_processed, - failed_extractions, - success_rate, - ) + elements.append(element) + except (AttributeError, TypeError): + pass return elements @abstractmethod def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[TextElement]: + ) -> list[Element]: """Extract content from the presentation or specific slide.""" @abstractmethod @@ -188,21 +126,14 @@ def _extract_text_content(shape: BaseShape) -> str | None: def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[TextElement]: + ) -> list[Element]: """Extract text content from the presentation or a specific slide.""" - logger.debug("Starting text extraction from PPTX document") - try: - elements = self._extract_from_shapes( - presentation=presentation, - document_meta=document_meta, - slide=slide, - content_extractor=self._extract_text_content, - ) - logger.debug("Text extraction completed: %d elements found", len(elements)) - return elements - except Exception as e: - logger.error("Text extraction failed: %s", str(e), exc_info=True) - raise PptxExtractorError(self.get_extractor_name(), e) from e + return self._extract_from_shapes( + presentation=presentation, + document_meta=document_meta, + slide=slide, + content_extractor=self._extract_text_content, + ) @staticmethod def get_extractor_name() -> str: @@ -224,7 +155,7 @@ def _extract_hyperlink_content(shape: BaseShape) -> str | None: def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[TextElement]: + ) -> list[Element]: """Extract hyperlink content from the presentation or a specific slide.""" return self._extract_from_shapes( presentation=presentation, @@ -243,27 +174,32 @@ def get_extractor_name() -> str: class PptxImageExtractor(BasePptxExtractor): """Extracts image information from shapes.""" - @staticmethod - def _extract_image_content(shape: BaseShape) -> str | None: - """Extract image content from a shape.""" - if not isinstance(shape, Picture): - return None - if not hasattr(shape, "image") or shape.image is None: - return None - filename = shape.image.filename if hasattr(shape.image, "filename") else "embedded_image" - return f"Image: {filename}" - def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[TextElement]: + ) -> list[Element]: """Extract image content from the presentation or a specific slide.""" - return self._extract_from_shapes( - presentation=presentation, - document_meta=document_meta, - slide=slide, - content_extractor=self._extract_image_content, - element_type="image", - ) + elements: list[Element] = [] + + for slide_idx, sld in self._get_slides(presentation, slide): + for shape in sld.shapes: + try: + if isinstance(shape, Picture) and hasattr(shape, "image") and shape.image is not None: + image_bytes = shape.image.blob + filename = shape.image.filename if hasattr(shape.image, "filename") else "embedded_image" + description = f"Image: {filename}" + + element = self._create_image_element( + document_meta=document_meta, + image_bytes=image_bytes, + slide_idx=slide_idx, + shape=shape, + description=description, + ) + elements.append(element) + except (AttributeError, TypeError): + pass + + return elements @staticmethod def get_extractor_name() -> str: @@ -283,7 +219,7 @@ def _extract_shape_content(shape: BaseShape) -> str | None: def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[TextElement]: + ) -> list[Element]: """Extract shape metadata from the presentation or a specific slide.""" return self._extract_from_shapes( presentation=presentation, @@ -304,38 +240,31 @@ class PptxMetadataExtractor(BasePptxExtractor): def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[TextElement]: + ) -> list[Element]: """Extract metadata from the presentation.""" - logger.debug("Starting metadata extraction from PPTX document") - try: - core_properties = presentation.core_properties - properties = [ - ("author", core_properties.author), - ("title", core_properties.title), - ("subject", core_properties.subject), - ("keywords", core_properties.keywords), - ("category", core_properties.category), - ("created", str(core_properties.created) if core_properties.created else None), - ("modified", str(core_properties.modified) if core_properties.modified else None), - ] - - elements = [] - for prop_name, prop_value in properties: - if prop_value is not None and str(prop_value).strip(): - element = self._create_text_element( - element_type="metadata", - document_meta=document_meta, - content=f"{prop_name}: {prop_value}", - slide_idx=0, - ) - elements.append(element) - logger.debug("Extracted metadata property: %s", prop_name) - - logger.debug("Metadata extraction completed: %d properties found", len(elements)) - return elements - except Exception as e: - logger.error("Metadata extraction failed: %s", str(e), exc_info=True) - raise PptxExtractorError(self.get_extractor_name(), e) from e + core_properties = presentation.core_properties + properties = [ + ("author", core_properties.author), + ("title", core_properties.title), + ("subject", core_properties.subject), + ("keywords", core_properties.keywords), + ("category", core_properties.category), + ("created", str(core_properties.created) if core_properties.created else None), + ("modified", str(core_properties.modified) if core_properties.modified else None), + ] + + elements: list[Element] = [] + for prop_name, prop_value in properties: + if prop_value is not None and str(prop_value).strip(): + element = self._create_text_element( + element_type="metadata", + document_meta=document_meta, + content=f"{prop_name}: {prop_value}", + slide_idx=0, + ) + elements.append(element) + + return elements @staticmethod def get_extractor_name() -> str: @@ -348,57 +277,41 @@ class PptxSpeakerNotesExtractor(BasePptxExtractor): def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[TextElement]: + ) -> list[Element]: """Extract speaker notes from the presentation or a specific slide.""" - logger.debug("Starting speaker notes extraction from PPTX document") - try: - elements: list[TextElement] = [] - slides_with_notes = 0 - total_slides = len(list(self._get_slides(presentation, slide))) + elements: list[Element] = [] - for slide_idx, sld in self._get_slides(presentation, slide): - try: - if sld.has_notes_slide and sld.notes_slide.notes_text_frame is not None: - notes_slide = sld.notes_slide - notes_text_frame = notes_slide.notes_text_frame - text = getattr(notes_text_frame, "text", None) - text = text.strip() if text else None - - if text: - slides_with_notes += 1 - try: - coordinates = { - "left": getattr(notes_text_frame, "margin_left", 0), - "right": getattr(notes_text_frame, "margin_right", 0), - "top": getattr(notes_text_frame, "margin_top", 0), - "bottom": getattr(notes_text_frame, "margin_bottom", 0), - } - except (AttributeError, TypeError): - coordinates = {} - - element = self._create_text_element( - element_type="speaker_notes", - document_meta=document_meta, - content=text, - slide_idx=slide_idx, - coordinates=coordinates, - ) - elements.append(element) - logger.debug("Extracted speaker notes from slide %d", slide_idx) - except Exception as e: - logger.warning( - "Failed to extract speaker notes from slide %d: %s", slide_idx, str(e), exc_info=False - ) - - logger.debug( - "Speaker notes extraction completed: %d slides with notes out of %d total slides", - slides_with_notes, - total_slides, - ) - return elements - except Exception as e: - logger.error("Speaker notes extraction failed: %s", str(e), exc_info=True) - raise PptxExtractorError(self.get_extractor_name(), e) from e + for slide_idx, sld in self._get_slides(presentation, slide): + try: + if sld.has_notes_slide and sld.notes_slide.notes_text_frame is not None: + notes_slide = sld.notes_slide + notes_text_frame = notes_slide.notes_text_frame + text = getattr(notes_text_frame, "text", None) + text = text.strip() if text else None + + if text: + try: + coordinates = { + "left": getattr(notes_text_frame, "margin_left", 0), + "right": getattr(notes_text_frame, "margin_right", 0), + "top": getattr(notes_text_frame, "margin_top", 0), + "bottom": getattr(notes_text_frame, "margin_bottom", 0), + } + except (AttributeError, TypeError): + coordinates = {} + + element = self._create_text_element( + element_type="speaker_notes", + document_meta=document_meta, + content=text, + slide_idx=slide_idx, + coordinates=coordinates, + ) + elements.append(element) + except (AttributeError, TypeError): + pass + + return elements @staticmethod def get_extractor_name() -> str: diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py index 1ede7be09..c6c99a67b 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py @@ -96,8 +96,6 @@ async def parse(self, document: Document) -> list[Element]: exc_info=True, ) - # For now, we continue with other extractors instead of raising - # This allows partial extraction if some extractors fail logger.warning("Continuing with remaining extractors despite %s failure", extractor_name) logger.info( From 797a26ec65b6eb476beda8cf1856fd8e9287a345 Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Tue, 12 Aug 2025 16:11:49 +0200 Subject: [PATCH 22/24] refactor: update PPTX extractor classes to use properties for extractor names and remove unused imports --- .../ingestion/parsers/__init__.py | 2 - .../parsers/pptx/extractors/extractors.py | 41 +++++++------------ 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/__init__.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/__init__.py index 2dc6acf65..41ddcadb4 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/__init__.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/__init__.py @@ -1,11 +1,9 @@ from ragbits.document_search.ingestion.parsers.base import DocumentParser, ImageDocumentParser, TextDocumentParser -from ragbits.document_search.ingestion.parsers.pptx import PptxDocumentParser from ragbits.document_search.ingestion.parsers.router import DocumentParserRouter __all__ = [ "DocumentParser", "DocumentParserRouter", "ImageDocumentParser", - "PptxDocumentParser", "TextDocumentParser", ] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py index 2841a23b0..22c83001e 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py @@ -109,14 +109,17 @@ def extract( ) -> list[Element]: """Extract content from the presentation or specific slide.""" - @abstractmethod - def get_extractor_name(self) -> str: + @property + def name(self) -> str: """Get the name of this extractor.""" + return self._name class PptxTextExtractor(BasePptxExtractor): """Extracts text content from text frames.""" + _name = "pptx_text_extractor" + @staticmethod def _extract_text_content(shape: BaseShape) -> str | None: """Extract text content from a shape.""" @@ -135,15 +138,13 @@ def extract( content_extractor=self._extract_text_content, ) - @staticmethod - def get_extractor_name() -> str: - """Get the name of this extractor.""" - return "pptx_text_extractor" class PptxHyperlinkExtractor(BasePptxExtractor): """Extracts hyperlink addresses from shapes.""" + _name = "pptx_hyperlink_extractor" + @staticmethod def _extract_hyperlink_content(shape: BaseShape) -> str | None: """Extract hyperlink content from a shape.""" @@ -165,15 +166,13 @@ def extract( element_type="hyperlink", ) - @staticmethod - def get_extractor_name() -> str: - """Get the name of this extractor.""" - return "pptx_hyperlink_extractor" class PptxImageExtractor(BasePptxExtractor): """Extracts image information from shapes.""" + _name = "pptx_image_extractor" + def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None ) -> list[Element]: @@ -201,15 +200,13 @@ def extract( return elements - @staticmethod - def get_extractor_name() -> str: - """Get the name of this extractor.""" - return "pptx_image_extractor" class PptxShapeExtractor(BasePptxExtractor): """Extracts shape information and metadata.""" + _name = "pptx_shape_extractor" + @staticmethod def _extract_shape_content(shape: BaseShape) -> str | None: """Extract shape metadata from a shape.""" @@ -229,15 +226,13 @@ def extract( element_type="shape", ) - @staticmethod - def get_extractor_name() -> str: - """Get the name of this extractor.""" - return "pptx_shape_extractor" class PptxMetadataExtractor(BasePptxExtractor): """Extracts document metadata.""" + _name = "pptx_metadata_extractor" + def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None ) -> list[Element]: @@ -266,15 +261,13 @@ def extract( return elements - @staticmethod - def get_extractor_name() -> str: - """Get the name of this extractor.""" - return "pptx_metadata_extractor" class PptxSpeakerNotesExtractor(BasePptxExtractor): """Extracts speaker notes from slides.""" + _name = "pptx_speaker_notes_extractor" + def extract( self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None ) -> list[Element]: @@ -313,10 +306,6 @@ def extract( return elements - @staticmethod - def get_extractor_name() -> str: - """Get the name of this extractor.""" - return "pptx_speaker_notes_extractor" DEFAULT_EXTRACTORS = [ From 7b730e68f391607f4f450b7ee6e03d062baaa9ca Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Tue, 12 Aug 2025 21:13:01 +0200 Subject: [PATCH 23/24] feat(pptx): implement callback architecture for PPTX document parsing - Added new callback classes for extracting hyperlinks, metadata, and speaker notes from PPTX files. - Refactored the PPTX document parser to utilize these callbacks for enhancing the docling document. - Removed unused extractor classes and related imports to streamline the codebase. - Introduced a default callback list for easier configuration. --- .../ingestion/parsers/pptx/__init__.py | 19 +- .../ingestion/parsers/pptx/callbacks.py | 32 ++ .../ingestion/parsers/pptx/exceptions.py | 42 --- .../parsers/pptx/extractors/__init__.py | 21 -- .../parsers/pptx/extractors/extractors.py | 318 ------------------ .../parsers/pptx/hyperlink_callback.py | 84 +++++ .../parsers/pptx/metadata_callback.py | 78 +++++ .../ingestion/parsers/pptx/parser.py | 132 +++----- .../parsers/pptx/speaker_notes_callback.py | 75 +++++ 9 files changed, 333 insertions(+), 468 deletions(-) create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/callbacks.py delete mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py delete mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/hyperlink_callback.py create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/metadata_callback.py create mode 100644 packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/speaker_notes_callback.py diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py index 8d482cd1e..c5f815821 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/__init__.py @@ -1,17 +1,28 @@ +from .callbacks import PptxCallback from .exceptions import ( PptxExtractionError, - PptxExtractorError, PptxParserError, PptxPresentationError, - PptxSlideProcessingError, ) +from .hyperlink_callback import LinkCallback +from .metadata_callback import MetaCallback from .parser import PptxDocumentParser +from .speaker_notes_callback import NotesCallback + +DEFAULT_CALLBACKS = [ + NotesCallback(), + LinkCallback(), + MetaCallback(), +] __all__ = [ + "DEFAULT_CALLBACKS", + "LinkCallback", + "MetaCallback", + "NotesCallback", + "PptxCallback", "PptxDocumentParser", "PptxExtractionError", - "PptxExtractorError", "PptxParserError", "PptxPresentationError", - "PptxSlideProcessingError", ] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/callbacks.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/callbacks.py new file mode 100644 index 000000000..7988ae454 --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/callbacks.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from pathlib import Path + +from docling_core.types.doc import DoclingDocument +from pptx.presentation import Presentation + + +class PptxCallback(ABC): + """ + Abstract base class for PPTX document enhancement callbacks. + """ + + name: str + + @abstractmethod + def __call__( + self, pptx_path: Path, presentation: Presentation, docling_document: DoclingDocument + ) -> DoclingDocument: + """ + Process PPTX presentation and enhance the docling document. + + Args: + pptx_path: Path to the PPTX file. + presentation: Loaded PPTX presentation. + docling_document: Document to enhance. + + Returns: + Enhanced docling document. + """ + pass diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/exceptions.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/exceptions.py index 80540f632..1fa9b1db1 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/exceptions.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/exceptions.py @@ -33,29 +33,6 @@ def __init__(self, extractor_name: str, slide_idx: int, shape_info: str, origina self.original_error = original_error -class PptxSlideProcessingError(PptxParserError): - """ - Raised when processing of an entire slide fails. - """ - - def __init__(self, extractor_name: str, slide_idx: int, original_error: Exception) -> None: - """ - Initialize the PptxSlideProcessingError. - - Args: - extractor_name: Name of the extractor that failed. - slide_idx: Index of the slide that failed to process. - original_error: The original exception that caused the failure. - """ - message = ( - f"Extractor '{extractor_name}' failed to process slide {slide_idx}. " f"Original error: {original_error}" - ) - super().__init__(message) - self.extractor_name = extractor_name - self.slide_idx = slide_idx - self.original_error = original_error - - class PptxPresentationError(PptxParserError): """ Raised when the PPTX presentation cannot be loaded or processed. @@ -73,22 +50,3 @@ def __init__(self, file_path: str, original_error: Exception) -> None: super().__init__(message) self.file_path = file_path self.original_error = original_error - - -class PptxExtractorError(PptxParserError): - """ - Raised when an extractor fails completely. - """ - - def __init__(self, extractor_name: str, original_error: Exception) -> None: - """ - Initialize the PptxExtractorError. - - Args: - extractor_name: Name of the extractor that failed. - original_error: The original exception that caused the failure. - """ - message = f"Extractor '{extractor_name}' failed completely. Original error: {original_error}" - super().__init__(message) - self.extractor_name = extractor_name - self.original_error = original_error diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py deleted file mode 100644 index d1af5dd2b..000000000 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -from .extractors import ( - DEFAULT_EXTRACTORS, - BasePptxExtractor, - PptxHyperlinkExtractor, - PptxImageExtractor, - PptxMetadataExtractor, - PptxShapeExtractor, - PptxSpeakerNotesExtractor, - PptxTextExtractor, -) - -__all__ = [ - "DEFAULT_EXTRACTORS", - "BasePptxExtractor", - "PptxHyperlinkExtractor", - "PptxImageExtractor", - "PptxMetadataExtractor", - "PptxShapeExtractor", - "PptxSpeakerNotesExtractor", - "PptxTextExtractor", -] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py deleted file mode 100644 index 22c83001e..000000000 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/extractors/extractors.py +++ /dev/null @@ -1,318 +0,0 @@ -from __future__ import annotations - -from abc import ABC, abstractmethod -from collections.abc import Callable -from typing import Any - -from pptx.presentation import Presentation -from pptx.shapes.autoshape import Shape -from pptx.shapes.base import BaseShape -from pptx.shapes.group import GroupShape -from pptx.shapes.picture import Picture -from pptx.slide import Slide - -from ragbits.document_search.documents.document import DocumentMeta -from ragbits.document_search.documents.element import Element, ElementLocation, ImageElement, TextElement - - -class BasePptxExtractor(ABC): - """Base class for all PPTX content extractors.""" - - @staticmethod - def _get_slides(presentation: Presentation, slide: Slide | None = None) -> list[tuple[int, Slide]]: - """Get slides with their indices.""" - slides = [slide] if slide else list(presentation.slides) - return list(enumerate(slides, start=1)) - - - @staticmethod - def _create_text_element( - element_type: str, - document_meta: DocumentMeta, - content: str, - slide_idx: int, - shape: BaseShape | None = None, - coordinates: dict[str, Any] | None = None, - ) -> TextElement: - """Create a TextElement with standardized location.""" - if coordinates is None and shape is not None: - coordinates = {"left": shape.left, "top": shape.top, "width": shape.width, "height": shape.height} - - location = ElementLocation(page_number=slide_idx, coordinates=coordinates or {}) - - return TextElement(element_type=element_type, document_meta=document_meta, location=location, content=content) - - @staticmethod - def _get_coordinates(shape: BaseShape | None) -> dict[str, Any]: - """Extract coordinates from a shape.""" - if shape is None: - return {} - try: - return {"left": shape.left, "top": shape.top, "width": shape.width, "height": shape.height} - except AttributeError: - return {} - - @staticmethod - def _create_image_element( - document_meta: DocumentMeta, - image_bytes: bytes, - slide_idx: int, - shape: BaseShape | None = None, - description: str | None = None, - coordinates: dict[str, Any] | None = None, - ) -> ImageElement: - """Create an ImageElement with standardized location.""" - if coordinates is None: - coordinates = BasePptxExtractor._get_coordinates(shape) - - location = ElementLocation(page_number=slide_idx, coordinates=coordinates) - - return ImageElement( - document_meta=document_meta, - location=location, - image_bytes=image_bytes, - description=description, - ) - - def _extract_from_shapes( - self, - presentation: Presentation, - document_meta: DocumentMeta, - slide: Slide | None, - content_extractor: Callable[[BaseShape], str | None], - element_type: str = "text", - ) -> list[Element]: - """Generic method to extract content from shapes based on extractor.""" - elements: list[Element] = [] - - for slide_idx, sld in self._get_slides(presentation, slide): - for shape in sld.shapes: - try: - content = content_extractor(shape) - if content and content.strip(): - element = self._create_text_element( - element_type=element_type, - document_meta=document_meta, - content=content, - slide_idx=slide_idx, - shape=shape, - ) - elements.append(element) - except (AttributeError, TypeError): - pass - - return elements - - @abstractmethod - def extract( - self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[Element]: - """Extract content from the presentation or specific slide.""" - - @property - def name(self) -> str: - """Get the name of this extractor.""" - return self._name - - -class PptxTextExtractor(BasePptxExtractor): - """Extracts text content from text frames.""" - - _name = "pptx_text_extractor" - - @staticmethod - def _extract_text_content(shape: BaseShape) -> str | None: - """Extract text content from a shape.""" - if not isinstance(shape, Shape): - return None - return str(shape.text_frame.text).strip() if shape.text_frame.text else None - - def extract( - self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[Element]: - """Extract text content from the presentation or a specific slide.""" - return self._extract_from_shapes( - presentation=presentation, - document_meta=document_meta, - slide=slide, - content_extractor=self._extract_text_content, - ) - - - -class PptxHyperlinkExtractor(BasePptxExtractor): - """Extracts hyperlink addresses from shapes.""" - - _name = "pptx_hyperlink_extractor" - - @staticmethod - def _extract_hyperlink_content(shape: BaseShape) -> str | None: - """Extract hyperlink content from a shape.""" - if not hasattr(shape, "click_action") or isinstance(shape, GroupShape): - return None - if not shape.click_action.hyperlink or not shape.click_action.hyperlink.address: - return None - return shape.click_action.hyperlink.address - - def extract( - self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[Element]: - """Extract hyperlink content from the presentation or a specific slide.""" - return self._extract_from_shapes( - presentation=presentation, - document_meta=document_meta, - slide=slide, - content_extractor=self._extract_hyperlink_content, - element_type="hyperlink", - ) - - - -class PptxImageExtractor(BasePptxExtractor): - """Extracts image information from shapes.""" - - _name = "pptx_image_extractor" - - def extract( - self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[Element]: - """Extract image content from the presentation or a specific slide.""" - elements: list[Element] = [] - - for slide_idx, sld in self._get_slides(presentation, slide): - for shape in sld.shapes: - try: - if isinstance(shape, Picture) and hasattr(shape, "image") and shape.image is not None: - image_bytes = shape.image.blob - filename = shape.image.filename if hasattr(shape.image, "filename") else "embedded_image" - description = f"Image: {filename}" - - element = self._create_image_element( - document_meta=document_meta, - image_bytes=image_bytes, - slide_idx=slide_idx, - shape=shape, - description=description, - ) - elements.append(element) - except (AttributeError, TypeError): - pass - - return elements - - - -class PptxShapeExtractor(BasePptxExtractor): - """Extracts shape information and metadata.""" - - _name = "pptx_shape_extractor" - - @staticmethod - def _extract_shape_content(shape: BaseShape) -> str | None: - """Extract shape metadata from a shape.""" - if not hasattr(shape, "shape_type"): - return None - return f"Shape: {shape.shape_type}" - - def extract( - self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[Element]: - """Extract shape metadata from the presentation or a specific slide.""" - return self._extract_from_shapes( - presentation=presentation, - document_meta=document_meta, - slide=slide, - content_extractor=self._extract_shape_content, - element_type="shape", - ) - - - -class PptxMetadataExtractor(BasePptxExtractor): - """Extracts document metadata.""" - - _name = "pptx_metadata_extractor" - - def extract( - self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[Element]: - """Extract metadata from the presentation.""" - core_properties = presentation.core_properties - properties = [ - ("author", core_properties.author), - ("title", core_properties.title), - ("subject", core_properties.subject), - ("keywords", core_properties.keywords), - ("category", core_properties.category), - ("created", str(core_properties.created) if core_properties.created else None), - ("modified", str(core_properties.modified) if core_properties.modified else None), - ] - - elements: list[Element] = [] - for prop_name, prop_value in properties: - if prop_value is not None and str(prop_value).strip(): - element = self._create_text_element( - element_type="metadata", - document_meta=document_meta, - content=f"{prop_name}: {prop_value}", - slide_idx=0, - ) - elements.append(element) - - return elements - - - -class PptxSpeakerNotesExtractor(BasePptxExtractor): - """Extracts speaker notes from slides.""" - - _name = "pptx_speaker_notes_extractor" - - def extract( - self, presentation: Presentation, document_meta: DocumentMeta, slide: Slide | None = None - ) -> list[Element]: - """Extract speaker notes from the presentation or a specific slide.""" - elements: list[Element] = [] - - for slide_idx, sld in self._get_slides(presentation, slide): - try: - if sld.has_notes_slide and sld.notes_slide.notes_text_frame is not None: - notes_slide = sld.notes_slide - notes_text_frame = notes_slide.notes_text_frame - text = getattr(notes_text_frame, "text", None) - text = text.strip() if text else None - - if text: - try: - coordinates = { - "left": getattr(notes_text_frame, "margin_left", 0), - "right": getattr(notes_text_frame, "margin_right", 0), - "top": getattr(notes_text_frame, "margin_top", 0), - "bottom": getattr(notes_text_frame, "margin_bottom", 0), - } - except (AttributeError, TypeError): - coordinates = {} - - element = self._create_text_element( - element_type="speaker_notes", - document_meta=document_meta, - content=text, - slide_idx=slide_idx, - coordinates=coordinates, - ) - elements.append(element) - except (AttributeError, TypeError): - pass - - return elements - - - -DEFAULT_EXTRACTORS = [ - PptxTextExtractor(), - PptxHyperlinkExtractor(), - PptxImageExtractor(), - PptxShapeExtractor(), - PptxSpeakerNotesExtractor(), - PptxMetadataExtractor(), -] diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/hyperlink_callback.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/hyperlink_callback.py new file mode 100644 index 000000000..e7828b66c --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/hyperlink_callback.py @@ -0,0 +1,84 @@ +from __future__ import annotations + +import logging +from pathlib import Path + +from docling_core.types.doc import BoundingBox, DocItemLabel, DoclingDocument, ProvenanceItem, TextItem +from pptx.presentation import Presentation +from pptx.shapes.group import GroupShape + +from ragbits.document_search.ingestion.parsers.pptx.callbacks import PptxCallback +from ragbits.document_search.ingestion.parsers.pptx.exceptions import PptxExtractionError + +logger = logging.getLogger(__name__) + + +class LinkCallback(PptxCallback): + """ + Callback to extract hyperlinks from PPTX shapes. + """ + + name = "link_callback" + + def __call__( + self, pptx_path: Path, presentation: Presentation, docling_document: DoclingDocument + ) -> DoclingDocument: + """ + Extract hyperlinks from all shapes and add them to the docling document. + + Args: + pptx_path: Path to the PPTX file. + presentation: Loaded PPTX presentation. + docling_document: Document to enhance with hyperlinks. + + Returns: + Enhanced docling document with hyperlinks. + """ + hyperlinks_added = 0 + + for slide_idx, slide in enumerate(presentation.slides, start=1): + for shape in slide.shapes: + try: + hyperlink_address = self._extract_hyperlink_address(shape) + if hyperlink_address: + link_text = f"Link: {hyperlink_address}" + hyperlink_item = TextItem( + self_ref=f"#/links/{slide_idx + hyperlinks_added}", + text=link_text, + orig=link_text, + label=DocItemLabel.TEXT, + prov=[ + ProvenanceItem( + page_no=slide_idx, + bbox=BoundingBox(l=0.0, t=0.0, r=1.0, b=1.0), + charspan=(0, len(link_text)), + ) + ], + ) + + docling_document.texts.append(hyperlink_item) + hyperlinks_added += 1 + + logger.debug("Added hyperlink from slide %d: %s", slide_idx, hyperlink_address) + + except (AttributeError, TypeError) as e: + extraction_error = PptxExtractionError(self.name, slide_idx, "hyperlink from shape", e) + logger.debug( + "Failed to extract hyperlink from shape on slide %d: %s", slide_idx, str(extraction_error) + ) + continue + + if hyperlinks_added > 0: + logger.info("Successfully added %d hyperlinks to docling document", hyperlinks_added) + else: + logger.debug("No hyperlinks found in presentation") + + return docling_document + + @staticmethod + def _extract_hyperlink_address(shape: object) -> str | None: + if not hasattr(shape, "click_action") or isinstance(shape, GroupShape): + return None + if not shape.click_action.hyperlink or not shape.click_action.hyperlink.address: + return None + return shape.click_action.hyperlink.address diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/metadata_callback.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/metadata_callback.py new file mode 100644 index 000000000..3cd705693 --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/metadata_callback.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +import logging +from pathlib import Path + +from docling_core.types.doc import BoundingBox, DocItemLabel, DoclingDocument, ProvenanceItem, TextItem +from pptx.presentation import Presentation + +from ragbits.document_search.ingestion.parsers.pptx.callbacks import PptxCallback +from ragbits.document_search.ingestion.parsers.pptx.exceptions import PptxExtractionError + +logger = logging.getLogger(__name__) + + +class MetaCallback(PptxCallback): + """ + Callback to extract presentation metadata from PPTX files. + """ + + name = "meta_callback" + + def __call__( + self, pptx_path: Path, presentation: Presentation, docling_document: DoclingDocument + ) -> DoclingDocument: + """ + Extract presentation metadata and add it to the docling document. + + Args: + pptx_path: Path to the PPTX file. + presentation: Loaded PPTX presentation. + docling_document: Document to enhance with metadata. + + Returns: + Enhanced docling document with metadata. + """ + metadata_added = 0 + + try: + core_properties = presentation.core_properties + properties = [ + ("author", core_properties.author), + ("title", core_properties.title), + ("subject", core_properties.subject), + ("keywords", core_properties.keywords), + ("category", core_properties.category), + ("created", str(core_properties.created) if core_properties.created else None), + ("modified", str(core_properties.modified) if core_properties.modified else None), + ] + + for prop_name, prop_value in properties: + if prop_value is not None and str(prop_value).strip(): + meta_text = f"{prop_name}: {prop_value}" + metadata_item = TextItem( + self_ref=f"#/metadata/{metadata_added}", + text=meta_text, + orig=meta_text, + label=DocItemLabel.TEXT, + prov=[ + ProvenanceItem( + page_no=0, bbox=BoundingBox(l=0.0, t=0.0, r=1.0, b=1.0), charspan=(0, len(meta_text)) + ) + ], + ) + + docling_document.texts.append(metadata_item) + metadata_added += 1 + + logger.debug("Added metadata: %s = %s", prop_name, prop_value) + except (AttributeError, TypeError) as e: + extraction_error = PptxExtractionError(self.name, 0, "presentation metadata", e) + logger.debug("Failed to extract presentation metadata: %s", str(extraction_error)) + + if metadata_added > 0: + logger.info("Successfully added %d metadata properties to docling document", metadata_added) + else: + logger.debug("No metadata found in presentation") + + return docling_document diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py index c6c99a67b..dca59aac6 100644 --- a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/parser.py @@ -2,118 +2,84 @@ import logging +from docling.datamodel.base_models import InputFormat +from docling.document_converter import FormatOption +from docling_core.transforms.chunker.base import BaseChunker +from docling_core.types.doc import DoclingDocument from pptx import Presentation -from ragbits.document_search.documents.document import Document, DocumentMeta, DocumentType -from ragbits.document_search.documents.element import Element -from ragbits.document_search.ingestion.parsers.base import DocumentParser -from ragbits.document_search.ingestion.parsers.pptx.exceptions import ( - PptxPresentationError, -) -from ragbits.document_search.ingestion.parsers.pptx.extractors import ( - DEFAULT_EXTRACTORS, - BasePptxExtractor, -) +from ragbits.document_search.documents.document import Document, DocumentType +from ragbits.document_search.ingestion.parsers.docling import DoclingDocumentParser +from ragbits.document_search.ingestion.parsers.pptx.callbacks import PptxCallback +from ragbits.document_search.ingestion.parsers.pptx.exceptions import PptxExtractionError, PptxPresentationError logger = logging.getLogger(__name__) -class PptxDocumentParser(DocumentParser): +class PptxDocumentParser(DoclingDocumentParser): """ - A comprehensive PPTX parser using python-pptx library with modular extractor architecture. + Document parser for PPTX files with callback-based enhancement. """ supported_document_types = {DocumentType.PPTX} def __init__( self, - extractors: list[BasePptxExtractor] | None = None, + ignore_images: bool = False, + num_threads: int = 1, + chunker: BaseChunker | None = None, + format_options: dict[InputFormat, FormatOption] | None = None, + pptx_callbacks: list[PptxCallback] | None = None, ) -> None: - """ - Initialize the PPTX parser with configurable extractors. - - Args: - extractors: List of extractors to use. If None, uses DEFAULT_EXTRACTORS. - """ - self.extractors = extractors or DEFAULT_EXTRACTORS - logger.debug("Initialized PptxDocumentParser with %d extractors", len(self.extractors)) + super().__init__( + ignore_images=ignore_images, + num_threads=num_threads, + chunker=chunker, + format_options=format_options, + ) - async def parse(self, document: Document) -> list[Element]: - """ - Parse the PPTX document and return extracted elements. + if pptx_callbacks is None: + from ragbits.document_search.ingestion.parsers.pptx import DEFAULT_CALLBACKS - Args: - document: The document to parse. + self.pptx_callbacks = DEFAULT_CALLBACKS + else: + self.pptx_callbacks = pptx_callbacks - Returns: - List of extracted elements. + logger.debug("Initialized PptxDocumentParser with %d callbacks", len(self.pptx_callbacks)) - Raises: - PptxPresentationError: If the PPTX file cannot be loaded or processed. - PptxExtractorError: If an extractor fails completely. - """ - self.validate_document_type(document.metadata.document_type) + async def _partition(self, document: Document) -> DoclingDocument: + docling_document = await super()._partition(document) - document_path = document.local_path - document_meta = DocumentMeta.from_local_path(document_path) - extracted_elements: list[Element] = [] + if not self.pptx_callbacks: + return docling_document - logger.info("Starting PPTX parsing for document: %s", document_path.name) + logger.info("Enhancing docling document with %d callbacks", len(self.pptx_callbacks)) try: - presentation = Presentation(document_path.as_posix()) - logger.debug("Successfully loaded PPTX presentation with %d slides", len(presentation.slides)) + presentation = Presentation(document.local_path.as_posix()) except Exception as e: - logger.error("Failed to load PPTX presentation from %s: %s", document_path, str(e), exc_info=True) - raise PptxPresentationError(str(document_path), e) from e - - successful_extractors = 0 - failed_extractors = 0 - total_elements_extracted = 0 - - for extractor in self.extractors: - extractor_name = extractor.get_extractor_name() - logger.debug("Running extractor: %s", extractor_name) + logger.error("Failed to load presentation for callbacks: %s", str(e)) + raise PptxPresentationError(str(document.local_path), e) from e + successful_callbacks = 0 + for callback in self.pptx_callbacks: try: - extractor_elements = extractor.extract(presentation, document_meta) - extracted_elements.extend(extractor_elements) - successful_extractors += 1 - total_elements_extracted += len(extractor_elements) - - logger.debug( - "Extractor %s completed successfully: %d elements extracted", - extractor_name, - len(extractor_elements), - ) - + logger.debug("Running callback: %s", callback.name) + docling_document = callback(document.local_path, presentation, docling_document) + successful_callbacks += 1 + logger.debug("Successfully applied callback: %s", callback.name) except Exception as e: - failed_extractors += 1 + extraction_error = PptxExtractionError(callback.name, -1, "callback execution", e) logger.error( - "Extractor %s failed completely: %s", - extractor_name, - str(e), + "Callback %s failed: %s. Continuing with other callbacks.", + callback.name, + str(extraction_error), exc_info=True, ) - logger.warning("Continuing with remaining extractors despite %s failure", extractor_name) - logger.info( - "PPTX parsing completed for %s: %d total elements extracted, %d/%d extractors successful", - document_path.name, - total_elements_extracted, - successful_extractors, - len(self.extractors), + "Enhanced docling document with %d/%d successful callbacks", + successful_callbacks, + len(self.pptx_callbacks), ) - - if failed_extractors > 0: - logger.warning( - "Some extractors failed during parsing: %d successful, %d failed", - successful_extractors, - failed_extractors, - ) - - if not extracted_elements: - logger.warning("No elements were extracted from the PPTX document: %s", document_path.name) - - return extracted_elements + return docling_document diff --git a/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/speaker_notes_callback.py b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/speaker_notes_callback.py new file mode 100644 index 000000000..07cb9b37a --- /dev/null +++ b/packages/ragbits-document-search/src/ragbits/document_search/ingestion/parsers/pptx/speaker_notes_callback.py @@ -0,0 +1,75 @@ +from __future__ import annotations + +import logging +from pathlib import Path + +from docling_core.types.doc import BoundingBox, DocItemLabel, DoclingDocument, ProvenanceItem, TextItem +from pptx.presentation import Presentation + +from ragbits.document_search.ingestion.parsers.pptx.callbacks import PptxCallback +from ragbits.document_search.ingestion.parsers.pptx.exceptions import PptxExtractionError + +logger = logging.getLogger(__name__) + + +class NotesCallback(PptxCallback): + """ + Callback to extract speaker notes from PPTX slides. + """ + + name = "notes_callback" + + def __call__( + self, pptx_path: Path, presentation: Presentation, docling_document: DoclingDocument + ) -> DoclingDocument: + """ + Extract speaker notes from all slides and add them to the docling document. + + Args: + pptx_path: Path to the PPTX file. + presentation: Loaded PPTX presentation. + docling_document: Document to enhance with speaker notes. + + Returns: + Enhanced docling document with speaker notes. + """ + notes_added = 0 + + for slide_idx, slide in enumerate(presentation.slides, start=1): + try: + if slide.has_notes_slide and slide.notes_slide.notes_text_frame is not None: + notes_text_frame = slide.notes_slide.notes_text_frame + text = getattr(notes_text_frame, "text", None) + text = text.strip() if text else None + + if text: + notes_item = TextItem( + self_ref=f"#/notes/{slide_idx}", + text=text, + orig=text, + label=DocItemLabel.TEXT, + prov=[ + ProvenanceItem( + page_no=slide_idx, + bbox=BoundingBox(l=0.0, t=0.0, r=1.0, b=1.0), + charspan=(0, len(text)), + ) + ], + ) + + docling_document.texts.append(notes_item) + notes_added += 1 + + logger.debug("Added speaker notes from slide %d", slide_idx) + + except (AttributeError, TypeError) as e: + extraction_error = PptxExtractionError(self.name, slide_idx, "speaker notes", e) + logger.debug("Failed to extract speaker notes from slide %d: %s", slide_idx, str(extraction_error)) + continue + + if notes_added > 0: + logger.info("Successfully added %d speaker notes to docling document", notes_added) + else: + logger.debug("No speaker notes found in presentation") + + return docling_document From aec57c486fc0c65fa2868b28375953c0cc257ef7 Mon Sep 17 00:00:00 2001 From: Maksymilian Pilzys Date: Tue, 12 Aug 2025 22:17:20 +0200 Subject: [PATCH 24/24] test(pptx): add integration tests for PPTX document parser - Introduced a new integration test for the PPTX document parser to validate the extraction of hyperlinks, metadata, and speaker notes from a sample presentation. - Added a sample PPTX presentation asset for testing purposes. --- .../assets/pptx/sample_presentation.pptx | Bin 0 -> 380991 bytes .../tests/integration/test_pptx_parser.py | 79 ++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 packages/ragbits-document-search/tests/assets/pptx/sample_presentation.pptx create mode 100644 packages/ragbits-document-search/tests/integration/test_pptx_parser.py diff --git a/packages/ragbits-document-search/tests/assets/pptx/sample_presentation.pptx b/packages/ragbits-document-search/tests/assets/pptx/sample_presentation.pptx new file mode 100644 index 0000000000000000000000000000000000000000..20b3202bf913e92bd9e30dadc480b50a7fcb218a GIT binary patch literal 380991 zcmdqJWptd$mL)1#%#>nT%*6+X9 z=FeMKxs*DQU;c>`v3JCQtuInw-~bR15NHtB3V6-(Knsqg_YwaG5D+*J0En)Gv6UkO z{crD}Ajt0z{`^x09JT;sf)}}afGzMAO#n#3To@_BE+zqe{HoZHaFzvCq#p0s{HG9u zkj+w>n?Gd+*S9G0q$2^DcZ~FBYxO7}@V>LExqarLBhZ_tt7mX>(x5TUY)th?hzOQX z;t1=D1!$WyE0$#NN;zqWVaH|pI)ZI9Tc64Mu;gYijq<9+d8_$zc`?64N5{`V6e4PYz@CS*xETV7}`1* z)4N$){a4Phj*+np;zt%fdxcGFskb2nSHDSC#P}egS0S`Ksh@@Pog3TNhrBvfDn_Ku zW5)g0v4)SL(Ux|_QnNf6*L8xuV+HSOPALT&Vjs3pDDRZzwSPX=Ci5AdE0#xHSP-J0 zJyB`XSkUlJVXTT&jD1M%#dp&H#c7@ZvdIJtgpO`%JW*#=SvSfaRV~-9AbuKkhwh0v zy5}mv$;*zwHm`QLO@MLyk~^T)lHVf2kjCLME{YdOY!4&B zG-8Wy7=nRAP!^9;9l$R=s^?om!+}Ef&IINOn}XjUB5)8)I!h}}s6c6o=AKKrssEQ+ zgwHPCR{o$yp+4!$wcn2zXK#f{mRwN95CX~$gPMzuBBGavl+$S%Be|PC+&|C8RF z2Mh!R^drdoTmT?;c1{d-4#tkgHct9Z=C(F}H=~oZHQNkE$T1mr7hOp6SHmgyvK)u_4uqTHn9fwwSztpqUC4YhyY%@ySmdo zTs6`#3sX{6x}`UuRP!XnRg$o@(f1y#V>oByyVxAY6@nk z4&zsckA>9pyf=*n_9vxA2bwKeMGaNW>#D`2E11a)cP{1(F%`R?YcHDbsW@l9chfXt zxUiLrVa-c&v~>fkgB05cvG9@c1ofOez+!0Ll(TuJ1vSm!T=e{Gl%i}^LwU}oNYUkt zNg1*sXt}0rM}I`<(x0OBA1>~*LrBf_eb?E}K)+UITfyHB$Bj0WR9cxRUznp?c6P1f zVvy!M2yRjz595T4e+v{xenudUt7$Y#{$zAcN%ZAn@A@Eu>ML8s8Z;o~L%c0Gv6KM* zRC0B%X1u|SK-GszgUObWd_MTk10d#p$C%<3pbmD}gXy2ZzJgYZ5keuvy&4m)2<$_K zhzl8w3qK;n_qc{dwNf$*;}Cn2J1ih$YmrY~<##guK4vxxgI^qlPXh}Rb~ za!MQgAa-S97$ZE?TGT0uDXHIyK09uPFQ5Q>ATgMYe|!0CoQKS)`|}fIyRDbg8d5^|-rt-wR|eyDplJ zwe!2Dr}~V=IvxB$<=I~uP!Y!dPiJNG?z4(XqU`kva<85PaUp9(iuUfZ& zWb+!~S(%CtHKCap=gMs zl0KcpF2bpp#`KIMvyEusG*0A>X&MFxqElL)KKGBE9@2=Q%x5Drg@g&pMSv>{X9Lib zP&^f+=D#B4!c{UdwU=eKWnTLI1oyl4_lK!|zPq z@{gnJKltzW^X%`)FDqUq@}15@&R!#cEi%;A;^s#pJe~_LphVxvCx(L3?k}!fzrYPQ zLoFJnwjzzUPFveDDr3swG2N6DN0)dxxJ4bzlva$tI26?PoxTsCya=aR*GahO^H>jc6EJK?e{XPWGXhzULD%v6y0;(A0zyL1pRPe z(@kWOZT|3aY5eo6LckmK5aS5)@(*1`&eMQoN{=J=>Cf41use8D@YiFh#|YJb^LQUyO#e zW|@!UpT^zbp!I+;yenn+^PZqm?1?{p_rmeJ7cl;TSwmZE>-RHJz}d;n*1_@bH%6Bv z7}NX4@Q#S{5jQtuL`_OU{-|FF- z#uTE%p(#~y>_(&ppot+jS=QhBIgdGPvWH#Mh;atPceZ{Crrm@VYw7`icH2x3u& z2@QaKH5P@<8zi!7b@(`ktT&P3)lN=O2vg=6cFRwn$U@4EB;w`X-wQ{lEhM#Ar6+sP zk+|O>S)GXq&C1ci7{o3XqgZV96;8h?8ae&(2a^|fZFkkYf*6QHn~(ozUsMn9_&z^~ zt{N}P9sl8Jx5UfZYTlgeI(8vbpG5W_?SEmqQEke7`GW|JiH5T?~JBAJgAD z4#;gA$Os6&dxjn6zK=hLh7H%45|3}L({5JR3m|)rJ7Fy@dA-B=pvWzpRem!3;^l>y zv7&st9;iuCOHCBc1gd-7qhd*t6nN#Uw(PlLfV5xdW@xJ?5!MxP2HSwQFGA z2-~KjIpnplgl0k80v>UU(#I(Rgn=k@_Z)Av(UiYxD<22a_y(%2vJfOT%VKd%k9=k| zY=TR*e`Juj>;MYZWDrID@X`NTROZrrV_&u-oZ1Eh9$?E{U(n~5Uh0uz!PYRk>Ds=}dKX2n<)>b!_^)uAQt-v*; z%s}2p$w4O#{~C0%=aMN}ZG8<9iRQ8VS+wGO9!>oG&)+?PIdQI$+HXbFsDS# z3JqHT$*AnE@=GLO+^-@qQoBgB)u{ShzbM3O4%UN}cB-4#-(KTAS@4ddUY1CzKv1R8 z1_AL{&g<1poC_pN$EnJ`fAu#Ax*@dhK~ ztasY_(9D&#OVu%sarv06)7smko;{mDJC2}HmBUh>NpCNs*C?H2K0!ofLi#c7+Brfx zvXFz-T@2M^n*>cXDVzp<9=k*GqbQ72vR0X zv(IJj^sHN>k92I+iBD#UjUcA(!Ndj1HDBYAe|)|QM!m3ODTL?{s=&tGczK!gtkxGL zMoXY)Q-5{i=TP_Ylo6=pXv3V0wgsuRz#e6ZYvrhJ?N-xpvUTTS zUg^ne6qS)yGGwjlg3cDI`BB)%Xn2>C_wu;yHk9d7nAbMN5K6%4tR4}`a;fr6Tp3FX zB(akp?tJ~mc^a`vVPnYM{Fi_{Wl+GqW4!(D9`+Y-i-v~2J>w&&#C#r&Nh_mQmz_{E zyvGYdtf#R~$73@_{AIIq3+DQPdXA=uw&AtB;}6g*tp$zc{_w5bc~9hAI#`yOaM!iJ zcrsKWWL-96w!~c|Li0X2W72Duj2{sZG+pa3!k#iFJ{(p1-#+G{fjK@RHA*L=+fnH& zImy9*8nhbB@)-8FQZKT0aqSfzQ6i71AcG-^ zu(#~5_ahkN7U8i^LhrPG>-5CyE)QUAU@RX>-|mkkd)SNZ;Da9e<&FlcL`{HTHV#)H zhJuh4V->wG7rs9ZwyE9u5yZjNWc#QUVvgu4qva6Z(P_pDCSeX6qHzE=Rf)zUq|J4P zS2N*F+DHz?J>8UwY4wL51V3L`Ph}Ap&9vES?1-*v>IX6n$pWPBPTQXbok_Y5I$=U)PmBrWq@vUfBn*vK0=H8V>j|Y&)NxXAeAl5EsNhv) zK1Hf_$qQx4T!jzQYP;(0aPett(qTalcgzA3Kq>w#OE2BBg(Ib)l`KG$l2hwM$+{%!n&pS>lXAD)eFBydGPGX z;ttC0C|>L8CQJK*yjGj8k|^LBk7B)RzKt+=ev4#YsLDGG4lIe}iS=zn8v5jI5F)Q%ZhO#$aCXSn^S->6 zQ@frwq`hqQ)56x+EUF@j|M1}R-gw7|oG1yVInE0MQeO8Ug3unJ@|X21JQ;Kubnisx zQQcw(11BSmsy1;snsk~+VQG7^Fhc;|F03?-|8B%?1g~0xmOuhBM7BBbA`@Gq-Yj{}qIZAzbs>f2r#A z4y`-aU)F`v4aJMM!^aI1X~34tL{~3sqC^z1M+w&FOrxY*a5p?$EjVCe?-m&UFtG`# zuZ3|+sanwGSwqo#0ZQtqhWlmX>$D0pL47?%$c5Y-7}aGf=`Al9Tg}Mvuerf&&4}vZ z(N5oL=Xn@JiqQ(xMBj7piw*i9eiP4gwr;l)X_`JFr1*iT%`|wT9%vJIm@+-ZtW6}a z7u}dymX9_7y4LE9_Q$l{a$d^_S+gt!m0qKa#A;<}mG6mVhSk=Ri{#{`3O|3QTBRt| zM-Q20164%KS;?&Lq)2MseyIQTMkNAXaAgkp?q;?BolSExGqyHn`2GF=a*49GU1mpq zUDYMpKbrViP1gbL3`4|#SUrew z^%^8`ujKP-mP>V(3XW3btyw|(yqy0_E-=;BJ5};sOX}^&5nRt%{IZG{!oOW5VR%cDe$_{lZW!M_&KPNmAl&>MY>i3=1-H(f57L2z+cBo#&F1--Ql3)1*t}%+x?k#vO0qi^#Ug(c$9s`w4bICkU8vPzi*!6DVcEPCszvZ9{jZWP$JTyP#fe zMYMl$ky1W(J@}N%Hp6BnD-^Ei8f~w1iN_brWJq(jREV-yoeBePpiM zbx~IXN^c@vd`X7^dKocLKu)Vbp9F3a*W9=mymdj$ID?I1wuxsq|<#Z_Vx*A`k`lTHKsS?N+{I*0z8n()9!*O_r;%_)i~$fdI; zzn99^P2{GwB`gur+>fJdPrqIPIt-^WXDy#Dm}O7vGLLIb(Y8j@ojGa>b=GR=a*SBG zgUq4(NWt8JwpNjq2v)RSNx1hXO>TM@wYbVQwr(Rw2zCYt`FXB~S&OC)q zLQ|MJA0~C+$xr2ugB>|*S>cN-VrrF?b9V$k6^|RuB{>xqsfl!Dk(~`=>kWmLw6@JJ z)YT*H(%j7~@v33?Rhw|ziv&zfe~Rc_-xCbLa`}b>wL|*(7c$@^$QXs{`^s1LBL^2n z`WCI4Sv5zqrsK_2f>bJ@`w2Qn=+9C z&U0_EL_!MUm5W^bx;*B2Cu=t_`p1&tPfYAAQ#kTk}1m`H# zfMfAUptVS`+p)#`GmEC8^^vTZ=gt~8aglYEZj+97YZZ5}f0?RqTXnhWJw2CP+5zicBnT7070V9@2P0IJbcnX|Hj+yWgl`-1t}gc+PgP zh=}-c$M^wB%fDsLy^|c+?ZXzk3b}%Z4?2GWn&jIfZzsiOZ7ex)naYsLXz(Of-$E)o zmGLZ5UXiBuEZ(8iK9$2WTaz1evE^88KQygpITo2^LodzCBlQOS)oNO@MOX$?dju$h zX{VhV2;E+==e^r(Z>0U=KK$!ADQ}+`;EM<-UB3rVvJ)wQ6m*IcFa=;8bc=U%4}$z| z4d!+aBL87kc87&x2}C*R_m(m;3q}!&HZwApFfxn&VU;s73;bafGct?(VU6DIEX|hx z!o=#x&qIg03l6+;>e1IM|Ir6yL%$pa7U7eO-OViDc`wkP>(q@a0sg!;RcA|93Q9AQ z%Uvq}MTfbxOEGH}+Sfw`Eam6hx*>>r)U2D7p&VO1bP|z4C_BIJv!et;=zZ zjNj)hr;c5pg%=<$H%#8={i)913`(4D68pqIm;Go5uZvO#Pq6C@CH##WgxLr~wp^KC?I!5msHO zrkv+5pu40Dts1)8`3zI6u?Nv%9GMv3ne!=0AX{hE>75N_bPQyuOS+<_d3R9XbW-$~ zETiIV?g?0UVv{C_*;K36>wAY_WdO~O@m`N1eEk7lYO-PPXL!^5l5d2)I_-57+6RHsEP zS*Dbjlc*)$0y}a#EEas(J6VCXgs>ur(31p2JBPb*CIMd1EC2G@Sf3no@8ENjbA{}i zHTpHyzt{s~mFdmn-#-d@Z>Bh0;&2L{1(ri?Aa%acIno`!INCdQ$%|a8o5luXFxwj9 z=$(8b`^b7?!w3BmA=kkT>-idqh7}UH(OHoe-K@XQS18u6V15-28}kFi{6oCUqR>xn z?SWQ*&J?GUxNix^+Sy&0_wmGI;MB46X8N&I< z{{ix?%^&x^E%%Mt4oodNy%V8F{wx&Y)T)+K-nE?ilGtB!GD6mp#nhsyC#m(`1Nlru z;Al_*V*64O@)u);H{!rN74E8Meq*SEn+4E77+(9@k!aCD?^GN_J#2< zwj>>{+XwkNXI=}r3w^0fl0GcNhxK`gY)?lAd)!PzDps@rSa~aNp^BEyJDY~oCbuz0 zLssSK$2q&7Z8Mp${JN#43@J}4^w=qLmTpQwhogm0HoA^?8%7q^~-bFwh zo)#LPQ1Tb+#4{xf^lCOC1~n5S=Kna%! zpLoNZ)KL7{L7a6}Fsbj^Zc^xfO`ptvm-!x59(Gt_1gz}Qur8s2 z=JBVcN)yVkyN~ko@mGobDAq{|Vmfgm*PTW>O1YM-Co<0!T9RQ;rd@G#8n5y?J5Z;B zpiXtxDg}3qS;k^YI*ckE0Qb$-tq-}k@^Z2el{K1oDoeo!6>LJ0u{&+UM%kRolsJs3 z(}%sqSdu*4nB@hIOrbMM2sEF#r;!n`+2c28R7AB*?|1!i-d|%*A6PR*}v!q#svrzxIgrd8rco36&(}Xcoaa zdl6gwh)1_^d>lPR-yS}PEGrzIiW-z-Plr)hIpn*ByEr{0Crd+Aa2j>_kF+#TT>FN; zHW8l4ZFKwuj{-yzbV}Jlg7X0rNwJ;opNs*tO5|Ad6Q6h_)C|9gnb)P-s7^oIh*_ok zE}_VzgALXQ1(r}Z%{w$(KX=D+ZCA=;bjLGLG{ZM@eCRQ|?0*I6iQcW0$j;feSnU7g z+gB^B57Zl;TIcvUxw-T}eL+sj+=xRUJ3dEr3EFQ){}E=-)Q3*Zi|IoCtheUbt&|M; zN!+$nh}g47636n@U}85A3cA?@0&QQmN>`3=ZCg>C0L&2WGW*!0*ecXm6ALxC2>m!< zT=fye&6R;CH0KN?Ai*0v#lsw_^X_)jz3cVur&9(E3mT8%z6%vWs`s?D|1BtGk>MKZ zv$F&pp!)IBX>D{zou3N9p#$k@TEcd!#SG#59z|K~iB1I@-Ze$p#<|gDo-5Ze5+o+y zxhS?;K0ofFE&bx0zQXLWSym;-%rA8Lf~Y=koD}JOIOTnIaB({2n9$Q%r#2za=t&xr z=-n!P>!oNGLX~QGl5}*%u4#s4UH9qJ0kMw1lu14H0RBJTxq$q?%>}=2_`l_X=-A&I zVuIcaWtFZ8bAe&3Cn7=kt>WH(aaPlMS3;;FYpZyg=j-;SrtSJmuhy8C-KkNocsLqh z0u*h`vW|_hDJv+C_qWE`|zGjM^2{X?I;z}L$Kz{G_P9X6c!7NATQ`> zE8Tf0jCuHdc4=lxMEfrYaTjRk1ob)OBp1g!)A_@E)M^@0-KFB#hFuXwOpduuWwz1? zbm*PU$=16rvzUJdy+j6kw!{0K2^0QbgP!H@K;Nda;;{4yxqV#G%u8;YuTo#~lRxWc zOmiUBHE0l>ft<0F7%F1zbQL-Ha`M?EtZ~I$GX@HdNV2my62jOCJqeCN&NSJ==Av1v)F3j4X zHntRq$#YfSbtRx!m=fc0%PBM_DMJ<{gIw3u%_q5ibUAhiI_HnV3Zkr)%Ifq=xH6fj zGU6qKQ6hKp)IKSwRwmZSo5ADV0C(c1O-t|W^Zf9MT}Wa#8zG@H@T^ZBM}$ci1Fpj6 z)R=^$+**y}^uw);k(ghSjk*++fFJDO(y@&986*{`Ps&lHB#Ntk9+m;%>>23x>zh+3 z<*c`Hj@L~J?0eV-aqhYAg)D(XE_85L;4)_1&g<95BMj`8PNnh+4CE^oz?GYO^2H2% z+h6S<1g$egB}1Q6wqi9u4{NbRBzNjpj5Lz8WnGj_wqcrO6I(jk>dBTaT5a}l6#Fd3 zpFw5Y-UQ`wrsMY+vGf`*%W5HZ`s;LA20@yESldVFh7yM+ETS`)JL|lFN zm}QE%&1P$K93yK2VZiMGJ}Prn+9am-ZgfL^Dh?IxRWg$eoO^4g|8nv){{%uArI0Jx z%iR%Qhmvway2kVxF7XB;7jpZ}+lu6qp)0_>E0+4RlQu)l+nHoVjA}FCWxq~wt8|_w z_OumE{K$TD)oGm|x_gus}C= zpdUWw<)%z5!1bh%0-S=nbp&;g-3wBT04`A>FHr`3F}lFX^O^dqTA}OOY{U>k8^?#I z^e*-AiS?so9U&a{0@&= zUdNwKeP_vXYDJ%q&wuE9Fgx%K6g<#o2CD{|`C!BM+h8GXnz7>c+B4#Y%wJGOl(%zw z8pi=qYd5xr`c|%kkC;Zk#|*g&|58>l)Zc4r(nd7_{Ltpcgr=4#cHo|43p_2}`nDdc z1e?8#?aZf74Qc?F{weJ1Z063;z$r~*&N;(a`~NeY{SM`SLpmevcD&IN%bR6-^2g!3B} zTJA_(s2knEQ~Sz|vyU^AG+P4>LS@n zM4f4**TyW9Tl}8! z&oPna-5>09;Rfhz>t*zk#h&c$@EJi85LHWP8ke))&?Zrsp=JLR=ntTR;G$c2kJqiJEG z(G_&5koK`x6YJElKEX&=!c|}D+o&ZuXLUb3P4bf0G?g`do%zSJ6i&#MjWUn=IvU&c z1E5r461!AQS*mCJX+?&;#;#RZA1ba`g$ByNY7LN=twVgmJckfYAmxWXdUMI*UB#LY zjoh4f(V*Oyz1p8lc6X7!S&cb|#+kk0^B4gHB50OtG+B%i{r>Yw!T`C>c3rHueMQce z;^#3-x@oRq?xQ8MnF-j;wFl-AQ(9lB#hP#!;L0;TdaC~@L*b!A2t}a|PdJgcGo+?V zh#1kc-g>xjpa3hL@C#uSu_kmN^)@e%Yj76`4Yw_pdJ8m9bD*A69KxJ_ht)`-1bh0dzW}?Z5@@vATlQN=eQq3+}7+ zeZ6BubbMpzN|_D!Ptw;IZ#2cQoLKxUkg8%WOV)Kx#;Vpknm`;H7p)s}5-tqzM+>ed zjV_q+vOMHjCCRrQC?&ex@w7>|hPI#KRz)DGiiy}S-5iD{@Z#!&?TSlhaH%VBFiBk7 z`nwS%mcQ3Zg_7}?n3YK_OW(*WRF%a7T%{%Cn_tc6U(8^-9Fp~gYfR*m4nj9n7M*iU z$9?{il=+`uwSLFtzacjbAo+mAzjISR!oTJww!h=1K2<4)WlrRkJpkpg@oQ(SQnF$^ zp6S*?i8vRCupqf5^an8h+C-(2T~^0Rt|1UYDh-&d!E793l6t?>(7Wa?a=Ql?F{v+T zL~trHd9E9R{3VITA~%e|IjS55;O%W5jzbjHBQ_V=*60%`Ntx?ZBT1WR1M%jvl*yP; z36kU1skv$g9h+T4;65|rwN761(RdM&u=N+4iEj0a0IDXFgJhs28(~1Ant44lL*wzp zJ(Zaja%8K_QgJx1u_C@v@!t93pH46tC zF_O>jKVeRx!BGfP9df08FJ!toWJ6NqZt+=e^A!H7F+shlC^{2T;}Qy zY*n_w@5)HNpoHkI01x2mp%P3Dqh^i>W!(RNJr5YTG@<6%CSm)MU!N8Hkr0 z-K};8S~?Ib4S=0!vgH_Al?+2 zK+2~w56Bxr#GI>Kv^~h_0Fjz42a(j%ZM~@`8kbI@>}7RdP-hx5yC+U`B7Jw~?4F&^$~ueB@}bzOvmSf8s04EewV< zcNaJo+1m^D(Ai+D=#>LrUBS{Z?73Yb-F)4;WtvENWX!c+9%BTwdl*p!J&lL#Jtnw+ z;6KOfL|BeM+nlVq5RrNH)Ws)g5Bh#VCz%P%Ou|M1`N+1LQfK&v{=zAkcNEHJJ*a~h z+EGPB;7#f4Ds`%pikZUW)Btpy^t`PWWpm%IeN^4T2=_RF}uK7NB)5!pTIoN7eRhd&5(9Sz8N(v48!qPkG7_ zEhmVgT1;6mb+Q+QJBBn}cLk-~EKVY~(sv$PD1?c)Q-HnI3?ibK9W90VxeyvoO>>&! zP}LUlv~S#cK!~POr$=FhJiF+Il=T}6GOQen`gpDPJkn)=$Nt<-cVoz?R<{YQD?i%g zo(Ax32^DV_0p{d(byB?Rhl|I~vh;9z-UTF9b5=7#2M14Id+*?m$DLr-o(t$ybD_Wc zYi#{3|l(J|@%9^uT(2Ni(>2yxouxj7q_;q8^NqPaYrJu72K1vzh`BQiueWlr-Hr z*g)M=kR(s^2&jvTwc{Nz@AE>#mk!~sfx&a6_YiTF{hmR3>#Y;kPcRrx8z7Qx7#~xO z=Aer2n!W$>c{y~1L#?36NsY7P{3&1n6OG_T;>V7d7@hxun1?2M_%Q;F`HzP{0SUv2 zd}M5~3fzbO6J2$1A&@WU96mA^DF}7v+y?8Ay*IvwzhLQwM_2=ApPt_g;*Lq8zmc%5-G{RETcJwW2>>Aq1-~x>WzbG zXp#K<9i;f%&v3@T^hM``UPh0BvPt5Ytey!w$X?0p_bbWCSL9>ImzTkz34HCB|K}^o z?;G^r5Ts!lV}hjbAngVJ*C6HiJCJ56{YT1|XDN`-{x^^^u`X_R!5_SXG>WYX|F@j) z^_nNyawjWostxVIVRnIMOu3iqS{QXnT9wuiAUc!;z$BqOwnHw$w@Ls7)10Hba*$Sb zXHG1ZUA)vet68jBfXLgc^Rdi9JcwH%(Nl^v$WxNn#*MaKLA)G_RA({nl*hK~=WEK{#`5RO?)7$aN5P2ajY=+lBB8z% z4UfHd==1xJcPLytO2K1A`{5$b7u|IWots0{*9hSrWv8OX=X@PxJdBG?cwB5&`I3W* zWfgkIw&R)e0BXpXH9~zfXQNwHIk7Q)0l_>e`!Z{ta=rkaMCzjl}_AGE6(6nE>r{2gD> zZwA@C$yfWOwDp?KtjP$8@9ls(fwFJv3t7L*^Q(nm z$hbAf@zz*D=$~xK;IQozp1j0Adk_T+G@AvNE6}iH^8bR)rmv=LFQDP5YClxT&bNa` zOSYOW9@VXn7faY9gL~uV4wJ2_tQe=MV})g2heQn1w`5d$C|ZOpqxGJC&6mas<4SSln}yaKDC*% z<&ec5ToS3OuViLSER9^YbrLXExY~hS7|GwS@*}KN_yqz1e;401p+=*?=`llF10{nrT`Dos-1qe-DqXl z_8>KgjE>^g-%@?~mf|57Uc((>1;gmg%)sM(A*JwQ5i{35&71MO#koEA|q&tA--{m;NG3P%E2lf5Q6dHR6>l>&1#6x_vM9}%36RJjj6F!a*}kI zrF4o*f+grn_Dx%QbPagkwlDBHIOaSPgu&8TFo*;mOaCc7GoYgW`NRD=Z7Vz4UI55Y z6Nsx92}5V0>4l8gt0&s`Pyqun-7i{k>C-^*xYqq{+na3f91H2vcDT@eF-W-Pb{Fli zDN><}p&{S{yR_ImCH~7ZJ2?EXCr4vOJ*%(KT&=1kfJNbEPLO6o|4`wSg=e*b!;xB* zd;er-FYuvL^X-R^>|#XzH8PQO;rwt0gnLRY6^z?LC0l$24uc5|GbO|287}SUo8!d8 z6Z6~G#V=_HT~jZHJn7?8>K@#KduIt<&Y9l>?RnD?`nQadzqxM7XRp0te@smS)`sBn z=xVwBqRZ74(K;x44(l`A<795A8Ci+1Jc@Ds+?<+=+E7xpEUC6jubl_JhDznObz9kk z@hymGSR5Nv%f)dC(DBjqO+T{D{pv3wtN%Hr{SN1ULrP;So=oq2r?i~^Mw)}`Zz)Yx z+vYvZ;d4d>-OgR@V?`yJMeM@f_rcs?W)*A#6&*$@Tnm_df&q7IeyisRM5G#WKqWh3 z7uPvP;bM8@^$~KozL+l8E6P{cY0WgavkF6@GtA!Jc>%mtHRB84Pxpn!8sw`v2;F)W zpa>^g2!7|B){w>%>%*oC`?M91%$VY!j*Jj{xhg@rDEK{qYt@d^1s0gn7@kttd&N3x z=+U<&BOs+s5ub>HV5Xc5H*11cXoLo&7B?(-B1G?ig(0tDhp`W&FpuC#*1Ay2>1#D( zuC)Zi{-qE0PHI^OZ9U?~UQfZ4GCQb6O#@(&$JHZnEN-CHy;8}!Kmc;XpkZ4)z}hh@ zj|(N_`^`J4QL(A0dnf-!Y9XsCaN(D|yA_Ihg=uELGCvLCj1`$jZD}? z^| zrr$N>&Oi47Q@zv=riady6s4 zWnK(n`&(kpZF;2Nu}xu;20e34J0gfU8AgT>UL&e6j2;Y4rsvU;v=vD-vsW&L2c?)!Ws8CG!R${JGKJm{q-sDK32 z8O-1r2t=Eo7N66=SvciBa`YpL$d}8ra5JYv^z(DI{U*p}MsW9xk87CiOP6TfZKgde zW*)NQ>wGEe>9*T27hN?M?jpLr2r)}nE<=|=`O7j@Aw8F-F&g{7h)T{XZ(iRjy%P#1 z-4%GKoT@@j@632|AZpevkjEHax*iyzA>}!<5%LFfq63c1@Iq95x4>A`fT)dac4=JN zZ$~pH)!LuPJCN;F)nkHBO7~pEQz63?~^x~ zpOpYwl(@pEI{w?Dws$B)StJtQ|8v0gJ2CtllH)USPyFqBz~ztlzXL8CTPI`3|IjG@ z)8KDg6jxH@ZI=m={nnmnkSi1;qqAnh4^GWE0veMl?v8n*j8TCmUH}6cgm}%08PZ8$qL-}CGP7X0`D;uO# z*&>s?fVB656rCl6oggB50pzF8>b_Io9TDhxDOOC4*ypXQoU^64J?NSDmS{(kS@_~# zr%tkS^7PSR(VvArUI=`=pgG)k@aKQ~xe-f|f6RhtO{-eeL4QIkJKbJwZqO0>Elb!f zM95sR1!eI~S%a0w-OLS(O4U_3V2654|H4eJWKk^~mxfMt;h=I_zpw^1Z>ApdXcA5! zFmQK~0w$f*Y${hG&;*q=AvXaBs?ESLe58b@%M0wUAc_tS}J zL@cDvA$q&{E>Y-A_|5}*yS4rSs7%Dp1nu<+GchP0Y`?;m&T+n_0+MXR-aXIWA$Oj! zdS_l_Q_o%u*Gz93+^}~G`@QG0(S*5`<+Rl^x6K!rLh;uQp0o?s&7$`X9<+bz;Q1%) zI5Pav&G%0q{SK#pO)0!03oR1M?;Sh`B0)Oec=^Q}%qt&=!t-ryb1~uYTWLqeMjEV^ z+l~dZu@Wv~gk)$4_Y(=Cr}1ohjD3S-kC$lZnN!5mWyHTaX>Bs@;mJmku@xkRKl+t( zCd8`j5*L^Vl(ftYrk8xGydMRr(g*r%BR^F^GPi=g_S{Yz0kYdX)SMm$V3MUU;l7AQ zr-6MtGRZ=q`dMi5Hjk-trRagm-)o(^TdmFv53X zvm^D$HPBb>!jtaxYO-(Nv7+lt`MJR5Ei_@Mb#0wP8YS|f-Vt&*jY_>c(fhzim)7DK zJw*{r^_53;+)qQ$MxhD>+vHXMBghL;0nvrP3|shA&^~<}nq&;J*P?_Sq7elXU->?q zaf4EyPf9tMhLCpPE^8vE^E8$a*?5&A7E8SXQk0G)%ZIdTPBs35Vyvc}5n~iUBtF|c zdq8S6nZk|gk9=ie=KXL>Rx2YS50Wz4BtOijBC9P&gYpQn<~#UKnHgL2I1Z#k`~rZX z1+Ka(>%@ob5-UcZY-SEquYC6Tqq$vgX=%4J)l;yvj|xKCz#-D*r$Mvsf<@2rL?7Do{Eu?3li z__Mchmx-;waN%@!z@Be4c(DFMoOAeJh;yt%Q?UK63fi!wf8{K|?b%tFV=3r$Qk-Ub08~U6%oKKwVFcH2}DwM_pGS0v?dr)wJEOiUjI*V&eXd&XZt_JIm9Om zQ)wR|hlv$vTO_P!caFbnxiqn>u%!3Ib8DOE*kagn1|awjf+ZD+1%I3@m z7rOl>&bbSF%Dz*|`9qwe@}J_IRPR!!dkm1v7gC0ZYI_9l>>0>^7UwJklJx&3&RNh2 zEo-aDSTbk$dvQ+1WdT$lEHg^N{M;x-fd9T36Pk;e_C*F)8Mj)YZk7c#a=YZHhOLMTwd6Ts-S*qB!q3fNP z)@WUSF|2HRnTzMc_hm5Zw~&JMWQ(PriMcyWuBnWM z|EDyk{x@k(>2J~;ON9)3)H)A0NJNoIw6P9Uv9Jk$x3HD4u!;Y$ zRIo0PNy6gkqukI%MZ-{f#W6)i(M9|Ju=>$O$^Wp((M7-iVSQh0*J@cxdit=X%38a* z-p**3ZNq6boK(lzHDa8>#6LOCETl#bi^VsHl_=^)67Kh=*?e1O#MapZ-&}(Ou|rma z!!xTMeO_qFHlh3qrA_v(%OU=IUCwVp9Ru*1|Ha;0N7b=q@1j6(ch?}n-5nC#-QC?i zxVyU(Ah^4`yGw9)f;)GoPj}yQa{Kh}zCYg^Z!;*M*lX=kwQ9<@=KSV_3yE#aup*C# zJ$}pAaDX{jWjPGWZ-UpEtgvM9HBRY5p-XB@cDO6cZ|^vYB+G=A ztPwOrh0Pnd_JaWSJTvdcAJCqRmC}I%d-;qnovb8XXcj9NJjsPg8?gZ ziPKO9^#Vm7VVpdBgk#)P<2Z(Ju-iH=4D~o2ni!w8~^zv(g23THNgkEzjT7jiwgr2472+p0xQ-kGW+XkpV)tuy0 zSWo-XPI9i)U1&%*IlS^TZ$=2(*>{xbGQ=ukc|{h~d-;jh(ma#$xFo|nY8V5tW4Yy`9_j6o?Vi$Tp@bSWdBEdXau4{eO)Ev)L^ zQDn{^4)0S&$nn{mjOpAR%S1PbAUVFPMYc5wp^oRcm#$a%GH=Opn_GyHmgHMfjdS9F zsy_HZm)qOFkr!kJ6~2}KGozdEug}+?cpd+f57_;ytl^i7*MDVk1AIWgPsId?GgjD^ z@iF=O@Bhl;UZ;1uPW^N>fEZbeOQ{YbP^xKDwtsnQ9n8d>S46-*oIqp8%o~?c9ow4{ z*GZ2)A5t4J=T`T~)I>j;FqxB@d`!wxW1yC$y2QwTnv#FU5ztWS<5)WAy=09ENZnQ# zjbME((zRpcS>HQON~mTumBb}qJLXalasZ>3t6kHS`}&)BeO2^Tq5z23?ca#k-+F@M zilf#j45(}ORMZ!t@sI+coW-U-H95>P0SLBdTv#xjhFtN(8wMT&QsTs@szi|kcb*vz zleatj4Jyb^n{D(hJ+;HA#8YFoxs7OV)sI*E*c-H!)~7uZQTkZpsj>`wdkm~ zCgiT1m1#; zYx^1FJwV3SPA2BR)#o1qq${)C6YLwP!$3NjWQrU>x}?6ONDVT6wYWo=gRpf%W#(cj zTa8vPGSnQf(yiY$yK&wDnvrz5pIC4{t9kZlbQZmg$SwARHelo&pl2l6gL5xfklZ;&M@OlAnlCD48K6o2+p~kAQgc z+f?bvOljgYQI=9&Qi6a52}JO|_k1%6q{tld6(7qb75fm}+|a2XDt3(7)U32PWLGSU zAcS{e`oZ+M{d!E`K86(t$NFdcwlv8W2y=qgh|()OZKHUpWG_gbpf9o_^%zHHlrk#? z2%#(HqZOmbxFF4UJ`7vxQcKT?P+iZNzCv(xuih}f&>W{Dug5hPQh`K%j5t( zI2<@|l`;D>Qxk-PrRRBZnA`sFdL?)bMA;yNFeX;cK75)Ce{}wSP=zv?K*M*Ie8=S* z!mkf+2$-c{4~HtQ6m4gSPd`WkwsK&IS>N`uL=>w;1A+$q+^&bs(gSA|!K>*RD;cN- zirXC0xgf*ogY91(m>}|ux@~`ygvl>xIhvQTP~zOByRF$g8n%L@FQPInD>L8r(|W5V z71JP3L-z|%rUj$4+R5Kl$Pw)xG`tx=jy*ef1h;X1W-^#~(BHfY0*OrH#r9V7c(o zn={m`LtaOibU~=XQ%+~QDPfgJ)ub$2>-(rz!omYBcM~9hCJkkvAUq;4&uUB+HzQ&s zccbM(cg6A{2rT|AGN6skLN{2Vr?bioH*)~*NTEyB=1a(SW;cdYu7Z_nB8@UshRy{> zVOAp~Vq^O4`?95Z{;3xC+uhT^#Pt|W?ClUsAi-mzq=Xlz%9xy|5^8ufY^ls&xl^#W z??0;mT7Vi*h2}qLfxjmhD6Lwr(!+Xgs6e{wB-Tl>fjWiJXtV}9!NuGFoZ9O8WAISB z_)Y>+4XGBe&#m8qeM#kZId&PwHMOn&<<T3*=p8ZXA!dPcvK(ZC^*3LDbZUl0-P-76v)|iiMoj|}( zQ&HlE^P?n@7`;%iNCdd>yLcrsERzT9KKVtnNH4T}Nv_p3(9WCim`ZQQaDK&125PpN zyaYH5f1DHltDsl(^#q!1>&5PTGzYTPFnyiVnRwFlA0SBWa;N2a?OfYbE0rQ`YDBsa z`Nbu?&BS{V6XF6?VCr!{9khm1yY6aN3rn&`B}#3ePPqs8!*UC@9f#rFwq@%OkgW5W zNUSKa^MTS%+n(`rWm=mI1K9gM-MJ@o6WET=Top%E1!N{YZeANS4QtYC)KenA*wyR~ z7)VK!n~O~#!x`30DF7^QcbKF%%1K)Yiwk;{#;~9Rk;Zomtf8aydNhMEJ4SnCko#tZ0!9!%!l@bUW&1nFzUVDJT4#6;zz5 znv%SdL9||54Q_Yd4)k0h*3~hC&C1)c0cP&m^Nwb$LgmBNJ! zJoN>$=U2r@UY9HwJ^$>#Ly?{hy@% zZ&UZrl*R$BHe$y;1@%U8e2JOdoD`U^qA2ReI9?wMuGYf0_%rMHMw3&mPZV%5_FICe zjld%1=JO`wvK>^^-}g`=FmDcCf3{f7vtlp*x_oV%47q5rm|Ebj;0ZHkiu50M@O!&rP`5CLN6=E+r^m1dDR6WGu7Mf7B^!ZyO3 z->GA=f1G@r`RTsrq)uc~S3#cC`rVL=#-ani%4mG>!$LkNp@)Eil9oNh z2$p7oUlJpwZ_sK>97EX2y>n*CdQ!6TVosCYCQ3X4E!uaf8iG$ZLR%LFz1B9R~a_e4754f=;`Vu8D}^T6ie&DF_= z!8m2~^x^kgV>pyU1)!xmiBD=`SnA1o%m9_qQccUYd%o4G$R$(u0BK0R0sE_2&sRlv z_aEczzN&8N9!KC))3e2k?_ua{$Rvu;D52p;(h4VkdmG|m^7ygRxsrP7#wMN?TpV`_ z{Al-a!+YDLD;XGc_=3Aj_lw%t>wL4cAAIaE;nyVUPqV!QUQ9|L*C?;qaV z;lI-HU2qBXfa9Xtf560_2O6@5j9Jsv9odk-uOIK?M2Im{Zf3UQoXv#taX0sqWJz*! zKSg!86LU2&!Vhc}*w5jmVYeMx?YNp@^=Tg-M)<4YyIf0PXa#r(`Tx~J`0ttR)IlJb`tTBX9 zEG{j32qH~~%0j&BH=bZ#&{mVNQGAiD;_9NELKbUOBJo8As$D6^p)2M!#zsT_YW=v9 zt<4g$5Au`f-g@Z`O32Z|(!|G?q<)VAEUxIase*mbi+Y>&+F9h9AF^MM;sN`_|z$!jI4uL3HfdgmLQu*AMq zRcn*3vJ7Man~$uD0+zs1?+3WpXLQi{??I6dy7|%rXfNOkCA8(;Ry+r0CQlw0>Wx2_ zU+XtqNm?WHiuU0K4DBWL3?)Z!u0DF|G&pjcwnPWV?kMaYo4hLTqeh#X1m^2{Us}D&NuC)R@hi6G=YMlDky*BQx&X3P|6gV8 zzbB}d%Z~oq*lK%5)4L$ELinh^5)S!qQNt&ZJKexR2t;?k+_Z8rb~auzxLx?*mWwcg z4bL&|lM~w@SGZ$aIl0QCxVP`xE6_&*)o$;bkAuQ~!_e}W#9$9 zeU4)k-4`$^q^^Z@w0BFg@;7-sISY{QMA^qx{r98e5P#J^*(!tVzY^Bb0Uc}plL7wQ zMD;TjfZNUfYbzPiUB8a`0G7hTpsnR*>?W( zR4}-&P;4&~Miv$vpVx{CtW|LgY2_zvS3K8{g@6O2_AFO#ngf;37qjER(c`K$xW1M& zgRa|X;w%Om$@w{GNsDc{EM?_QMOA(()priQEVu%47y;We95Gclnzk zj-=xJ$=#`C+W)n681^Op%z~|N=T%(s35xaGYu^WL?js$Y$?0~%KIyn#YKrr$Skiu* zNzrF%-wlP5_L>2n9cfIC;G_b5)WA#~b(5USc zjw{3nx|u_hr~)`uTE);LZbC#Bwx5Y|oT5a11D^;!V!70zkX9@v329wU#2qo?e=iwhcrLK9X)1kIH~y`Pc682TO=zD`u++BUHUiDCWajsE;sSlS6K@Gmp zYa_=*E8Ro^6y$}b`~1Ou%i7%gEoM{zjxPV&buZM+?z=>JA;m5}3(#Qbd>eIG7hN2F9ZBsSFT}W8tcNV=4R^u-X&jIxwCj1Li2W zo`>rkL2o(J@L(t)N~GMu40jzV%ORfSdwt>Y)B#@*+mkUI-aMDnn@-#J(jkhf6o?+q zgBjUJXV@k69mIR-vEk$5QSl>cROBD>g&AAqy^~G^)plC?8r;@aqOUuF9h4XjJ2pY5 z_`ioAWRHCDOl61XM6M4J*}KP(!j+O2i4S}WBWE97t5uV+Rsv`_0z<5Nkq$nmB z()yTGSn-WzC@?xCL|9J?>RpLCFz;9@%$pW!q-$$z1iKZs^3B@|PLoK;FUCd8kVMF& zy;#N+Y6*nLlShCoLU86UG!nEE+~rtT_asHx1TjVu=*CuK5iu+Pqv<#?>A{g)2-i~| zEiZZ7&@sIl+#z7FyxY1EOMdMgUt6FrW=w8NO`QofBwj@UriIcRmEX`>%e& z3rgN^ac{C@MT`mC$M1P`9uU8BH9gx(^S<8V`>QGxE3d=u1Q>^3HLd=BtLDFxC(2{~ zS-a-nnJ;HTpxyCv5RgX=aIAa)>#&ORrCSgIpZomubZju`_H*=Z6fe02`!4ebKj9VS z)U4hDjyX{NmZ2yKU9-YUw=6UvJ1|=(9x~z!?+!8*uiw9Ev?_)Qz%|F6bXDPL0}X|Ao<%#aaNQ^ zD6sdbED|1Ha_WvK91Mv39-XJ)~iz@+hjjdSi3 zOGfc3$33maZGWUAY;u1F5r*21U@NtijyOgNV@1lvzANCy&S6T7Po*ueWq`f`nAqlld2pC78E@&k!;{#nqJ!p|^g<)`=r zp(Ssclz#iSWZ_YPr4>vRd06U**^iuKJ03F&kG8!LAj3tu1|(g~(W{lbjz$>C5u48s z37OXM2cL0k>s+ZlRRhWmAN%)3I^!GyhvQ%nwlVy{lv(Z7MFp^$B+Ue+_gfM;REB-S zBs-BT*va*!BH`^C{hIp%?1(8GbRQ^>kclz%!bkaJ=~v6ko^TV&I|f^_%@3X8r`tnE z#sd-_`&keaj`+ik;6%QKPwy3N*iZh*a(=6X7lxSDgnngD^y3C$liqHnbHu!zK@ynq zz|bS?BH4XL^P37tJ((bd92g?BWZaR49I(2s-pdQkfkVJz$;K%>5}bWqK0+PZm&Ul! ztgP9}f+>tN_Lj9w0@S>*Y<80q%r5YF+2D&vPp%#R3RDbIh3@OW1RKD8r1|Z2E$VKO zC-xkDwUzZ-=?{!Tw~<2OndWn?k43#J;eF+G!wTu~EEfA^NX@-x&+(BYXy4=*R_<;_ ztq|X_Bqx3^w4l%>IdcHe1snfW7yNhDL3!-Bcpp8Y&&4w;(dKmis{c@p8Bb9aVBZ!2 zan>w-4X|%peA>}2huT;LfuIe(f02%0yo%p$a1m3}pYx!um?1#Fv`SC;w!)*man+z^ zrPF0bN$gg`P+NmivyCG6Lo{_9RNKTCN$?0ZrL8coP)^ti-W^m;Wj<2!0Ct@^#d47< z%lS2}_8fJK&Jq{gViSM-lxQjtg^_EuH=cJ(60CFk6&hrgpJoMmd*q>G{sZah;=waMtw!tNC1Z?hhY zmwFx=KS#kWDQZ&ZNGX?k-Q)T1EQz=KCF0E9U=Aaua2&W^zOY{}R$raJepbWOnJpYY z84=no4~(c&pBK|E*ScBE>_Kkt^t`6+I7;fzUfU3Q@>s=ck(pobqg`=ayBlC$ohPH& zxwC4QqVl9EO=mp6$sS*kOncB?rG$xBPof`Xubk@eW-9c~GrEN|%+jYqfp zzGKDq*dQbvXH5GvsBJ63-Vp4$s-{a@21(~CS~X5l;Hx_V-)?hwcNmX(cK+J<#bqBD zric*qx@+2ovZ@+2tAQWgtBAUO)9@!89Nt^V=$ue=(o20aSIfqnkb5KbQ*CK$aCi5N z5T}>nZm*XMLuu)`K^m6Z)n*>!n8^#?|yEtHydXY?h66l zlUOYm`Apf#eWG2Z4U-eK=Qov~3qq;*qeKBMLnw(D{Y)w)-e+2w%&V+c7z1a$ATw z2fOl~nXGy#8%3W_Ji)hzh`c#$>>HR|n|7pq$5k6p66E714ja&tNmyHdS^vs57>FJi zM(Od@RA$St8NV^-4gR!bxQwfr<3QDA22vHG?8Cx%fKzK94UcQI3RPx)>`zG!GBKpa zwZSL+oU2;FKrs+m;37>tN)f`NM-W+G$vtG*X7CLlN{10e_qY@p=ou^)3fr&Yq8o!V zSGZ$|JGwfm&=51o6UPJ$;*;b7d&%Hb^lyuFbS z3&dKgOe$~dqvCa$)K#9W8sIEo!mbvWeN&J*64`hlN}xn40kAoeAw|Ha6>0J+U}>c1 zlaS`pRd2^eHxEMHg%313hfR#rkqk<`&N&{-Io=yl9Ul= zni(+?sGx6tje)SI;;t#}N!DIcaKUY|!P0R>|Lj#VxG`k((V#;lRp!!9-j4$XDXHhK zszX9jmg=erI`P{1c-pXz1pfY2cLQ3*$) zKS3wp@JE5{f%7N89FP+Wk?=svi{k6zBl|WJB1<&LF4b6J2~k2Sk!VYQ0Wt0FfzG+5 z%&EU`=OVyZmEz7Q5ZQj};7G6sf&~r&`s}j>is=V?8y3SlYM*FR~!{6QH>@dVSPJ@S*G%(xsj0@{6OYj$IWeBPck+A&W-p%7`!E>8}Tp!^a%ceBe!jZ z4q=&&3?;3nK=gpa)+ka`_lsWJUIco9cT_i^`u-f8#`*`n6fnLiL5h8De@jA=!I!0i zDcV%_8=tYnrf*^0r1Y{eEU>7OMIE4dgArwYKP-o#vQbzyC(lOkVijbax%M7{7y7Q$ z4Rs4*q`IM1Rs$psHtm+og1=Wg=+!4>efhpN8VsYe>Qfy>zYa%nXO ze<)>0AQ1vrN8XGk-%l-EVNBOI*rdPU;}MUc^O5h+JU{(U@=8+C*Uz;^pQ#POYl!3| zzE$kfNZy#*^QHk89X5V@lPg=xXu1XNUZD@p1$WIVapNE9?VJ&glsRam@2|Q1Xtmk> zMPn(4Ey!=Y6WoF=4977&BhhdAG>p-htc6UkD`SI1s`|}RnZS(koW|X&5wFpcj#Owe zTi5ML25#iY)ruB2{vp49T%Ab5Nle@&%~-4yNn^tK!;U&oJXF59DkV=h6BtLD5lm%Y zz?a;&2kqvShzqH_w&%o0BFiw>+>{HkTwVnhoN-ZL&f4{q@jaShcdwby8vyDmIT&0J z7p}HirLl03P_^LD>yJ=1o0%5GC{<$Hsh>1fhWS)90V)wn+*Irmk3ip_F6w#;W#h9|tC6eMiTZfsr`jYxkIwqu0LrnBL@1oz%$%{T}k>@5*43h$S9xc&VWo z>{2J;Sm^VWr3UFVnK3wW%JerutSxYv4y1N_DxDr%dN;{Bjf#Z)KGOz!n^jB12qh>pCcIHc~`=Ei5Ahl~@@yt|3>P_Vm@Z)f|X*s2KgNJ<$F%G2*$VcDo0TJkaXtG<6*iHdx6*hJYZq#aq6XNF9d$5uA z)6H%72~<2@dhWwCFWFMNgmdb%-E;@ON;VGa`Ak>qNu4~N zo%S=cBwBtNAkFlMvwUTA0uHCITGgq=A(5Ci=mPzLuLFsJFnHQk-yzM_Ir>ekqo;8R z;7@y>7N~@#EPb9pUyy^KmF#L{Nx+i?O$;-V`^;ZNysXhWc+O>uMe#6Y zT<*EFW@)U^Hxib>D|3?2Ag{=77NVhfC!TN7Tb$?HX3HExFAa&qXMUFHj&O8*tVta* zOCpM+n?Q`4Z60FQpW9c64oEL?@4iU}KKr16>kf7_wMaP8C^}iyORxI5Rks88@ny2_ z!d>8)SzeitG_F{5AY=OA6BxMMt zAuiRpyJPaN1{24!6cKxW|A|+(I;kgLIkc=`c~e+Y-(x!bxWxAKc+=D|`|Mor(K9R> zy4(G|O#IWnFv7=|6w%Jh`kvk2x6mM{J83GM@S7$o-i-*xvO9bc$(iHH(Av) z*HPXg;eh+uiNUEEDo~PH!v{4tgFF(1xoQS$CbC0IVpufMSKhQkS|&8U5_-U6?!{qD z_)X`wRv5~+7&~5P3y=0Sj&XP6{Cp5(_G<3hhFF>ZZD;%cZ$u7wDE`0Eh+HbsaQ!FX zYN7z@1OXsEu9kEzHue_!HZ~T22PgqWq^)}i5d$vVpzH3zahqceuny#fhRfx>?F)^q zWMNhLPj1e_@i@+^KN$z@88ocuNXc|eL7Y(sTLQu~RvB{*JC}FvuH?Epl_k@Uqrnas zaRXN5JP>F*vhvv2fx-dxI8%jy1}DV&H67n7tepI1Dju0liPz{G3h+IUW>o}^h`J*0 z2$V6op|Mc)nP1_I0vcpD(s?{S3iVkIUe!TNwWQ6sL>fHcrBOF$)hAl-#yG!fJ7$fs zpVTJFk@oFadrU?ZaiJ-wR{2R;K0)v{s!Qt!3c%CFPxy>2i%Ca@&^aN$kzA)%aetF& zcEA0N%LY8AfxiK`W5ocafc?iE`$O^m`M&+F>Mf5O2k3}@+`Q_0b!T;PidYAzK+RP^ z0qV8}NlP))Mn1P^YXwn#$Xtl*zKA-e>=@;f3p?5Dl;Y@aex-yQ`lh9uT&Bwok7f@) zr*_r$ZC$mfm{5p=i(*n ztzdVp6nt0kkl#LWHCSEPqO1*u_*N>KUa=Zn52(?8Mz(Yaw$#?*A?Re&hW8s}3Ob zv|ag+9Sgw2^?%ov>*N<$cwg`A*{NhJXV3*nje!>%xiPkPksKQLL~n?|GhF@@+6KT1 z!vhGGE6mXii)tyrVy)}RUNh@F?J*08=iAbG!mZ85U+3N-k#mxyez%B zJzWH&l)j*t1G6O$8k&oU8x2Mgdt#DZeNK~uucJqUlAA)a_=LC%pHDJ&bnj05iHM;w z{G?x@LZ+Ag?nvm^24zHv_KU1Asw(9-_V|W=F~RS595G;e3+7Y?(gk&Xs+362BhW<= zi$CO=*5RKJ!&R+-Q?m@J_uj)iJhA zCiZNMAEXi~HItdA*KU#R+xF(0Bb5iofMyg!Qk46Iy<>c3A9DB%nMrs9ihf;Z~wYLviqcLK}ClcCL&NkziS_;_M-1ZFV^ z2=1+R-^m7U7HTR?bHKQjmNyTLMt)@c3|-Nz)JVSIJ}99%LJ|Ie zcdyxHt-fv>_Cwn$>Lc=06d)d9?F~|?5?y#NCEO+*<55od2k*~hP3kQ458mJ0FWw*1 zFW#R8fcFQ-hTbuP_wuCv5A$CCxl#CApxzARm#7>rW<`u_JKckBJV}A|KqO#V6^-94oi%ull za~7ADo_6^GpB*?3uLVR2DqN=#2ClnS>!#rqBT7~c%HrH@E6=&dy2AaBh@znxf+|0Q zt=ePWJK5yKxShV~>JfyNffMkLKO@xRB13_pIG_ocd>; z9COkhp`7&|%Ci=kjI;A_haEoYTQs90hT!dO)re)bkrDvKZaVmdn-%updZY=)3` zRr59Q=W3NbB^I?|p^qoBm9V*~1A@LSdm8Oe8X$U!<*OqKFf%*t3A}<45J_}L*O@LW zCxi`F*p2hmv&=V~2i&Q=wUYX+pg(7xto3u*f1rfzP&(qKwO2o{Ohr@MtMLhf2@w?RD?oyXq?!$J19Fg+ zP=k#_gsU7je}weN;KD@@!bJDvPs3sb;q2D(q;B0c(Ki@E`Z3f0wSCFHlNn*gZU4ae z38vG@<%F4I!ddqQLmXYqCODeY3B82w5^ZiCJ;&MeV)ty%V0jLrqvqOVq*$Tv5L&-( zq?S1r)mr{K!HRI)7h${pv)mipK_}dNU4dEmkU@t;5AzxAvSmEGn9UVca|KQHL#$T? zNIsuiNv;mW-B#dI(JAv%TDV?mFbv;4!c-^eKNx>JzZid<0LEXq)K4M~$Dqk?O%}A! zfF9;-9tJPXA)OZ?os@9AVBS)isHWsT(;~Wr^y0cVRJyQ;n2-_3nEue1pFzPvzJU%@ zfdmD2@#`jZT~g{s{PE9k(3m2Su%N6$e}1}qK=F79<$3GFS3pTxLc&zl7tz%X#q;$gb*8Qc%-k2% z)rHIj@MBgx>Wuz<0}m3`vWrOKd4B;a#9j(FLN3!ZX89AcI2$;rnb--XxF{b`>gX(|ZxT6KxFid@n#TSlja8%?;$;u60 zkT4D|7@OE6tUrM*nW#dqOo z!!1<(tC+po0AYr_w%U8haB%`Gqk_Wb3W`?6pn1{}EU`gwj3erVjAAr-7Rt zPTjTB%gXkQeN|0NT^lqtHjPI(pQv9b3B70%x>$~q#JYu>o>HMYeEGdwlVvbEBy$Hs z##?~l-EaPvz{WCC0l@zP11uWq9}DIH*n%`NRB*Ka1^NEYZFQQg{*_z=zS%B=RI^%# z7bcqa(a(SL;}cLW&nmxtakJvhStL6o`r!NXMUYMdg2^%-2v#&4-L)T6*Tg+|aFEW# z^L$z(W&D@eaZ_ui)0c?qEf$j_l;SOeh*@FCV`1Agdp_X8{bT=GhJJd;G?2qAVV}dY zqOd%4X`Eg0I620WGt`L0kCYVam)+mI-e&ZKRnxS7Wa^4qs6GysR)*I}7}5O|f6nqd zA$bBWlNk{8f&1sB{?}Mfxx%nD;2PVn(ULCu;p-qvNN{6{+-YBd;w90CB@A&uU!UBe zN<&IY>QToZ#@kE|mZg&+x~K8$%o4|J84EFesTG$;ID50xZ)b7ouI0>6V|ztD=*AL@ z#%~R*oF^hGFcYR=mBQzjDvHAxuPH9}Iby4taf{h9<~j<4T98gCG^1GP!BNght2Z74 zi1cmASk5@1`cz7SK^y#j#<=m^q&z$_RHSs2lk6aF<{eX6KVj*;XA@&z?woft zRR?R`#1woGJ3c|l%bPcOCRwc+doNex(6Erb+xz1o&R^H=$B(e<1i;!g0sP-z(K?OK zHr9?t){Z)gZnj1aT7UPHmM4z>T0x=v*D&%`N(M(cCA4TEvt%0iBZw5&ILz%}OO&1s z7hLF)7!>|0u>`Da50e3D#x&NvFmw7ODvqe&Bf=x*Xy8RDski+V*A5T$BaXneTgz$Zx*W_%q(ud#m`GW%y(Q)0BU zVXi-a#22x7c3L;bRVb&*k_$H5t|b}5DzZdSm2j5Vx>8XKGi)6I)Gi&g4o(c(?(>D& zSP{p-3rW)J8SL$oKP24R(aYO(i@E$szr_i;C}x^;Kek}fn<49j5Ud7|XSn783({JA zm0{AQ*nkw0KQsxub~PcumS|;dU$p{c)BtLmC%)R+_|(HTWD7o>fqgFqc8qMeFKiZm zu))8gxw^8IF0hu9@>kg@1qjvA^@ZQ*m?N#a5MlG{r7M^TigFM`mad;&!cw$qkqHwzkl>!LGPajqXBdi zVDR5S;NR!@DmcQDNKhKf~s0Ij_ z<^QlKzt8Yj)%@ofd;lf0e$DW2Mg9BGziNg*59J1Aiv9;ZAu9m}P$ED;(10%=z*?ap z|N85%>W1q;k^I611W45l}?ft=h!B%VhCRytP_WdcNroA*w`~Ir> zrWz_|L{wA)NOu!R7y1c^R~opEu7YeK3*bpX0r?;wsvH2-gcQH3Fm=^I+~8D2D-nVM zy?fJ!cxT5TzIX5oytU@!kn4qAbs3fSk%*?pRAh;mN z(2R$I0*^Ll?_WQE5qNoT=5+^RR=uPRv4^B*2Ev7d1%W#?06P2tWD8m4jdAHs3n^+# zZc2{{gboku^WaVQ!nBt?F;xVF3Cd1F0*VTIC}Ju~PEF5j3+a=f1d1oWoB}(-fJj`u zxoC1Yy3Uukn?kQasiL!-L0(nm-?wyNs~fKvUJQNmWZV(JY+ER2!}T53w#m*c4HRR3 zvLsbJ&o}A=1cVg=960c;3=>ct8wFKB2xE&u-cJ+QDLqPG!>Qy>ccE&SH%&0TJI^wp z5JCo9W=Lj!$fgkwt+SWMHr2(Jmtp7Rw3^6xYuwa;c^hW>c*ukBY^^T4hHRMc)_@E-?AZ8HGJrL@?xR?K%0nN5TV?ijzS4EZD*?egjt<IN%VW1J zqr^>OBfc-}Rqq58H!O!l*_C{I!*EZL7i4XPh@LkJz? zVWSW3Wc9T)z&dOG)^rdVBZ%_+VM0Q~poQ0_acNQoy%OMtygtq8n9+3MZwYgeXDo;$ z_5!Ge1InM&)CA31g-D3TBzx>lD}s|@b;MR5bGNc4B{GD!xD!91y*1{brE~oRjs;)5 z#{{3AfQQz9_5jIy0xDt7?9B==Z#wxI+CDd@XwGq-j85Wrd#O4TQ-7Tocv=yzQ-CVE zJzLS&nSQH1+T3LvR*zUW-)7LwK6n#^J^Jm7&46_^I!bcBi8y4+rl{!ow<*O`8X<{% z!g^7#;!qp}EYMgyVB|=|%H1yIy@!^rOEET3huMqEm>y!+w(8HjAmFh}2Ygfe*&=#mov34KF#y}i9vIaOMYQ|JKl5SrcmSnRKacL-u z)r9-I`j6OYEA7iqgzMdckQTJyOtnV!_j0J`b-%!7B97W2i3H$52^ldUrwBLi%*lV= zT%K;6eNNpXO(yU0`&fuYl6qv=K>{YNT5Wj_r8a51b(AQ^zom=Sl%wb#Sv0$wOscuJ zNJesbrrvdR*Kh_Nb4<7ymQ9uUII9kV_*3?=)vyOUnI|Ef3NDo>8FW_F{gp!{I$_s$ z4Vu9e1x4B)h@nkMI>uPw4MO%Dsl2BmXiD{TH7>L$mXJW;_!2BZBD^9Kc@T_a(V3o~epa0)^a3G=;*mAed)X+Dr2DR&#BSbkH!818+ekf*3t#z_^`b zRqKej)5D%X;Wlqv!PDTRR?|pxA?6eGxtqOuZyD@g$*3%#$Cxh#4nIqz`Bq|hT)Pl- zC4zV>H?BZbz2`T@#OvB-wTbcFMcEOvztk~EXS9Q0$|WCAiEdnArXd=*8u($rnihm< z;SKGn+I_k;CYzcv+T!Bw#@_nMr1KWnYNB&mkrufE75nxUic#tqxC=x2m=;KXrAjn=ua z#?*KHOD%ioC!|_j>)Rt9=(EEIk-dCgoO}cEg=GSMh%{kYDaSKs6f0^_%k*j4R{7Qs z1)EI7LE2Av`ii(hcaBxZBT6}ttbVbmU*2WG+}Pc_Xcbz<4lGIX7)gYmp&S^Cq(*^n z5p7%qN3K_B8LE5*Z)2;kpN1$UW+;b@#@Q!EFdKtTs+{NReYz?;BJK5HzWY@9|B%CC z)ORFdsjRZCpUDnJAViHLBP&*q(FW;-D;a0pWOd#ZK5tn z>Pv86k|!zf2ng<}CG~8}NBkN^>`M|qcu_)of#mJ`l!7c6WUs-#xV2$l$vhGT_TA;U z(PjH#nUC99NrfME9y92g@X&W&YTmmgsaL$zYveOJmos)CtuW z7_=%H6`ulW!5XM@=qRR}6WhC2SvzQ(4kYIHc8-HYhghNW5lgR{qrT)2bMGTz`hAaw zhqmOzt14yt>5LPN97jt@6CR>oORE2Mk82U64Y{bTSIzUzR=FX{QDO~i+C9w}%29*_ z(nO5lHh1fQHSh~D59+Mj!(7Ow6Z9(^Xy)bQ*xQmlX)99p z{K^}u)P;M4K{DAlbC)op-JkX$)OJkYt4R$mdBG6S=3K>1(YDZz97#mq>8S|%DA0BD z`|4=0AJTVuB`9DF1ZG!gE{WDlt^?e8)iE7@bqd;mR2fdqY1GeNR}gB?8A{HM_?g)jJ|yBzfJPf@iT zNc5=#A0H8D>RlX*9{EQ*f=3PyMay)0PFJIlrI`q_jCjfuPneUa6%7tFb3CYLzoylP z8WhU+7ja}KY%SXy2#-vo=HH&_8s2TN56+>5Z-gw6%*ls#>mAYWc!$ftT|i2ljOFOB zFmObCufCU~7a_ z)kj_=8qYY)9pQ^(gTSK`d)}auU3l0R<&LUMZR~QL@z9Y7arvbw;g%8#AE;brB60Uw zz69!v;THpGl_Gm1&99K|Uz+0WA;9+5gby{}F;IHGKzw$L3ZB|+?Z~}@@OgZiDL?A; z#=bM|WEMwBc0|QKHd}hO?zjPlgyo-Bjd27@%gjmi@Tn>0Z^?>}YVT-iYCgms$NFIDvQQy;RYwqF|z zlk)JiI0>I!th!!d2{=-ji(f~iu1yOTMNMyj7obwAM5((>KTlSba2^V6%4e7czxu?z z%1QP;F`&$C*@Pk$-xTy?UzwEpk47Py5kIFm8dI~&;KsKS3mQ1~a$*QoQTn1v=GVAe zO7}Eb8UUs3BUJwv069R$zkT@r5jPeenSEow2cQlU~*yDRfAYP zPIDU|#P_oa7K0D3lzk~t&oBE2hDdsA!8m75)PCSu1GZYaB?fe&Br&wK>kv?_|P zT1-V440kjt7X02=CNp>w`ykv{$a*;JOxg2vy6blO)s}F7d8Kr*=;zNGqar#qaZ69r z*)a>0AmSR>R)W`3kmE$;z%1Z0&ccV5u~3iz5E)uZpuQj#!HpRy2aOpy-jqrQZh9)E z`@YhK{6Rs1hnrW>lZQ;8VHDwoqm>YA7@d2ZRtSL8bD2Mr;!hRtuvF4Bn7Uw{kbqZ12&6?;HMCG7r*EX z%Nk+npa_pCe>s1uw{9e_^rx@qX2?`Ydr*Vbse zVaR}dM1s$s9{(iwkuIemQ=~XdjpIS1Gf{0|7=!wZ=vP5*vRUGyT@_JYVbz7BN+Y|OaX(IHmH(WbVe=z`mr&c%9P9z~ z7LJHX3Asim;MoRgP@)sGj)dFbp$yEbFtO1wtbR)@teNEWkmFzHR~Mf2_B@;6NWq=D z(^>YnjoNuRiuu)mNf}e47bm!EA3!OezFN>k%!Kw>sm?kzH5u?IS)7oB(v#dgPP4=n za%bOgJxsGuIF-L|mPiN=^aZtLSx14(j|F%*Ri<)`)&k^NwJ=ONbB z!y|Yg6}M!B^QP=kg#THF3oa3$P?Mt|di48ms#<>Q-y|!GPimENEwX|}yGRPq2ke-{ zG~n9h=(1wTGW+0+q$^Sd%q2|1oPxsB;77mk8t{3Va2=XsDIqtDzlzY!LYRVW{7az2(GBKYgdj0tuGv5havS&uqlD&C0Ayl;A&aYRl#ux_%;g0X6N5xsMf*uz!$V+cJR``InZC$*6 zOEgh8XpJy1pSv1XSS$c0JTRZEz%`BI-0?`n6<0Th?Uj%T^2EVnds8N4ySaHNXgEJ` zvxO8gMCo&PWT_Tb631^OC^+x|oh8y81*-8xS03b2NW+}9+LqF6k~3tD7X0NE15`v2 zo|dO~Oo9Lp5r0>_K4yEF6kPS!wBxqjvR54E0E(?P--eMruj}Vp7g& zuo*8`Ap_WL%sXeyAJUN@fZ^S2pMNIoTfFTInyFh?4vlzhjn}16_G?>L_dEU5{j-p^ z|NdjyLT5sS@R8v0^#>6AI#vDde%;L#bPy{p1<-Asan}5rG{huvv>+7`O8|m*rYMAjnM{P|z9)`fmLw;yL#H*mHvVRYkjClaQY-ciruE_#4d}RI zZV#oaIE79$rR;%X7JQ|pk!Y;8JSMFY9fl(EQO$uXgu&r~P{*HhlmqpUzrrVGRv{|- zA?se4h0hqx26q3#=dWVr*M=lT^aABp7(a-k%*9)Hs-@Z_JBnmr^xN#?dBc*Vk}<&M zHW__XV~={}*aP4k+qA$LlV-(8aZ_oqB*_)NoEbl66tgo`m$a2Us!I)9`CvT- z%sANNmHHwM^9+Om6I$II#5P9*YhsDNVo5p&#e06wOO356H0l8{UPiAyEB(Bs?s1b} zhL&}tsa5t`iel(I--*COH6WbPEFVq zXyK5y@-B#QUNhG{&JmkV>$jzvGtMv23y6ci zF+vHkcBzFCTgh%n5??90vWB=~0u2G%ft!_OP?+&>);-H8V`b|iMg#T^{E@Jm@ClZM z1M4jF3vV(?&>K)!Wl5Paqk1zlGid!uH!3Q3+VXQw_Z@Tz1tP+dK_;;p%F$pmqf8=5 zBZ;Zwl)7EP`Zn`XL;Q5LxnnvT5XnGMNno=7 zt|X8WXWRoG=g#>;39T2v&YctwpTCiDJvL7#g{qJSE*83`@B2lcdzSgfJ~xD;lTuqBi{0~{tcD@*BwM%ECrGVCI5~dvK_vtMwL-6`JKw~*_{5QT%2IQ~G_3J(*SxfsDho;<@*J$b;@p40_tTKYOw4%;^aWvDNE%jPtVeLSxR*f9;*B9c8;L{IbFa zx6lKQ5Q4dFFF_vBMulO7iJ^&RPtFlzwQosH7CMfsM#(bY2$d+jB^4r9$38lA_gSK< zXZU*srbG*LET{6^ai$h!YxWRY6E$y^W@)R&Fj|JGb0@cszluqCz_yh+WAz4+fNHu6 zg1>#EWgPKu#or$QabM2r40fB>*$N_nSS5ATazB}3?c7O|btC2BfcegF{`eeqHVfg4 z3udE*@s#uX9rNZiFT6_2_KxyW#-@oYNGFC3U&?6i<)G}UatI^)_OVswr9y`#Dh( z`+V^fhd4<0E5t3*lj`BUq0YluJxfpNOcE! zO?e}=XkG=%vkuNL$BM8x$!?XVj>R5`txLyOFkxy0fyYcvRKiyM$d)3vX-&1axee{r zjORl+Eexh)*M3Gnp5k2Uev;0-{@e~7NG()7A}x2p4(aViP^a2tgsfW8D&~$K<3G~+ zS!4-7i|VX7%{A2e;y9mgj&ro|#Z!)CX8!=v8ShA4*WkS|cr!c54lFI4;%GDS6_gw- zTY!{-9e;SFOAj1j46sca1}KU)5x0D`uRL4Qs>)h>)^g!8p^E3%m66>6rRqmkN4pFu zX53$-n#6U3lx9Y^gj7icRTLBRYqLyAij)Y3=&v4CNA<#$7YajmplI5HwhPl5Xm(*Q;`7h|@Gdi6m`pO-?_!PTgBHIy`fn5tH}cpXay1s@NKiujA( zeoIh6HQ3^SAwLbi!_y2Yq{~qc-CL>!I(}?PuU%}0y%LBoWa#TTORDy8LLT=W^(Bs}HU5TCVj_U1K%vWK<`Jo}aH<+2 z4<+wE9IlwZuICtpVJJ^9fc|`Y7&QTb7Pz&iNc;E_fEBEQ8nAk?r&2vOBJ-`9x~y+I zY3C=iYeQNC6!@-3ybvAKfS9Z?Zx4+8F8HHSt|0rfhM!DdND7Qh7TJrHPS|!J0W2fU zX2zpIs1#x~1uA1AcNAS?h$&c0kS3{#bn))bcKDA2H=)ZdT}$orB4SZ65paQFXqYwXCvq zo)z}MLe_-cj6G#L-J_k%zRJPbAJVqLah{tPlcCqafvsF004HWDARta~`UlltMqM>L z*q=SgP5+nZ&uTFhX>3O1=Pf0)dWLSk$OoqWgRKhLrZ7EI5vc( zZLkVWyILGnmRJd)?=go#k>pYDMGe0~b%vJOhjM5Ig1tI^7T|vXnz*mDh64(`4qFSD zOT(x=$R_8-CNP}1zmtj#wga=F0b~O#{VzLQs3Gx8B;C;Qvk?xD@RQdwa^%H41=r|H ztKR}mK7cRgiZIzOn>JbDusc=~ot(7W3g6-$39Kiy-j{?&mU^lkHHFYY6TRUuV)fH5 z+fmbz{i=xr_NGxu#y`jm9Hc7ctR_$*fHK|zGSw{sgp^P7LiKh@yX(Z zsRP??k=ZR?s4Pd+B|*EnOguBqGbrIz9GE)rXhO3F zhMv1=aE&$Bvkr3(IxC40z)$;`XQg}OwWUw{ao9H-#TMznd|gOY-AmPr^F7y)nF~FXt=y(B zXw5SNMC|*LRET;-V8O33Q3JfoDRgv}k>>cqc}0Ks%_<%uvXRxVY_>q1)GL&H?iuAUUP_wzq?i&%Y=dLdgvBnM?YO*aX4_E7FC8-t*1nNovvo|v+bwM8 zZZLH!o}YHhJ4*X&(u_eIg};qzF?Ev{r3r(W@|);mX`xpgIwDIa?3HCIKJTw&K>b=S z(T@}g)kMP`qg+Z=FG=o?zMo8xu2Qa8uy}Y>P2_Cp>*U;1qpzY-+KZ(lgd`c+Z6pzf z4_H(1fcKEm$sFgr*y&Fw`(wh~2t$@FXeEZcREWs>-heKyT7K}3*#r z7UQOouX8}s8w_x(l@AhEXg)#%2*y(B=hC z>S?Ko1vMx|VUqTBE)IumR|^UrPLp~|+9HVsAwLzN$GI4MPP+Ej5#!cDDC*_Y;lhsy z=d>OI+FNQ``jk6u-+;eCK16UNMS<=05TW%t(8M@v0ipSX{60t!DA5y{(E1XAAt7JQTzxW+SaiFil>6yY9^>SR;Kh;6lQ*&;~XPtnw=pJ>bd@{Lr) z#Qe#wTZehI`OU7JZ7>7UEPj!%IqV5zwRiEKFs@MUMqoNrZsy%l1Gr}}cHDT~;|Gq;<#5S@QNI@nh64dDwQ!Kl- z67-#kut)opVXb*9yf(F7d7ocj=;nVz|C*`HF;ax`paGFO`alO4y9L~QW_d6 zxTG2~^^u8ZIxC%ED-eu;p{bvM-x3Z;D6sCsNHPw@g^;P{c?uxWnP_`qDHT8%$wUft z7&?89T9S^vFYr)dO(knhv1K!zXVyV8c8R$z zx(U(O7iy(c0O++CWz1MKF5CD@G>o9KlUQ9oE@U1bTzfjs%=m3#|Hj=qP6z)ExufpZ zPsq>ZXD`EbPL;YZ+0pp{{N0o$e^CebR5P1pPcmNmyNIsCfeMbO;C@|(U}2(zL@Eny z`s&=sz6BnxM2h;A=Mr8X8li8Alr~nTs81-fs_v}37$?VoXYv1e-eovdf7kqOm;UZ{ zYVo7;iz40i2N3k{?;-xzLfpr50Xt4j53~q|-yXAZ))E(dIWPdwAfscg(nqEpt1 zg(zjPpXw_ps)B^UA^bv>#%}c2@-knQHC$rmrev}=-jYZJT3vM=`ygNxUT>Qsb=)WX zuA=nOC5c>{Qs_IB*vQ*0N{v*y7pJ^4!4nttWKR&8zW4-&bsA z$*WXz;rIfF(J%#o=)s#+FIE?iotij-20M2-!N|t$t#i2gS!?6>)d&~Ytqyw zC!82-+>VDCBn)qtwn>*33#_k~@kPYsUc6Vvl?l(WHq#n(qJ3Cf?T_HQ(5zbts!r5w&l zgi%gGjCd?0dDpJm+_wC+_6r+A*qxikWl>t0wbT2{udo(^I~IH_n>DZVSAJ(l#=+b9 zmZ#Y!X-rvm@b9$^3~$ARSr>(2-#$k{VvZz_Km2TU_NwghFB6GWSYU8JnO-SV3BRPt z@+l{yF!vWM2S!DH8s|Abtw`NgaJBIu?7c<|b0Mi^$ZYJB3dJ0veFAuptTH#Gj5Y%| z)^a{(@Bt*FJ7R@0+8QC)Oc)F~N249sr_vhq$&vgTsx zxE-%hYB5c#vvafVHi`|=#T z2sNh!G!4e!o3JE*XnHbJtPRoBW#QO^T_xfhD~ysp=g-UpgVX8=l4c-(N$E@6+RzFf zlpiLh(`Jq?)Wk8Fb0|ZA)@9Q{hB`?mNk=T0q+Zd8+4WIHG5;MrmT26ES>9Gj zAP(RRm8*_3X(@-w5En%z4n{sXDF>F3zIH~9RQImH?9afXvw?5mWodHL?YuQ14chNJ zV9`fdb2s3CMJHmM#eU+apctsG)_TR+5iwq9pCc`(#6&L4RJ&^AX6Ta;!_FUt+uX@? z>h6k*{=|43r1vJNi!vTna%AR@`6c4O+C;AjPXr#f@0i0y48z(leKUB63{=oN!4d;#=Bdb6OKhQbpBGM$!>*YktiW0+=h;a zo=Iu3nObM-5J(|>hlkcAs4LB4Iqw2o4J8mVjRe;$(+HXMN!FR7)CkHM5C|dzDXX~J zeCMcoeTAWuOa7Lu%y$!K&QWil7g0vwtvlN&f;Y*)NFUp+H=m^Lq7H3C4MER6Gx&5x z#qMwQ9_Zd;$&+7)Y~m2PayDNb4MS;Nca!i3OOZ$IgibTM`lpLJt|j+=}d`B`w!nT&u8fPUjc+1dT2HrJ#)PL^fd)0RHn!21Z0p+VE>MmZ z*c#|;|Je_d?h8a;5EHZsp5#|1WPdRj)p~Yyui$z@VquNxVaP zTc6fFW}E3<>ytHCJ%XoM?3rAacQ)pbp-4OH&CPZFh+j&ULcmXrN2M35qG&C=da0P| zsoBmB>*H*f#Rbo!SC;Wk6TQ|(Ly9ezo!WR*d1kI2nlEW1KeQxtN?wcmCtLm$gz6(%jK8K>{LDBSf7BVoDGh3?S#W8uetALa`JBlOk*00^{yX$4WT*>A?#C;By2go$4ZNXXr-NU(gZAaS z4!hHg7gcW6@)Sk3O(mxbJ4bz;Dr6O#e=>@+avla>6^@OFvc=?V>4e*IDfTV*a+zJt zAQ%XlrAT#&kolkBD+HF#eA5DVq_B6P!E=5(Jc|Fc_AMIu=0m&bQya)MHyxPBc^2bX zY_0VH%nk3y;Qa|bx^lqA;kOv+-=m%iRS-2UXO7IT%Zr7R0~a4t4tQ)7|Mh96w(car zMP4bNkm-`MB#^uE+iC7Y2RQD?=py+~DDx{9LyAPMDNIHeU3FmjCNJZi0E(EFJCvh2 zCz|5`6-q(fs5)^MERvfNJ0-zQoM^dFe}2t>b~Q$ktw(i;PkiNUs3vajro~!#4YxPo zvMf73WbWG+ED;%&tY4+9lMdG6H$t&IpC{MwAz6SKf}LCgwP#7A^r|(VSn~ce$)O|R z{><4ah@rr6*R&Rn<#`zm!OxaTU24iPMaN$q^{k)?(F2_FjVH_&vB_~9@=cJvdMok5 zBjqd)V6MiHaz`uda}>nql(~0oIxP2u(6U;DSyf~COAn3fk9(4w4iw0aZR;8{j@=n5 z+swZydzgl#`wU}9nzJEvK|R?IHg_}7Ikf)bA*12oK#;E`j+NOT)EmZcNiCjHibklD z*gnX9(!=xM4||g36%B$J!;Eh%Z`f~z9lMWL3fPI{_C8j>%HbwzqTs3KO+--kp~2?+ znWQs~Rd_}TPf(T4>l6b`^n*MC2{LWzOB>#1Sn`s)D=4N>*<-QiTDntQv|*Y$DYmQ+&3bMG>}kx>3jqs+M#22_gL0 zX>_F6jbl4QLFLe4$6ck2uVDFO--8Vhq~*k5>0{rA(r~VSt4|yg$}tjBLi`f+5lCgc z8#XnNa-etkj9okfu7`hvdY`r5rJX6$lPG%70UgVdzUnS4N#Z9PX>N1s6;!$E=}GCepeZ)VEjS2e6`)|#99y={#}b9$j5~(L);p$j%0D$4>M*_!{^c&OFnpUu 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
    pi|~z{c(D{t%~ToNyeF5voVz61kav6DF!9l~ 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 z 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 str: + """Normalize whitespace for robust substring checks.""" + return " ".join(value.split()) + + +@pytest.mark.asyncio +async def test_pptx_parser_callbacks_integration() -> None: + """Validate PPTX callbacks using a sample presentation asset.""" + pptx_path = Path(__file__).parent.parent / "assets" / "pptx" / "sample_presentation.pptx" + assert pptx_path.exists() + + presentation = Presentation(pptx_path.as_posix()) + + expected_notes: list[str] = [] + for slide in presentation.slides: + notes_slide = getattr(slide, "notes_slide", None) + notes_text_frame = getattr(notes_slide, "notes_text_frame", None) + text = getattr(notes_text_frame, "text", None) + if not text: + continue + text = text.strip() + if text: + expected_notes.append(text) + + expected_links: list[str] = [ + f"Link: {getattr(getattr(getattr(shape, 'click_action', None), 'hyperlink', None), 'address', None)}" + for slide in presentation.slides + for shape in slide.shapes + if not isinstance(shape, GroupShape) + and getattr(getattr(getattr(shape, "click_action", None), "hyperlink", None), "address", None) + ] + + cp = presentation.core_properties + expected_metadata_lines: list[str] = [] + for key in ["author", "title", "subject", "keywords", "category", "created", "modified"]: + value = getattr(cp, key, None) + if value is None: + continue + value_str = str(value).strip() + if value_str: + expected_metadata_lines.append(f"{key}: {value_str}") + + document = await DocumentMeta.from_local_path(pptx_path).fetch() + + parser_with = PptxDocumentParser() + elements_with = await parser_with.parse(document) + text_with = "\n".join(e.content for e in elements_with if isinstance(e, TextElement)) + images_with = [e for e in elements_with if not isinstance(e, TextElement)] + + parser_without = PptxDocumentParser(pptx_callbacks=[]) + elements_without = await parser_without.parse(document) + text_without = "\n".join(e.content for e in elements_without if isinstance(e, TextElement)) + images_without = [e for e in elements_without if not isinstance(e, TextElement)] + + assert len(images_with) == len(images_without) + assert len(text_with) >= len(text_without) + + normalized_with = _normalize_whitespace(text_with) + for note in expected_notes: + assert _normalize_whitespace(note) in normalized_with + + for link_text in expected_links: + assert link_text in text_with + assert link_text not in text_without + + for meta_line in expected_metadata_lines: + if meta_line in text_with: + assert meta_line not in text_without