
    4i?Y                       U d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZmZ d d	lmZmZ d d
l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& d dl'm(Z) d dl*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6 erd dl7m8Z8 d dl9m:Z: e6e5z  e;e6e5z     z  dz  Z<de=d<   e>ed   z  Z?de=d<   	 	 	 	 ddZ@e G d d             ZA G d d      ZBy)     )annotations)	dataclass)dedent)TYPE_CHECKINGLiteral	TypeAliascastoverload)config)enforce_filename_restrictionnormalize_upload_file_type)current_form_id)LayoutConfigWidthWithoutContentvalidate_width)check_widget_policiesmaybe_raise_label_warnings)KeyLabelVisibilitycompute_and_register_element_id get_label_visibility_proto_valueto_key)StreamlitAPIException)FileUploaderState)UploadedFileInfo)FileUploader)gather_metrics)ScriptRunContextget_script_run_ctx)
WidgetArgsWidgetCallbackWidgetKwargsregister_widget)DeletedFileUploadedFile)Sequence)DeltaGeneratorNr   SomeUploadedFiles	directoryAcceptMultipleFilesc                   | g S t               }|g S | j                  }t        |      dk(  rg S |j                  j	                  |j
                  |D cg c]  }|j                   c}      }|D ci c]  }|j                  | }}g }|D ]k  }|j                  |j                        }|(t        ||j                        }|j                  |       H|j                  t        |j                               m |S c c}w c c}w )Nr   )
session_idfile_ids)r   uploaded_file_infolenuploaded_file_mgr	get_filesr,   file_idgetr%   	file_urlsappendr$   )	widget_valuectxr.   ffile_recs_list	file_recscollected_filesmaybe_file_recuploaded_files	            r/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/streamlit/elements/widgets/file_uploader.py_get_upload_filesr?   I   s    	

C
{	%88
!#	**44>>%78!))8 5 N
 (66!A6I68:O ;"qyy1%(EM""=1"";qyy#9:;  9 7s   C<
2Dc                  6    e Zd ZU ded<   dZded<   ddZd	dZy)
FileUploaderSerder*   accept_multiple_filesNzSequence[str] | Noneallowed_typesc                &   t        |      }|D ]@  }t        |t              r| j                  s!t	        |j
                  | j                         B | j                  du xs | j                  dk(  }t        |      dk(  r
|rg }|S d }|S |r|n|d   }|S )NTr)   r   )r?   
isinstancer$   rC   r   namerB   r/   )selfui_valueupload_filesfileis_multiple_or_directoryreturn_values         r>   deserializezFileUploaderSerde.deserializep   s    (2  	LD$,!!,TYY8J8JK	L &&$. 9))[8 	!
 |!4LbL  SWL  ,D<VWL    c                \   t               }|s|S t        |t              s|g}|D ]  }t        |t              r|j                  j                         }|j                  |_        |j                  |_        |j                  |_        |j                  j                  |j                          |S N)FileUploaderStateProtorE   listr$   r.   addr2   rF   sizer4   CopyFrom
_file_urls)rG   filesstate_protor8   	file_infos        r>   	serializezFileUploaderSerde.serialize   s    ,.%&GE 	7A![)/:/M/M/Q/Q/SI !		IVVINVVIN((6	7 rN   )rH   FileUploaderStateProto | Nonereturnr(   )rW   r(   r\   rQ   )__name__
__module____qualname____annotations__rC   rM   rZ    rN   r>   rA   rA   k   s    ..*.M'.,rN   rA   c                  Z   e Zd Ze	 	 	 	 	 dddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zeddddddddddd
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd	       Zedddddddddddd
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z ed      	 	 	 	 	 	 	 dddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	 	 	 	 	 	 	 ddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zy)FileUploaderMixinNFvisiblestretch)max_upload_sizedisabledlabel_visibilitywidthc	                    y rP   ra   rG   labeltyperB   keyhelp	on_changeargskwargsrf   rg   rh   ri   s                r>   file_uploaderzFileUploaderMixin.file_uploader         !rN   c	                    y rP   ra   rk   s                r>   rs   zFileUploaderMixin.file_uploader         "rN   )
rm   rn   ro   rp   rq   rr   rf   rg   rh   ri   c                    y rP   ra   rG   rl   rB   rm   rn   ro   rp   rq   rr   rf   rg   rh   ri   s                r>   rs   zFileUploaderMixin.file_uploader   rt   rN   )rB   rm   rn   ro   rp   rq   rr   rf   rg   rh   ri   c                    y rP   ra   rx   s                r>   rs   zFileUploaderMixin.file_uploader   rv   rN   rs   c	               R    t               }| j                  |||	|||||||
|||      S )aC   Display a file uploader widget.

        By default, uploaded files are limited to 200 MB each. You can
        configure this globally using the ``server.maxUploadSize`` configuration
        option. For more information on how to set configuration options, see
        |config.toml|_. Additionally, you can set a per-widget limit using the
        ``max_upload_size`` parameter.

        .. |config.toml| replace:: ``config.toml``
        .. _config.toml: https://docs.streamlit.io/develop/api-reference/configuration/config.toml

        Parameters
        ----------
        label : str
            A short label explaining to the user what this file uploader is for.
            The label can optionally contain GitHub-flavored Markdown of the
            following types: Bold, Italics, Strikethroughs, Inline Code, Links,
            and Images. Images display like icons, with a max height equal to
            the font height.

            Unsupported Markdown elements are unwrapped so only their children
            (text contents) render. Display unsupported elements as literal
            characters by backslash-escaping them. E.g.,
            ``"1\. Not an ordered list"``.

            See the ``body`` parameter of |st.markdown|_ for additional,
            supported Markdown directives.

            For accessibility reasons, you should never set an empty label, but
            you can hide it with ``label_visibility`` if needed. In the future,
            we may disallow empty labels by raising an exception.

            .. |st.markdown| replace:: ``st.markdown``
            .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown

        type : str, list of str, or None
            The allowed file extension(s) for uploaded files. This can be one
            of the following types:

            - ``None`` (default): All file extensions are allowed.
            - A string: A single file extension is allowed. For example, to
              only accept CSV files, use ``"csv"``.
            - A sequence of strings: Multiple file extensions are allowed. For
              example, to only accept JPG/JPEG and PNG files, use
              ``["jpg", "jpeg", "png"]``.

            .. note::
                This is a best-effort check, but doesn't provide a
                security guarantee against users uploading files of other types
                or type extensions. The correct handling of uploaded files is
                part of the app developer's responsibility.

        max_upload_size : int or None
            The maximum allowed size of each uploaded file in megabytes.

            If this is ``None`` (default), the maximum file size is set by the
            ``server.maxUploadSize`` configuration option in your
            ``config.toml`` file. If this is an integer, it must be positive
            and will override the ``server.maxUploadSize`` configuration option.

        accept_multiple_files : bool or "directory"
            Whether to accept more than one file in a submission. This can be one
            of the following values:

            - ``False`` (default): The user can only submit one file at a time.
            - ``True``: The user can upload multiple files at the same time.
            - ``"directory"``: The user can select a directory to upload all
              files in the directory and its subdirectories. If ``type`` is
              set, only files matching those type(s) will be uploaded.

            When this is ``True`` or ``"directory"``, the return value will be
            a list and a user can additively select files if they click the
            browse button on the widget multiple times.

        key : str or int
            An optional string or integer to use as the unique key for the widget.
            If this is omitted, a key will be generated for the widget
            based on its content. No two widgets may have the same key.

        help : str or None
            A tooltip that gets displayed next to the widget label. Streamlit
            only displays the tooltip when ``label_visibility="visible"``. If
            this is ``None`` (default), no tooltip is displayed.

            The tooltip can optionally contain GitHub-flavored Markdown,
            including the Markdown directives described in the ``body``
            parameter of ``st.markdown``.

        on_change : callable
            An optional callback invoked when this file_uploader's value
            changes.

        args : list or tuple
            An optional list or tuple of args to pass to the callback.

        kwargs : dict
            An optional dict of kwargs to pass to the callback.

        disabled : bool
            An optional boolean that disables the file uploader if set to
            ``True``. The default is ``False``.

        label_visibility : "visible", "hidden", or "collapsed"
            The visibility of the label. The default is ``"visible"``. If this
            is ``"hidden"``, Streamlit displays an empty spacer instead of the
            label, which can help keep the widget aligned with other widgets.
            If this is ``"collapsed"``, Streamlit displays no label or spacer.

        width : "stretch" or int
            The width of the file uploader widget. This can be one of the
            following:

            - ``"stretch"`` (default): The width of the widget matches the
              width of the parent container.
            - An integer specifying the width in pixels: The widget has a
              fixed width. If the specified width is greater than the width of
              the parent container, the width of the widget matches the width
              of the parent container.

        Returns
        -------
        None, UploadedFile, or list of UploadedFile
            - If accept_multiple_files is ``False``, returns either ``None`` or
              an ``UploadedFile`` object.
            - If accept_multiple_files is ``True`` or ``"directory"``, returns
              a list with the uploaded files as ``UploadedFile`` objects. If no
              files were uploaded, returns an empty list.

            The ``UploadedFile`` class is a subclass of ``BytesIO``, and
            therefore is "file-like". This means you can pass an instance of it
            anywhere a file is expected.

        Examples
        --------
        **Example 1: Accept a single file at a time**

        >>> import streamlit as st
        >>> import pandas as pd
        >>> from io import StringIO
        >>>
        >>> uploaded_file = st.file_uploader("Choose a file")
        >>> if uploaded_file is not None:
        ...     # To read file as bytes:
        ...     bytes_data = uploaded_file.getvalue()
        ...     st.write(bytes_data)
        >>>
        ...     # To convert to a string based IO:
        ...     stringio = StringIO(uploaded_file.getvalue().decode("utf-8"))
        ...     st.write(stringio)
        >>>
        ...     # To read file as string:
        ...     string_data = stringio.read()
        ...     st.write(string_data)
        >>>
        ...     # Can be used wherever a "file-like" object is accepted:
        ...     dataframe = pd.read_csv(uploaded_file)
        ...     st.write(dataframe)

        **Example 2: Accept multiple files at a time**

        >>> import pandas as pd
        >>> import streamlit as st
        >>>
        >>> uploaded_files = st.file_uploader(
        ...     "Upload data", accept_multiple_files=True, type="csv"
        ... )
        >>> for uploaded_file in uploaded_files:
        ...     df = pd.read_csv(uploaded_file)
        ...     st.write(df)

        .. output::
           https://doc-file-uploader.streamlit.app/
           height: 375px

        **Example 3: Accept an entire directory**

        >>> import streamlit as st
        >>>
        >>> uploaded_files = st.file_uploader(
        ...     "Upload images", accept_multiple_files="directory", type=["jpg", "png"]
        ... )
        >>> for uploaded_file in uploaded_files:
        ...     st.image(uploaded_file)

        .. output::
           https://doc-file-uploader-directory.streamlit.app/
           height: 375px

        )rl   rm   rf   rB   rn   ro   rp   rq   rr   rg   rh   ri   r7   )r   _file_uploader)rG   rl   rm   rB   rn   ro   rp   rq   rr   rf   rg   rh   ri   r7   s                 r>   rs   zFileUploaderMixin.file_uploader   sL    \ !"""+"7- # 
 	
rN   )rf   rh   rg   r7   ri   c	               :   t        |      }|	 t        |	t              r|	dk  rt        d      t	        | j
                  ||d d       t        ||
       t        d||	h d| j
                  |||||
      }|rt        |      nd }t               }||_
        ||_        ||ng |j                  d d  |	|	|_        nt        j                  d      |_        |d	k(  }|d
u xs ||_        ||_        t%        | j
                        |_        ||_        t+        |
      |j,                  _        |t1        |      |_        t5        ||      }t7        |j                  ||||j8                  |j:                  |d      }t=        |       t?        |      }| j
                  jA                  d||       t        |j.                  tB              ry t        |j.                  tD              r+|j.                  D cg c]  }t        |tB              r| c}S |j.                  S c c}w )Nr   zThe `max_upload_size` parameter must be a positive integer representing the maximum file size in megabytes, or None to fall back to the `server.maxUploadSize` configuration option.F)default_valuewrites_allowedrs   >   rm   rf   rB   )	user_keyrf   key_as_main_identitydgrl   rm   rB   ro   ri   zserver.maxUploadSizer)   T)rC   file_uploader_state_value)on_change_handlerrq   rr   deserializer
serializerr7   
value_type)ri   )layout_config)#r   rE   intr   r   r   r   r   r   FileUploaderProtoidrl   rm   max_upload_size_mbr   
get_optionmultiple_filesaccept_directoryr   form_idrg   r   rh   valuer   ro   rA   r#   rM   rZ   r   r   _enqueuer$   rR   )rG   rl   rm   rB   rn   ro   rp   rq   rr   rf   rh   rg   r7   ri   
element_idnormalized_typefile_uploader_protois_directory_uploadserdewidget_stater   r8   s                         r>   r{   z FileUploaderMixin._file_uploader  sB   " Sk &?C0Oq4H'S  	GG 	
 	#5*:;4+
 "Vww"7

" ?C4T:/1!+$)!.:O 	  # &5D25;5F5F&62
 4{B!T)@-@ 	* 0C,&5dgg&>#'/$5U6
,,2 '-d|$!"7W
 '""'**2	
 	u$510 	 	
 l((+6l(($/+11T!A{9SATT!!! Us   /HHc                    t        d|       S )zGet our DeltaGenerator.r'   )r	   )rG   s    r>   r   zFileUploaderMixin.dgM  s     $d++rN   )NNNNN)rl   strrm   str | Sequence[str] | NonerB   Literal[True, 'directory']rn   
Key | Nonero   
str | Nonerp   WidgetCallback | Nonerq   WidgetArgs | Nonerr   WidgetKwargs | Nonerf   
int | Nonerg   boolrh   r   ri   r   r\   list[UploadedFile])FNNNNN)rl   r   rm   r   rB   Literal[False]rn   r   ro   r   rp   r   rq   r   rr   r   rf   r   rg   r   rh   r   ri   r   r\   UploadedFile | None)rl   r   rB   r   rm   r   rn   r   ro   r   rp   r   rq   r   rr   r   rf   r   rg   r   rh   r   ri   r   r\   r   )rl   r   rB   r   rm   r   rn   r   ro   r   rp   r   rq   r   rr   r   rf   r   rg   r   rh   r   ri   r   r\   r   )NFNNNNN)rl   r   rm   r   rB   r*   rn   r   ro   r   rp   r   rq   r   rr   r   rf   r   rg   r   rh   r   ri   r   r\   (UploadedFile | list[UploadedFile] | None)rl   r   rm   r   rB   r*   rn   r   ro   r   rp   r   rq   r   rr   r   rf   r   rh   r   rg   r   r7   zScriptRunContext | Noneri   r   r\   r   )r\   r'   )	r]   r^   r_   r
   rs   r   r{   propertyr   ra   rN   r>   rc   rc      s     +/"&&*! '+,5%.!! )!  :	!
 ! ! )!  ! $! $! ! *! #! 
! !& 
 16+/"&&*" '+,5%."" )"  .	"
 " " )"  " $" $" " *" #" 
" "0  ,0+/"&&*&*,5%.!!  :	!
 )! ! ! )!  ! $! $! ! *! #! 
! !& 
 16+/+/"&&*&*,5%.""  .	"
 )" " " )"  " $" $" " *" #" 
" "" O$ ,05:+/"&&*\
 '+,5%.\
\
 )\
  3	\

 \
 \
 )\
  \
 $\
 $\
 \
 *\
 #\
 
2\
 %\
B ,05:+/"&&*q" '+,5'+%.q"q" )q"  3	q"
 q" q" )q"  q" $q" $q" *q" q" %q" #q"  
2!q"f , ,rN   rc   )r6   r[   r\   z list[UploadedFile | DeletedFile])C
__future__r   dataclassesr   textwrapr   typingr   r   r   r	   r
   	streamlitr   *streamlit.elements.lib.file_uploader_utilsr   r   !streamlit.elements.lib.form_utilsr   #streamlit.elements.lib.layout_utilsr   r   r   streamlit.elements.lib.policiesr   r   streamlit.elements.lib.utilsr   r   r   r   r   streamlit.errorsr   streamlit.proto.Common_pb2r   rQ   r   UploadedFileInfoProto streamlit.proto.FileUploader_pb2r   r   streamlit.runtime.metrics_utilr   streamlit.runtime.scriptrunnerr   r   streamlit.runtime.stater    r!   r"   r#   'streamlit.runtime.uploaded_file_managerr$   r%   collections.abcr&   streamlit.delta_generatorr'   rR   r(   r`   r   r*   r?   rA   rc   ra   rN   r>   <module>r      s    # !  D D  > 
  3 R P N 9 O  N(8 ;l[&@!AADH 9  "&(<!< Y </%D + + +\v, v,rN   