
    g<                       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 ej:                  d      Zddddd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#	 	 	 	 	 	 	 d+d       Z$e
	 	 d#	 	 	 	 	 	 	 	 	 d,d       Z$e
	 	 d#	 	 	 	 	 	 	 	 	 d-d        Z$e
	 	 	 d.	 	 	 	 	 	 	 	 	 d/d!       Z$	 	 	 d.d"Z$y)0    )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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_PACKAGES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      Y/var/www/openai/venv/lib/python3.12/site-packages/streamlit/runtime/connection_factory.py__create_connectionz/_create_connection.<locals>.__create_connectionN   s      ????    z% is not a subclass of BaseConnection!._zRunning `st.connection(...)`.)max_entriesshow_spinnerttl)r#   strr$   type[ConnectionClass]returnr   )
issubclassr
   r   r.   replace__qualname__r   )r#   r$   r+   r-   r%   r'   ttl_strs          r&   _create_connectionr5   >   s     @@%:@	@
 &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: )FIRST_PARTY_CONNECTIONSr   )r$   s    r&   _get_first_party_connectionr8   j   s>    22&'788

/0 1))@(A	C r(   c                     y Nr"   r#   r+   r-   
autocommitr%   s        r&   connection_factoryr=   t        	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"   r@   s         r&   r=   r=      rB   r(   c                     y r:   r"   )r#   r+   r-   r%   s       r&   r=   r=      s     	r(   c                     y r:   r"   r#   rA   r+   r-   r%   s        r&   r=   r=      r>   r(   c                     y r:   r"   rG   s        r&   r=   r=      r>   r(   c                     y r:   r"   rG   s        r&   r=   r=      r>   r(   c                "   d}| j                  |      r!| t        |      d }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&        $ rs}t        |      }t)        j*                  t,        |      }d}|r,t.        j1                  |j3                  d            }|rd| d}t'        t        |       d|       d}~ww xY w)a6  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 inferrable 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 precendence 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)

    zenv:NconnectionsrA   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. )
startswithlenosenvironr7   r8   r   load_if_toml_exists
isinstancer.   splitpop	importlibimport_modulejoingetattrr5   r   r   ModuleNotFoundErrorresearchMODULE_EXTRACTION_REGEXr   getgroup)r#   rA   r+   r-   r%   USE_ENV_PREFIXenvvar_namer$   parts	classnamerU   connection_moduleconne
err_stringmissing_module
extra_infopypi_packages                     r&   r=   r=      s   J N~& 3~.01zz+&|** /t4D 113$]3D9&AD
 "C(
 ""$**3/E		I ) 7 7 H&'8)D:;KL=!"
0;
HN
 d./%()	D  
=V
#:JGW
3778L8LQ8OPL8Fgh
!SVHBzl";<<
=s   "/D 	FA.F		F)NN)
r#   r.   r$   r/   r+   
int | Noner-   float | timedelta | Noner0   r   )r$   r.   )NNF)
r#   Literal['sql']r+   rj   r-   rk   r<   boolr0   r   )r#   r.   rA   rl   r+   rj   r-   rk   r<   rm   r0   r   )
r#   Literal['snowflake']r+   rj   r-   rk   r<   rm   r0   r   )r#   r.   rA   rn   r+   rj   r-   rk   r<   rm   r0   r   )r#   Literal['snowpark']r+   rj   r-   rk   r0   r   )
r#   r.   rA   ro   r+   rj   r-   rk   r0   r   )
r#   r.   rA   r/   r+   rj   r-   rk   r0   r   )NNN)
r#   r.   rA   z
str | Noner+   rj   r-   rk   r0   zBaseConnection[Any])%
__future__r   rO   rZ   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   r7   compiler\   r   __annotations__r   r5   r8   r=   r"   r(   r&   <module>r{      sj   # 	 	 H H  : 2 4 9 7" %" 
 %"**%@A !-753 /  +>#3FG  #$(	(A
(A+(A (A 
"	(A (A (AV 
 #$(		
		 
"	 		 	 
	 
 #$(	
	
	 	 
"		
 	 	 
	 
 #$(		
		 
"	 		 	 
	 
 #$(	
	
	 	 
"		
 	 	 
	 
 #$(	
		 
"	
 	 
	 
 #$(		
	
	 	 
"		 	 
	 
 #$(		
	
	 	 
"		 	 
	 
 "$(		
	
	 	 
"		 	 
	 
	g=r(   