
    5iD                    \   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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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-	 	 	 	 	 	 	 	 	 	 	 d0d!       Z&e
	 	 	 d-	 	 	 	 	 	 	 	 	 	 	 	 	 d1d"       Z&e
	 	 	 d-	 	 	 	 	 	 	 	 	 	 	 d2d#       Z&e
	 	 	 d-	 	 	 	 	 	 	 	 	 	 	 	 	 d3d$       Z&e
	 	 d*	 	 	 	 	 	 	 	 	 d4d%       Z&e
	 	 d*	 	 	 	 	 	 	 	 	 	 	 d5d&       Z&e
	 	 d*	 	 	 	 	 	 	 	 	 	 	 d6d'       Z&e
	 	 	 d7	 	 	 	 	 	 	 	 	 	 	 d8d(       Z&	 	 	 d7d)Z&y)9    )annotationsN)TYPE_CHECKINGAnyFinalLiteralTypeVaroverload)BaseConnection SnowflakeCallersRightsConnectionSnowflakeConnectionSnowparkConnectionSQLConnection)deprecate_obj_name)StreamlitAPIException)cache_resource)gather_metrics)secrets_singleton)	timedelta)	snowflakezsnowflake-callers-rights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                R   	 	 	 	 	 	 	 	 dd}t        |t              st        | d      t        |      j	                  dd      }|j
                   d| d| |_        |j                         }|dvrt        d| d| d      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      n/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/streamlit/runtime/connection_factory.py__create_connectionz/_create_connection.<locals>.__create_connectionQ   s      ????    z% is not a subclass of BaseConnection!._)globalsessionzConnection class z has scope 'z*'. Valid values are 'global' or 'session'.c                $    | j                          y N)close)r!   s    r)   on_release_wrappedz._create_connection.<locals>.on_release_wrappedl   s    r+   zRunning `st.connection(...)`.)max_entriesshow_spinnerttlscope
on_release)r&   strr'   type[ConnectionClass]r(   r   returnr   )r!   r   r;   None)
issubclassr
   r   r9   replace__qualname__r7   r   )	r&   r'   r4   r6   r(   r*   ttl_strr7   r3   s	            r)   _create_connectionrA   A   s    @@%:@FI@	@
 &7#  EF
 	
 #hSG ++
,AgYa}E $ ""$E))# 01eW 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_connectionrC   z   s>    33'(899

/0 1))A(B	D r+   c                     y r1   r%   r&   r4   r6   
autocommitr(   s        r)   connection_factoryrG           	r+   c                     y r1   r%   r&   typer4   r6   rF   r(   s         r)   rG   rG           	r+   c                     y r1   r%   rE   s        r)   rG   rG      rH   r+   c                     y r1   r%   rJ   s         r)   rG   rG      rL   r+   c                     y r1   r%   rE   s        r)   rG   rG      rH   r+   c                     y r1   r%   rJ   s         r)   rG   rG      rL   r+   c                     y r1   r%   )r&   r4   r6   r(   s       r)   rG   rG      s     	r+   c                     y r1   r%   r&   rK   r4   r6   r(   s        r)   rG   rG      rH   r+   c                     y r1   r%   rS   s        r)   rG   rG      rH   r+   c                     y r1   r%   rS   s        r)   rG   rG      rH   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)aw  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``. Connection types with a scope of ``"global"`` will be 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|_.
        - ``"snowflake-callers-rights"``: Streamlit will initialize a
          ``"snowflake"``-type connection, except the connection uses the
          current viewer's identity tokens instead of the app's connection
          configuration.
        - ``"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``.

        .. Important::
           Connections of type ``"snowflake-callers-rights"`` only work when
           they run in a Snowflake Snowpark Container Services environment. If
           they are used in a local environment, they will raise exceptions.

           For local development, use an environment variable or secret to
           logically switch between a ``"snowflake"`` and
           ``"snowflake-callers-rights"`` connection depending on the runtime
           environment.

        .. |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.

    .. code-block:: toml
        :filename: .streamlit/secrets.toml

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

    .. code-block:: python
        :filename: streamlit_app.py

        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``.

    .. code-block:: toml
        :filename: .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"

    .. code-block:: python
        :filename: streamlit_app.py

        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.

    .. code-block:: toml
        :filename: .streamlit/secrets.toml

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

    .. code-block:: python
        :filename: streamlit_app.py

        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.

    .. code-block:: toml
        :filename: .streamlit/secrets.toml

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

    .. code-block:: python
        :filename: streamlit_app.py

        import streamlit as st
        from streamlit.connections import SQLConnection

        conn = st.connection("my_sql_connection", type=SQLConnection)

    NconnectionsrK   r,   r   )r4   r6   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   rC   r   load_if_toml_exists
isinstancer9   splitpop	importlibimport_modulejoingetattrrA   r   r   ModuleNotFoundErrorresearch_MODULE_EXTRACTION_REGEXr   getgroup)r&   rK   r4   r6   r(   envvar_namer'   parts	classnamera   connection_moduleconne
err_stringmissing_module
extra_infopypi_packages                    r)   rG   rG      s   @ '''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&   r9   r'   r:   r4   
int | Noner6   float | timedelta | Noner(   r   r;   r   )r'   r9   r;   ztype[BaseConnection[Any]])NNF)r&   Literal['sql']r4   ru   r6   rv   rF   boolr(   r   r;   r   )r&   r9   rK   rw   r4   ru   r6   rv   rF   rx   r(   r   r;   r   )r&   Literal['snowflake']r4   ru   r6   rv   rF   rx   r(   r   r;   r   )r&   r9   rK   ry   r4   ru   r6   rv   rF   rx   r(   r   r;   r   )r&   #Literal['snowflake-callers-rights']r4   ru   r6   rv   rF   rx   r(   r   r;   r   )r&   r9   rK   rz   r4   ru   r6   rv   rF   rx   r(   r   r;   r   )
r&   Literal['snowpark']r4   ru   r6   rv   r(   r   r;   r   )r&   r9   rK   r{   r4   ru   r6   rv   r(   r   r;   r   )r&   r9   rK   r:   r4   ru   r6   rv   r(   r   r;   r   )NNN)r&   r9   rK   z
str | Noner4   ru   r6   rv   r(   r   r;   zBaseConnection[Any])'
__future__r   r[   rf   typingr   r   r   r   r   r	   streamlit.connectionsr
   r   r   r   r   streamlit.deprecation_utilr   streamlit.errorsr   streamlit.runtime.cachingr   streamlit.runtime.metrics_utilr   streamlit.runtime.secretsr   datetimer   r   __annotations__compilerh   r   r   r   rA   rC   rG   r%   r+   r)   <module>r      s   # 	 	 H H  : 2 4 9 7" % @"	I E  &2::&AB !-754 0    
 +>#3FG  #$(	5A
5A+5A 5A 
"	5A
 5A 5A 5Ap 
 #$(		
		 
"	 		
 	 	 
	 
 #$(	
	
	 	 
"		
 	 	 	 
	 
 #$(		
		 
"	 		
 	 	 
	 
 #$(	
	
	 	 
"		
 	 	 	 
	 
 #$(		
-		 
"	 		
 	 &	 
	 
 #$(	
	
-	 	 
"		
 	 	 &	 
	 
 #$(	
		 
"	 		
 	 
	 
 #$(		
	
	 	 
"		
 	 	 
	 
 #$(		
	
	 	 
"		
 	 	 
	 
 "$(		
	
	 	 
"		
 	 	 
	 
	~8r+   