U
    h                     @  s   d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZ ddlmZ erdd	lmZmZ eeZG d
d deZdS )zLoads data from OneDrive    )annotationsN)TYPE_CHECKINGIteratorListOptionalSequenceUnion)Document)Field)O365BaseLoader	_FileType)
get_parser)DriveFolderc                   @  s|   e Zd ZU dZedZded< dZded< dZded	< e	d
dddZ
e	ddddZdddddZddddZdS )OneDriveLoaderzLoad from `Microsoft OneDrive`..strdrive_idNzOptional[str]folder_pathzOptional[List[str]]
object_idszSequence[_FileType])returnc                 C  s   t jt jt jfS )zReturn supported file types.)r   ZDOCZDOCXZPDFself r   Q/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/document_loaders/onedrive.py_file_types!   s    zOneDriveLoader._file_typesz	List[str]c                 C  s   ddgS )zReturn required scopes.Zoffline_accesszFiles.Read.Allr   r   r   r   r   _scopes&   s    zOneDriveLoader._scopesr   zUnion[Folder, Drive])driver   c              
     s   |}| j dkr|S dd | j dD }t|dkr8|S | }|D ]T z&tt fdd|d }| }W qD ttfk
r   td	| j Y qDX qD|S )	a  
        Returns the folder or drive object located at the
        specified path relative to the given drive.

        Args:
            drive (Drive): The root drive from which the folder path is relative.

        Returns:
            Union[Folder, Drive]: The folder or drive object
            located at the specified path.

        Raises:
            FileNotFoundError: If the path does not exist.
        Nc                 S  s   g | ]}|d kr|qS ) r   ).0fr   r   r   
<listcomp>?   s      z8OneDriveLoader._get_folder_from_path.<locals>.<listcomp>/r   c                   s
    | j kS )N)name)xZ	subfolderr   r   <lambda>F       z6OneDriveLoader._get_folder_from_path.<locals>.<lambda>zPath {} not exist.)
r   splitlenZ	get_itemslistfilter
IndexErrorAttributeErrorFileNotFoundErrorformat)r   r   Zsubfolder_driveZ
subfoldersitemsr   r$   r   _get_folder_from_path+   s    
z$OneDriveLoader._get_folder_from_pathzIterator[Document]c                 c  s   zddl m} W n tk
r,   tdY nX |   | j}t||s^td| j dt	d}| j
r| |}| |D ]}||E dH  q| jr| || jD ]}||E dH  qdS )z>Load documents lazily. Use this when working at a large scale.r   )r   zAO365 package not found, please install it with `pip install o365`zThere isn't a Drive with id .defaultN)
O365.driver   ImportErrorZ_authZstorageZ	get_driver   
isinstance
ValueErrorr   r   r0   Z_load_from_folderZ
lazy_parser   Z_load_from_object_ids)r   r   r   Zblob_parserfolderZblobr   r   r   	lazy_loadL   s"    


zOneDriveLoader.lazy_load)__name__
__module____qualname____doc__r
   r   __annotations__r   r   propertyr   r   r0   r8   r   r   r   r   r      s   
!r   )r<   
__future__r   loggingtypingr   r   r   r   r   r   Zlangchain_core.documentsr	   Zlangchain_core.pydantic_v1r
   Z.langchain_community.document_loaders.base_o365r   r   Z5langchain_community.document_loaders.parsers.registryr   r3   r   r   	getLoggerr9   loggerr   r   r   r   r   <module>   s    
