o
    i                  	   @  s   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ ee d dlmZ W d   n1 sDw   Y  e	r]d dlmZ d d	lmZ d d
lmZ dgZdddddddddd/d dZd0d"d#Zed$d%dd&d1d)d*Zd2d+d,Zdd&d3d-d.ZdS )4    )annotationsN)	lru_cache)Path)TYPE_CHECKINGAny)parse_into_list_of_expressions)	wrap_expr)Iterable)Expr)IntoExprregister_plugin_functionF)kwargsis_elementwisechanges_lengthreturns_scalarcast_to_supertypeinput_wildcard_expansionpass_name_to_applyuse_abs_pathplugin_path
Path | strfunction_namestrargsIntoExpr | Iterable[IntoExpr]r   dict[str, Any] | Noner   boolr   r   r   r   r   r   returnr
   c                 C  sB   t |}t|}t| |
d} ttjt| ||||||||	|d
S )a  
    Register a plugin function.

    See the `user guide <https://docs.pola.rs/user-guide/plugins/expr_plugins>`_
    for more information about plugins.

    Parameters
    ----------
    plugin_path
        Path to the plugin package. Accepts either the file path to the dynamic library
        file or the path to the directory containing it.
    function_name
        The name of the Rust function to register.
    args
        The arguments passed to this function. These get passed to the `input`
        argument on the Rust side, and have to be expressions (or be convertible
        to expressions).
    kwargs
        Non-expression arguments to the plugin function. These must be
        JSON serializable.
    is_elementwise
        Indicate that the function operates on scalars only. This will potentially
        trigger fast paths.
    changes_length
        Indicate that the function will change the length of the expression.
        For example, a `unique` or `slice` operation.
    returns_scalar
        Automatically explode on unit length if the function ran as final aggregation.
        This is the case for aggregations like `sum`, `min`, `covariance` etc.
    cast_to_supertype
        Cast the input expressions to their supertype.
    input_wildcard_expansion
        Expand wildcard expressions before executing the function.
    pass_name_to_apply
        If set to `True`, the `Series` passed to the function in a group-by operation
        will ensure the name is set. This is an extra heap allocation per group.
    use_abs_path
        If set to `True`, the path will be resolved to an absolute path.
        The path to the dynamic library is relative to the virtual environment by
        default.

    Returns
    -------
    Expr

    Warnings
    --------
    This is highly unsafe as this will call the C function loaded by
    `plugin::function_name`.

    The parameters you set dictate how Polars will handle the function.
    Make sure they are correct!
    r   )
r   r   r   r   r   r   r   r   r   r   )r   _serialize_kwargs_resolve_plugin_pathr   plrr   r   )r   r   r   r   r   r   r   r   r   r   r   ZpyexprsZserialized_kwargs r"   E/home/app/Keep/.python/lib/python3.10/site-packages/polars/plugins.pyr      s"   Cbytesc                 C  s   | sdS ddl }|j| ddS )z+Serialize the function's keyword arguments.    r   N   )protocol)pickledumps)r   r(   r"   r"   r#   r   o   s   r      )maxsizer   pathr   c                C  s^   t | ts	t| } |  rt| |dS |  D ]}t|r%t||d  S qd|  }t|)z.Get the file path of the dynamic library file.r   z"no dynamic library found at path: )
isinstancer   is_file_resolve_file_pathiterdir_is_dynamic_libFileNotFoundError)r,   r   pmsgr"   r"   r#   r    {   s   

r    c                 C  s   |   o| jdv S )N)z.soz.dllz.pyd)r.   suffix)r,   r"   r"   r#   r1      s   r1   c                C  sD   t tj}|r|  S z| |}W |S  ty!   |  }Y |S w )N)r   sysprefixresolverelative_to
ValueError)r,   r   Z	venv_path	file_pathr"   r"   r#   r/      s   

r/   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   )r   r   r   r$   )r,   r   r   r   r   r   )r,   r   r   r   )r,   r   r   r   r   r   ) 
__future__r   
contextlibr6   	functoolsr   pathlibr   typingr   r   Zpolars._utils.parser   Zpolars._utils.wrapr   suppressImportErrorZpolars._plrZ_plrr!   collections.abcr	   Zpolarsr
   Zpolars._typingr   __all__r   r   r    r1   r/   r"   r"   r"   r#   <module>   s<    
W
