o
    +&]i(                     @  s   d Z ddlmZ ddlZddlmZ ejr3ddlm	Z	 ddl
ZddlZddlZddlmZ ddlmZ G dd	 d	ZG d
d dZe ZdS )z
Data object interface for Altair datasets.

This module provides a `data` object that allows accessing datasets as attributes
and calling them with backend options, similar to the vega_datasets interface.
    )annotationsN)Loader)LiteralString)_Backend)Datasetc                   @  s   e Zd ZdZd+d,d	d
Zddd-ddZed.ddZejd/ddZed0ddZ	ddd-ddZ
d0ddZejd1d!d"Zejd2d%d"Zejd3d(d"Zejddd-d)d"Zddd-d*d"ZdS )4DatasetAccessora  
    Accessor for individual datasets that can be called with backend options.

    This object provides access to a specific dataset with support for
    different backends and autocompletion.

    Call this object to load the dataset:
        dataset_accessor(engine="polars", **kwds)

    Parameters for __call__:
        engine : {"polars", "pandas", "pandas[pyarrow]", "pyarrow"}, optional
            The backend to use for loading the dataset.
        **kwds : Any
            Additional arguments passed to the loader.

    Examples
    --------
    >>> from altair.datasets import data
    >>>
    >>> # Load with default backend
    >>> cars_df = data.cars()
    >>>
    >>> # Load with specific backend
    >>> cars_polars = data.cars(engine="polars")
    >>> cars_pandas = data.cars(engine="pandas")
    >>> # Note: pandas[pyarrow] backend requires pyarrow package
    >>>
    >>> # Get URL
    >>> url = data.cars.url
    >>>
    >>> # Use explicit load method
    >>> cars_df = data.cars.load(engine="polars")
    pandasnamer   backendr   returnNonec                 C  sT   dd l }|| _|| _|  || j| _d| d| d| d| d| d}|| _d S )Nr   z
Load the 'a,  ' dataset.

Parameters
----------
engine : {"polars", "pandas", "pandas[pyarrow]", "pyarrow"}, optional
    The backend to use for loading the dataset.
**kwds : Any
    Additional arguments passed to the loader.

Returns
-------
DataFrame or Table
    The loaded dataset.

Examples
--------
>>> data.z)()  # Load with default backend
>>> data.z9(engine="polars")  # Load with specific backend
>>> data.z!.url  # Get dataset URL
>>> data.z/.load(engine="polars")  # Explicit load method
)inspect_name_backend	signature
_call_impl__signature____doc__)selfr	   r
   r   	docstring r   S/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/altair/datasets/_data.py__init__<   s   
zDatasetAccessor.__init__N)enginer   _Backend | Nonekwdst.Anyc                K  s&   |rt |n| j}|| jfi |S N)r   from_backend_loaderr   )r   r   r   loadr   r   r   r   \   s   zDatasetAccessor._call_implLoader[t.Any, t.Any]c                 C  s$   t | dr| jS t| j| _| jS )N_prev_loader)hasattrr"   r   r   r   r   r   r   r   r   e   s   
zDatasetAccessor._loadervaluec                 C  s
   || _ d S r   )r"   )r   r%   r   r   r   r   l   s   
strc                 C  s   | j | jS )aZ  
        Get the URL for this dataset.

        Returns
        -------
        str
            The URL of the dataset.

        Examples
        --------
        >>> from altair.datasets import data
        >>> cars_url = data.cars.url
        >>> print(cars_url)
        https://cdn.jsdelivr.net/npm/vega-datasets@v3.2.1/data/cars.json
        )r   urlr   r$   r   r   r   r'   p   s   zDatasetAccessor.urlc                K     | j dd|i|S )a  
        Load the dataset with the specified engine.

        This method provides the same functionality as calling the accessor directly,
        but with more explicit parameter autocompletion in some IDEs.

        Parameters
        ----------
        engine : {"polars", "pandas", "pandas[pyarrow]", "pyarrow"}, optional
            The backend to use for loading the dataset.
        **kwds : Any
            Additional arguments passed to the loader.

        Returns
        -------
        DataFrame or Table
            The loaded dataset.

        Examples
        --------
        >>> from altair.datasets import data
        >>> cars_df = data.cars.load(engine="polars")
        >>> movies_df = data.movies.load(engine="pandas")
        r   Nr   r   r   r   r   r   r   r   r       s   zDatasetAccessor.loadc                 C  s   d| j  d| j dS )NzDatasetAccessor('z', default_engine='z'))r   r   r$   r   r   r   __repr__   s   zDatasetAccessor.__repr__t.Literal['polars']pl.DataFramec                K     d S r   r   r*   r   r   r   __call__      zDatasetAccessor.__call__&t.Literal['pandas', 'pandas[pyarrow]']pd.DataFramec                K  r.   r   r   r*   r   r   r   r/      r0   t.Literal['pyarrow']pa.Tablec                K  r.   r   r   r*   r   r   r   r/      r0   c                K  r.   r   r   r*   r   r   r   r/      r0   c                K  r(   )a  
        Load the dataset with the specified engine.

        Parameters
        ----------
        engine : {{"polars", "pandas", "pandas[pyarrow]", "pyarrow"}}, optional
            The backend to use for loading the dataset.
        **kwds
            Additional arguments passed to the loader.

        Returns
        -------
        The loaded dataset as a DataFrame/Table from the specified engine.

        Examples
        --------
        >>> from altair.datasets import data
        >>>
        >>> # Load with default engine
        >>> df = data.cars()
        >>>
        >>> # Load with specific engine
        >>> df = data.cars(engine="polars")
        r   Nr   r)   r*   r   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   r1   r   r   r   r2   )r   r3   r   r   r   r4   )__name__
__module____qualname__r   r   r   propertyr   setterr'   r    r+   toverloadr/   r   r   r   r   r      s0    "#	

r   c                      sj   e Zd ZdZddddZd d
dZd! fddZd"ddZd#ddZd ddZ	d$ddZ
d%ddZ  ZS )&
DataObjectaq  
    Main data object that provides access to all datasets as attributes.

    This is the primary interface for loading Altair datasets. It provides
    a simple, intuitive way to access datasets with autocompletion support.

    Examples
    --------
    >>> from altair.datasets import data
    >>>
    >>> # Access datasets as attributes with autocompletion
    >>> cars_df = data.cars()
    >>> movies_df = data.movies(engine="pandas")
    >>>
    >>> # Get URLs
    >>> cars_url = data.cars.url
    >>> movies_url = data.movies.url
    >>>
    >>> # Set default engine for all datasets
    >>> data.set_default_engine("polars")
    >>> penguins_df = data.penguins()  # Uses polars engine
    >>>
    >>> # List available datasets
    >>> available_datasets = data.list_datasets()
    >>> print(f"Available datasets: {len(available_datasets)}")
    Available datasets: 72
    r   r
   r   r   r   c                 C  s   || _ i | _d | _d S r   )r   
_accessors_dataset_names)r   r
   r   r   r   r      s   
zDataObject.__init__list[Dataset | LiteralString]c                 C  sX   | j du r)zddlm} | }t|j | _ W | j S  ty(   g | _ Y | j S w | j S )z6Get the list of available dataset names from metadata.Nr   )CsvCache)r@   altair.datasets._cacherB   listmappingkeys	Exception)r   rB   cacher   r   r   _get_dataset_names  s   
zDataObject._get_dataset_names	list[str]c                   s   t t  }|  }|| S )z7Return list of available attributes for autocompletion.)rD   super__dir__rI   )r   standard_attrsdataset_names	__class__r   r   rL     s   zDataObject.__dir__r	   r   r   c                 C  sP   |   }||vr|d d }d| d| }t|t|| j| j|< | j| S )N
   z	Dataset 'z!' not found. Available datasets: )rI   AttributeErrorr   r   r?   )r   r	   rN   available_datasets	error_msgr   r   r   __getattr__  s   
zDataObject.__getattr__r   c                 C  s   || _ | j  dS )a  
        Set the default engine for all datasets.

        Parameters
        ----------
        engine : {"polars", "pandas", "pandas[pyarrow]", "pyarrow"}
            The backend to use as default for all datasets.

        Examples
        --------
        >>> from altair.datasets import data
        >>> data.set_default_engine("polars")
        >>> # Now all datasets will use polars by default
        >>> cars_df = data.cars()  # Uses polars
        >>> movies_df = data.movies()  # Uses polars
        N)r   r?   clear)r   r   r   r   r   set_default_engine#  s   zDataObject.set_default_enginec                 C  s   |   S )a  
        Get a list of all available dataset names.

        Returns
        -------
        list[str]
            List of available dataset names.

        Examples
        --------
        >>> from altair.datasets import data
        >>> datasets = data.list_datasets()
        >>> print(f"Available datasets: {len(datasets)}")
        Available datasets: 72
        >>> print(datasets[:5])  # First 5 datasets
        ['airports', 'annual_precip', 'anscombe', 'barley', 'birdstrikes']
        )rI   r$   r   r   r   list_datasets8  s   zDataObject.list_datasetsc                 C  s   | j S )a  
        Get the current default engine.

        Returns
        -------
        str
            The current default engine.

        Examples
        --------
        >>> from altair.datasets import data
        >>> data.set_default_engine("pandas")
        >>> print(data.get_default_engine())
        pandas
        >>> data.set_default_engine("polars")
        >>> print(data.get_default_engine())
        polars
        )r   r$   r   r   r   get_default_engineL  s   zDataObject.get_default_enginer&   c                 C  s    t |  }d| j d| dS )Nz!AltairDataObject(default_engine='z', datasets=))lenrI   r   )r   dataset_countr   r   r   r+   a  s   zDataObject.__repr__r5   )r
   r   r   r   )r   rA   )r   rJ   )r	   r   r   r   )r   r   r   r   )r   r   r6   )r7   r8   r9   r   r   rI   rL   rU   rW   rX   rY   r+   __classcell__r   r   rO   r   r>      s    




r>   )r   
__future__r   typingr<   altair.datasets._loaderr   TYPE_CHECKINGtyping_extensionsr   r   pdpolarsplpyarrowpaaltair.datasets._readerr   altair.datasets._typingr   r   r>   datar   r   r   r   <module>   s      J 
