
    ȯei<                       U d dl mZ d dl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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 erd d
lmZ eeedZded<    ej<                  d      ZdddddddZ ded<   dZ!ded<    e	dee         Z" ed      	 	 d(	 	 	 	 	 	 	 	 	 	 	 d)d       Z#d*dZ$e
	 	 	 d+	 	 	 	 	 	 	 	 	 	 	 d,d       Z%e
	 	 	 d+	 	 	 	 	 	 	 	 	 	 	 	 	 d-d        Z%e
	 	 	 d+	 	 	 	 	 	 	 	 	 	 	 d.d!       Z%e
	 	 	 d+	 	 	 	 	 	 	 	 	 	 	 	 	 d/d"       Z%e
	 	 d(	 	 	 	 	 	 	 	 	 d0d#       Z%e
	 	 d(	 	 	 	 	 	 	 	 	 	 	 d1d$       Z%e
	 	 d(	 	 	 	 	 	 	 	 	 	 	 d2d%       Z%e
	 	 	 d3	 	 	 	 	 	 	 	 	 	 	 d4d&       Z%	 	 	 d3d'Z%y)5    )annotationsN)TYPE_CHECKINGAnyFinalLiteralTypeVaroverload)BaseConnectionSnowflakeConnectionSnowparkConnectionSQLConnection)deprecate_obj_name)StreamlitAPIException)cache_resource)gather_metrics)secrets_singleton)	timedelta)	snowflakesnowparksqlz+Final[dict[str, type[BaseConnection[Any]]]]_FIRST_PARTY_CONNECTIONSzNo module named \'(.+)\'mysqlclientzpsycopg2-binary
sqlalchemyzsnowflake-connector-pythonzsnowflake-snowpark-python)MySQLdbpsycopg2r   r   zsnowflake.connectorzsnowflake.snowparkzFinal[dict[str, str]]_MODULES_TO_PYPI_PACKAGESzenv:r   _USE_ENV_PREFIXConnectionClass)bound
connectionc                    	 	 	 	 	 	 	 	 dd}t        |t              st        | d      t        |      j	                  dd      }|j
                   d| d| |_         t        |d|      |      } || |fi |S )ap  Create an instance of connection_class with the given name and kwargs.

    The weird implementation of this function with the @cache_resource annotated
    function defined internally is done to:
      - Always @gather_metrics on the call even if the return value is a cached one.
      - Allow the user to specify ttl and max_entries when calling st.connection.
    c                     |dd| i|S )Nconnection_name r$   )nameconnection_classkwargss      f/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/streamlit/runtime/connection_factory.py__create_connectionz/_create_connection.<locals>.__create_connectionO   s      ????    z% is not a subclass of BaseConnection!._zRunning `st.connection(...)`.)max_entriesshow_spinnerttl)r%   strr&   type[ConnectionClass]r'   r   returnr   )
issubclassr
   r   r0   replace__qualname__r   )r%   r&   r-   r/   r'   r)   ttl_strs          r(   _create_connectionr7   ?   s     @@%:@FI@	@
 &7#  EF
 	
 #hSG ++
,AgYa}E $.4 	 t%5@@@r*   c                N    | t         v r	t         |    S t        d|  dt                )NzInvalid connection 'z!'. Supported connection classes: )r   r   )r&   s    r(   _get_first_party_connectionr9   k   s>    33'(899

/0 1))A(B	D r*   c                     y Nr$   r%   r-   r/   
autocommitr'   s        r(   connection_factoryr>   u        	r*   c                     y r;   r$   r%   typer-   r/   r=   r'   s         r(   r>   r>           	r*   c                     y r;   r$   r<   s        r(   r>   r>      r?   r*   c                     y r;   r$   rA   s         r(   r>   r>      rC   r*   c                     y r;   r$   )r%   r-   r/   r'   s       r(   r>   r>      s     	r*   c                     y r;   r$   r%   rB   r-   r/   r'   s        r(   r>   r>      r?   r*   c                     y r;   r$   rH   s        r(   r>   r>      r?   r*   c                     y r;   r$   rH   s        r(   r>   r>      r?   r*   c                "   | j                  t              r(| j                  t              }t        j                  |   } |}|7| t
        v rt        |       }n#t        j                          t        d   |    d   }t        |t              rad|v rR|j                  d      }|j                         }ddl}	|	j                  dj                  |            }
t!        |
|      }nt        |      }	 t#        | |f||d|}t        |t$              rt'        |ddd	      }|S # t(        $ rj}t        |      }t+        j,                  t.        |      }d
}|r,t0        j3                  |j5                  d            }|rd| d}t)        | d|       d}~ww xY w)a3  Create a new connection to a data store or API, or return an existing one.

    Configuration options, credentials, and secrets for connections are
    combined from the following sources:

    - The keyword arguments passed to this command.
    - The app's ``secrets.toml`` files.
    - Any connection-specific configuration files.

    The connection returned from ``st.connection`` is internally cached with
    ``st.cache_resource`` and is therefore shared between sessions.

    Parameters
    ----------
    name : str
        The connection name used for secrets lookup in ``secrets.toml``.
        Streamlit uses secrets under ``[connections.<name>]`` for the
        connection. ``type`` will be inferred if ``name`` is one of the
        following: ``"snowflake"``, ``"snowpark"``, or ``"sql"``.

    type : str, connection class, or None
        The type of connection to create. This can be one of the following:

        - ``None`` (default): Streamlit will infer the connection type from
          ``name``. If the type is not inferable from ``name``, the type must
          be specified in ``secrets.toml`` instead.
        - ``"snowflake"``: Streamlit will initialize a connection with
          |SnowflakeConnection|_.
        - ``"snowpark"``: Streamlit will initialize a connection with
          |SnowparkConnection|_. This is deprecated.
        - ``"sql"``: Streamlit will initialize a connection with
          |SQLConnection|_.
        - A string path to an importable class: This must be a dot-separated
          module path ending in the importable class. Streamlit will import the
          class and initialize a connection with it. The class must extend
          ``st.connections.BaseConnection``.
        - An imported class reference: Streamlit will initialize a connection
          with the referenced class, which must extend
          ``st.connections.BaseConnection``.

        .. |SnowflakeConnection| replace:: ``SnowflakeConnection``
        .. _SnowflakeConnection: https://docs.streamlit.io/develop/api-reference/connections/st.connections.snowflakeconnection
        .. |SnowparkConnection| replace:: ``SnowparkConnection``
        .. _SnowparkConnection: https://docs.streamlit.io/develop/api-reference/connections/st.connections.snowparkconnection
        .. |SQLConnection| replace:: ``SQLConnection``
        .. _SQLConnection: https://docs.streamlit.io/develop/api-reference/connections/st.connections.sqlconnection

    max_entries : int or None
        The maximum number of connections to keep in the cache.
        If this is ``None`` (default), the cache is unbounded. Otherwise, when
        a new entry is added to a full cache, the oldest cached entry is
        removed.
    ttl : float, timedelta, or None
        The maximum number of seconds to keep results in the cache.
        If this is ``None`` (default), cached results do not expire with time.
    **kwargs : any
        Connection-specific keyword arguments that are passed to the
        connection's ``._connect()`` method. ``**kwargs`` are typically
        combined with (and take precedence over) key-value pairs in
        ``secrets.toml``. To learn more, see the specific connection's
        documentation.

    Returns
    -------
    Subclass of BaseConnection
        An initialized connection object of the specified ``type``.

    Examples
    --------
    **Example 1: Inferred connection type**

    The easiest way to create a first-party (SQL, Snowflake, or Snowpark) connection is
    to use their default names and define corresponding sections in your ``secrets.toml``
    file. The following example creates a ``"sql"``-type connection.

    ``.streamlit/secrets.toml``:

    >>> [connections.sql]
    >>> dialect = "xxx"
    >>> host = "xxx"
    >>> username = "xxx"
    >>> password = "xxx"

    Your app code:

    >>> import streamlit as st
    >>> conn = st.connection("sql")

    **Example 2: Named connections**

    Creating a connection with a custom name requires you to explicitly
    specify the type. If ``type`` is not passed as a keyword argument, it must
    be set in the appropriate section of ``secrets.toml``. The following
    example creates two ``"sql"``-type connections, each with their own
    custom name. The first defines ``type`` in the ``st.connection`` command;
    the second defines ``type`` in ``secrets.toml``.

    ``.streamlit/secrets.toml``:

    >>> [connections.first_connection]
    >>> dialect = "xxx"
    >>> host = "xxx"
    >>> username = "xxx"
    >>> password = "xxx"
    >>>
    >>> [connections.second_connection]
    >>> type = "sql"
    >>> dialect = "yyy"
    >>> host = "yyy"
    >>> username = "yyy"
    >>> password = "yyy"

    Your app code:

    >>> import streamlit as st
    >>> conn1 = st.connection("first_connection", type="sql")
    >>> conn2 = st.connection("second_connection")

    **Example 3: Using a path to the connection class**

    Passing the full module path to the connection class can be useful,
    especially when working with a custom connection. Although this is not the
    typical way to create first party connections, the following example
    creates the same type of connection as one with ``type="sql"``. Note that
    ``type`` is a string path.

    ``.streamlit/secrets.toml``:

    >>> [connections.my_sql_connection]
    >>> url = "xxx+xxx://xxx:xxx@xxx:xxx/xxx"

    Your app code:

    >>> import streamlit as st
    >>> conn = st.connection(
    ...     "my_sql_connection", type="streamlit.connections.SQLConnection"
    ... )

    **Example 4: Importing the connection class**

    You can pass the connection class directly to the ``st.connection``
    command. Doing so allows static type checking tools such as ``mypy`` to
    infer the exact return type of ``st.connection``. The following example
    creates the same connection as in Example 3.

    ``.streamlit/secrets.toml``:

    >>> [connections.my_sql_connection]
    >>> url = "xxx+xxx://xxx:xxx@xxx:xxx/xxx"

    Your app code:

    >>> import streamlit as st
    >>> from streamlit.connections import SQLConnection
    >>> conn = st.connection("my_sql_connection", type=SQLConnection)

    NconnectionsrB   r+   r   )r-   r/   zconnection("snowpark")zconnection("snowflake")z
2024-04-01z@You may be missing a dependency required to use this connection.   zYou need to install the 'z!' package to use this connection.z. )
startswithr   removeprefixosenvironr   r9   r   load_if_toml_exists
isinstancer0   splitpop	importlibimport_modulejoingetattrr7   r   r   ModuleNotFoundErrorresearch_MODULE_EXTRACTION_REGEXr   getgroup)r%   rB   r-   r/   r'   envvar_namer&   parts	classnamerV   connection_moduleconne
err_stringmissing_module
extra_infopypi_packages                    r(   r>   r>      s   J '''8zz+&
 ++  ;4@ 1130?EfM"C(
 ""$**3/E		I ) 7 7 H&'8)D:;KL8!"
0;
HN
 d./%()	D  
8V
#;ZHW
4889M9Ma9PQL8Fgh
!QCr*"677
8s   +/D 	F$A%F		F)NN)r%   r0   r&   r1   r-   
int | Noner/   float | timedelta | Noner'   r   r2   r   )r&   r0   r2   ztype[BaseConnection[Any]])NNF)r%   Literal['sql']r-   rj   r/   rk   r=   boolr'   r   r2   r   )r%   r0   rB   rl   r-   rj   r/   rk   r=   rm   r'   r   r2   r   )r%   Literal['snowflake']r-   rj   r/   rk   r=   rm   r'   r   r2   r   )r%   r0   rB   rn   r-   rj   r/   rk   r=   rm   r'   r   r2   r   )
r%   Literal['snowpark']r-   rj   r/   rk   r'   r   r2   r   )r%   r0   rB   ro   r-   rj   r/   rk   r'   r   r2   r   )r%   r0   rB   r1   r-   rj   r/   rk   r'   r   r2   r   )NNN)r%   r0   rB   z
str | Noner-   rj   r/   rk   r'   r   r2   zBaseConnection[Any])&
__future__r   rP   r[   typingr   r   r   r   r   r	   streamlit.connectionsr
   r   r   r   streamlit.deprecation_utilr   streamlit.errorsr   streamlit.runtime.cachingr   streamlit.runtime.metrics_utilr   streamlit.runtime.secretsr   datetimer   r   __annotations__compiler]   r   r   r   r7   r9   r>   r$   r*   r(   <module>r{      s   # 	 	 H H  : 2 4 9 7" %"I E 
 &2::&AB !-754 0    
 +>#3FG  #$(	(A
(A+(A (A 
"	(A
 (A (A (AV 
 #$(		
		 
"	 		
 	 	 
	 
 #$(	
	
	 	 
"		
 	 	 	 
	 
 #$(		
		 
"	 		
 	 	 
	 
 #$(	
	
	 	 
"		
 	 	 	 
	 
 #$(	
		 
"	 		
 	 
	 
 #$(		
	
	 	 
"		
 	 	 
	 
 #$(		
	
	 	 
"		
 	 	 
	 
 "$(		
	
	 	 
"		
 	 	 
	 
	c8r*   