o
    Z&i                     @   sL   d dl Z ddlmZ ddlmZ ddlmZ G dd dZG d	d
 d
ZdS )    N   )__version__)
get_config   )parse_versionc                   @   s:   e Zd ZdZdZdZedd Zejdd Zdd Z	dS )	_HTMLDocumentationLinkMixina3	  Mixin class allowing to generate a link to the API documentation.

    This mixin relies on three attributes:
    - `_doc_link_module`: it corresponds to the root module (e.g. `sklearn`). Using this
      mixin, the default value is `sklearn`.
    - `_doc_link_template`: it corresponds to the template used to generate the
      link to the API documentation. Using this mixin, the default value is
      `"https://scikit-learn.org/{version_url}/modules/generated/
      {estimator_module}.{estimator_name}.html"`.
    - `_doc_link_url_param_generator`: it corresponds to a function that generates the
      parameters to be used in the template when the estimator module and name are not
      sufficient.

    The method :meth:`_get_doc_link` generates the link to the API documentation for a
    given estimator.

    This useful provides all the necessary states for
    :func:`sklearn.utils.estimator_html_repr` to generate a link to the API
    documentation for the estimator HTML diagram.

    Examples
    --------
    If the default values for `_doc_link_module`, `_doc_link_template` are not suitable,
    then you can override them and provide a method to generate the URL parameters:
    >>> from sklearn.base import BaseEstimator
    >>> doc_link_template = "https://address.local/{single_param}.html"
    >>> def url_param_generator(estimator):
    ...     return {"single_param": estimator.__class__.__name__}
    >>> class MyEstimator(BaseEstimator):
    ...     # use "builtins" since it is the associated module when declaring
    ...     # the class in a docstring
    ...     _doc_link_module = "builtins"
    ...     _doc_link_template = doc_link_template
    ...     _doc_link_url_param_generator = url_param_generator
    >>> estimator = MyEstimator()
    >>> estimator._get_doc_link()
    'https://address.local/MyEstimator.html'

    If instead of overriding the attributes inside the class definition, you want to
    override a class instance, you can use `types.MethodType` to bind the method to the
    instance:
    >>> import types
    >>> estimator = BaseEstimator()
    >>> estimator._doc_link_template = doc_link_template
    >>> estimator._doc_link_url_param_generator = types.MethodType(
    ...     url_param_generator, estimator)
    >>> estimator._get_doc_link()
    'https://address.local/BaseEstimator.html'
    ZsklearnNc                 C   s>   t t}|jd u r|j d|j }nd}t| dd| dS )N.dev__doc_link_templatezhttps://scikit-learn.org/z;/modules/generated/{estimator_module}.{estimator_name}.html)r   r   r	   majorminorgetattr)selfZsklearn_versionZversion_url r   HC:\wamp64\www\opt\env\Lib\site-packages\sklearn/utils/_repr_html/base.py_doc_link_templateA   s   

z._HTMLDocumentationLinkMixin._doc_link_templatec                 C   s   t | d| d S )Nr
   )setattr)r   valuer   r   r   r   Q   s   c                 C   st   | j jdd | jkrdS | jdu r/| j j}dtdd | j jd}| j	j
||dS | j	j
di |  S )	a  Generates a link to the API documentation for a given estimator.

        This method generates the link to the estimator's documentation page
        by using the template defined by the attribute `_doc_link_template`.

        Returns
        -------
        url : str
            The URL to the API documentation for this estimator. If the estimator does
            not belong to module `_doc_link_module`, the empty string (i.e. `""`) is
            returned.
        r   r    Nc                 S   s   |  d S )N_)
startswith)partr   r   r   <lambda>l   s    z;_HTMLDocumentationLinkMixin._get_doc_link.<locals>.<lambda>)estimator_moduleestimator_namer   )	__class__
__module__split_doc_link_module_doc_link_url_param_generator__name__join	itertools	takewhiler   format)r   r   r   r   r   r   _get_doc_linkU   s   
z)_HTMLDocumentationLinkMixin._get_doc_link)
r    r   __qualname____doc__r   r   propertyr   setterr%   r   r   r   r   r      s    2

r   c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	ReprHTMLMixinzMixin to handle consistently the HTML representation.

    When inheriting from this class, you need to define an attribute `_html_repr`
    which is a callable that returns the HTML representation to be shown.
    c                 C   s   t  d dkrtd| jS )a  HTML representation of estimator.
        This is redundant with the logic of `_repr_mimebundle_`. The latter
        should be favored in the long term, `_repr_html_` is only
        implemented for consumers who do not interpret `_repr_mimbundle_`.
        displaydiagramzW_repr_html_ is only defined when the 'display' configuration option is set to 'diagram')r   AttributeError_repr_html_innerr   r   r   r   _repr_html_}   s
   zReprHTMLMixin._repr_html_c                 C   s   |   S )zThis function is returned by the @property `_repr_html_` to make
        `hasattr(estimator, "_repr_html_") return `True` or `False` depending
        on `get_config()["display"]`.
        )
_html_reprr/   r   r   r   r.      s   zReprHTMLMixin._repr_html_innerc                 K   s*   dt | i}t d dkr|  |d< |S )z8Mime bundle used by jupyter kernels to display estimatorz
text/plainr+   r,   z	text/html)reprr   r1   )r   kwargsoutputr   r   r   _repr_mimebundle_   s   zReprHTMLMixin._repr_mimebundle_N)r    r   r&   r'   r(   r0   r.   r5   r   r   r   r   r*   v   s    
r*   )	r"   r   r   _configr   fixesr   r   r*   r   r   r   r   <module>   s   k