o
    ùT·j8*  ã                   @   sâ   d dl mZmZ d dlZd dlmZmZmZmZm	Z	 d dl
mZmZ d dl
mZmZ d dl
mZmZ d dlmZ dd	lmZmZ ed
eeejf d�Ze	d ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    )ÚABCÚabstractmethodN)ÚListÚUnionÚDictÚTypeVarÚLiteral)ÚEQUITY_SCREENER_EQ_MAPÚEQUITY_SCREENER_FIELDS)ÚFUND_SCREENER_EQ_MAPÚFUND_SCREENER_FIELDS)ÚETF_SCREENER_EQ_MAPÚETF_SCREENER_FIELDS©ÚYFNotImplementedErroré   )Údynamic_docstringÚ'generate_list_table_from_dict_universalÚT)Úbound)	Úeqzis-inÚbtwnÚgtÚltÚgteÚlteÚandÚorc                   @   s  e Zd Zdedeed  ee eej f fdd„Z	e
edefdd„ƒƒZe
edefdd	„ƒƒZded  dd
fdd„Zdeeeejf  dd
fdd„Zdeeeejf  dd
fdd„Zdeeeejf  dd
fdd„Zded  dd
fdd„Zdefdd„Zddefdd„Zdefdd„Zd
S )Ú	QueryBaseÚoperatorÚoperandc                 C   sª   |  ¡ }t|tƒstdƒ‚t|ƒdkrtdƒ‚|dkr!|  |¡ n,|dv r+|  |¡ n"|dkr5|  |¡ n|dkr?|  	|¡ n|dv rI|  
|¡ ntd	ƒ‚|| _|| _d S )
NzInvalid operand typer   zInvalid field for EquityQueryúIS-IN>   ÚORÚANDÚEQÚBTWN>   ÚGTÚLTÚGTEÚLTEzInvalid Operator Value)ÚupperÚ
isinstanceÚlistÚ	TypeErrorÚlenÚ
ValueErrorÚ_validate_isin_operandÚ_validate_or_and_operandÚ_validate_eq_operandÚ_validate_btwn_operandÚ_validate_gt_ltr   Úoperands)Úselfr   r    © r7   úZ/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/yfinance/screener/query.pyÚ__init__   s$   

zQueryBase.__init__Úreturnc                 C   ó   t dƒ‚)Nz/valid_fields() needs to be implemented by childr   ©r6   r7   r7   r8   Úvalid_fields(   ó   zQueryBase.valid_fieldsc                 C   r;   )Nz/valid_values() needs to be implemented by childr   r<   r7   r7   r8   Úvalid_values-   r>   zQueryBase.valid_valuesNc                 C   sB   t |ƒdkr
tdƒ‚tdd„ |D ƒƒdu rtdt| ƒ› d�ƒ‚d S )Né   z$Operand must be length longer than 1c                 s   ó   � | ]}t |tƒV  qd S ©N©r+   r   ©Ú.0Úer7   r7   r8   Ú	<genexpr>5   ó   € z5QueryBase._validate_or_and_operand.<locals>.<genexpr>FzOperand must be type z for OR/AND)r.   r/   Úallr-   Útype©r6   r    r7   r7   r8   r1   2   s
   ÿz"QueryBase._validate_or_and_operandc                    s¶   t ˆ ƒdkr
tdƒ‚t‡ fdd„| j ¡ D ƒƒs'tdt| ƒ› dˆ d › d�ƒ‚ˆ d | jv rW| jˆ d  }t|tƒrGt	ƒ j
d	d
„ | ¡ D ƒŽ }ˆ d |vrYtdˆ d › d�ƒ‚d S d S )Nr   zOperand must be length 2 for EQc                 3   ó   � | ]	}ˆ d  |v V  qdS ©r   Nr7   ©rE   Úfields_by_type©r    r7   r8   rG   <   ó   € z1QueryBase._validate_eq_operand.<locals>.<genexpr>úInvalid field for ú "r   ú"c                 S   ó   g | ]}|‘qS r7   r7   rD   r7   r7   r8   Ú
<listcomp>C   ó    z2QueryBase._validate_eq_operand.<locals>.<listcomp>r@   úInvalid EQ value ")r.   r/   Úanyr=   ÚvaluesrJ   r?   r+   ÚdictÚsetÚunion)r6   r    Úvvr7   rP   r8   r2   8   s   
ùzQueryBase._validate_eq_operandc                    s~   t ˆ ƒdkr
tdƒ‚t‡ fdd„| j ¡ D ƒƒs!tdt| ƒ› �ƒ‚tˆ d tjƒdu r/t	dƒ‚tˆ d	 tjƒdu r=t	dƒ‚d S )
Né   z!Operand must be length 3 for BTWNc                 3   rL   rM   r7   rN   rP   r7   r8   rG   J   rQ   z3QueryBase._validate_btwn_operand.<locals>.<genexpr>rR   r@   Fz Invalid comparison type for BTWNr   ©
r.   r/   rY   r=   rZ   rJ   r+   ÚnumbersÚRealr-   rK   r7   rP   r8   r3   G   s   ÿz QueryBase._validate_btwn_operandc                    sn   t ˆ ƒdkr
tdƒ‚t‡ fdd„| j ¡ D ƒƒs'tdt| ƒ› dˆ d › d�ƒ‚tˆ d	 tjƒd
u r5t	dƒ‚d S )Nr   z"Operand must be length 2 for GT/LTc                 3   rL   rM   r7   rN   rP   r7   r8   rG   T   rQ   z,QueryBase._validate_gt_lt.<locals>.<genexpr>rR   rS   r   rT   r@   Fz!Invalid comparison type for GT/LTr`   rK   r7   rP   r8   r4   Q   s   ÿzQueryBase._validate_gt_ltc                    sÊ   t ˆ ƒdk r
tdƒ‚t‡ fdd„| j ¡ D ƒƒs'tdt| ƒ› dˆ d › d�ƒ‚ˆ d | jv ra| jˆ d  }t|tƒrGt	ƒ j
d	d
„ | ¡ D ƒŽ }tdt ˆ ƒƒD ]}ˆ | |vr`tdˆ | › d�ƒ‚qNd S d S )Nr   z#Operand must be length 2+ for IS-INc                 3   rL   rM   r7   rN   rP   r7   r8   rG   ]   rQ   z3QueryBase._validate_isin_operand.<locals>.<genexpr>rR   rS   r   rT   c                 S   rU   r7   r7   rD   r7   r7   r8   rV   d   rW   z4QueryBase._validate_isin_operand.<locals>.<listcomp>r@   rX   )r.   r/   rY   r=   rZ   rJ   r?   r+   r[   r\   r]   Úrange)r6   r    r^   Úir7   rP   r8   r0   Y   s   
ÿùz QueryBase._validate_isin_operandc                    sJ   ˆ j }ˆ j}ˆ j dkrd}‡ fdd„ˆ jdd … D ƒ}|dd„ |D ƒdœS )Nr!   r"   c                    s$   g | ]}t ˆ ƒd ˆ jd |gƒ‘qS )r$   r   )rJ   r5   )rE   Úvr<   r7   r8   rV   o   s   $ z%QueryBase.to_dict.<locals>.<listcomp>r@   c                 S   s"   g | ]}t |tƒr| ¡ n|‘qS r7   )r+   r   Úto_dict)rE   Úor7   r7   r8   rV   r   s   " ©r   r5   rh   )r6   ÚopÚopsr7   r<   r8   rf   i   s   
þzQueryBase.to_dictr   c                    s¦   dˆ  ‰| j j}t| jtƒrDtdd„ | jD ƒƒr5d ‡ ‡fdd„| jD ƒ¡}|› d| j› d|› dˆ› d	�S |› d| j› d
t| jƒ› d�S |› d| j› d
t| jƒ› d�S )Nú  c                 s   rA   rB   rC   ©rE   ri   r7   r7   r8   rG   {   rH   z%QueryBase.__repr__.<locals>.<genexpr>z,
c                 3   s:   � | ]}ˆ› d t |tƒr| ˆ d ¡nt|ƒ› �V  qdS )rk   r@   N)r+   r   Ú__repr__Úreprrl   ©ÚindentÚ
indent_strr7   r8   rG   }   s
   € (ÿ
ÿú(z, [
Ú
z])z, ú))	Ú	__class__Ú__name__r+   r5   r,   rY   Újoinr   rn   )r6   rp   Ú
class_nameÚoperands_strr7   ro   r8   rm   u   s   þzQueryBase.__repr__c                 C   s   |   ¡ S rB   )rm   r<   r7   r7   r8   Ú__str__‰   s   zQueryBase.__str__)r   )rv   Ú
__module__Ú__qualname__ÚOperatorr   r   Ústrra   rb   r9   Úpropertyr   r   r=   r?   r1   r2   r3   r4   r0   rf   rm   rz   r7   r7   r7   r8   r      s     *   
r   c                   @   s\   e Zd ZdZedeeƒiƒedefdd„ƒƒZ	edee
ddgd	�iƒedefd
d„ƒƒZdS )ÚEquityQueryaÆ  
    The `EquityQuery` class constructs filters for stocks based on specific criteria such as region, sector, exchange, and peer group.

    Start with value operations: `EQ` (equals), `IS-IN` (is in), `BTWN` (between), `GT` (greater than), `LT` (less than), `GTE` (greater or equal), `LTE` (less or equal).

    Combine them with logical operations: `AND`, `OR`.

    Example:
        Predefined Yahoo query `aggressive_small_caps`:
        
        .. code-block:: python

            from yfinance import EquityQuery

            EquityQuery('and', [
                EquityQuery('is-in', ['exchange', 'NMS', 'NYQ']), 
                EquityQuery('lt', ["epsgrowth.lasttwelvemonths", 15])
            ])
    Úvalid_operand_fields_tabler:   c                 C   ó   t S ©z[
        Valid operands, grouped by category.
        {valid_operand_fields_table}
        )r
   r<   r7   r7   r8   r=   ¢   ó   zEquityQuery.valid_fieldsÚvalid_values_tableÚexchangeÚindustry)Úconcat_keysc                 C   r‚   ©z€
        Most operands take number values, but some have a restricted set of valid values.
        {valid_values_table}
        )r	   r<   r7   r7   r8   r?   «   r„   zEquityQuery.valid_valuesN)rv   r{   r|   Ú__doc__r   r   r
   r   r   r=   r	   r?   r7   r7   r7   r8   r€   �   s    r€   c                   @   óT   e Zd ZdZedeeƒiƒedefdd„ƒƒZ	edee
ƒiƒedefdd„ƒƒZd	S )
Ú	FundQuerya˜  
    The `FundQuery` class constructs filters for mutual funds based on specific criteria such as region, sector, exchange, and peer group.

    Start with value operations: `EQ` (equals), `IS-IN` (is in), `BTWN` (between), `GT` (greater than), `LT` (less than), `GTE` (greater or equal), `LTE` (less or equal).

    Combine them with logical operations: `AND`, `OR`.

    Example:
        Predefined Yahoo query `solid_large_growth_funds`:
        
        .. code-block:: python

            from yfinance import FundQuery
            
            FundQuery('and', [
                FundQuery('eq', ['categoryname', 'Large Growth']), 
                FundQuery('is-in', ['performanceratingoverall', 4, 5]), 
                FundQuery('lt', ['initialinvestment', 100001]), 
                FundQuery('lt', ['annualreturnnavy1categoryrank', 50]), 
                FundQuery('eq', ['exchange', 'NAS'])
            ])
    r�   r:   c                 C   r‚   rƒ   )r   r<   r7   r7   r8   r=   Ì   r„   zFundQuery.valid_fieldsr…   c                 C   r‚   r‰   )r   r<   r7   r7   r8   r?   Õ   r„   zFundQuery.valid_valuesN)rv   r{   r|   rŠ   r   r   r   r   r   r=   r   r?   r7   r7   r7   r8   rŒ   µ   s    rŒ   c                   @   r‹   )
ÚETFQueryaç  
    The `ETFQuery` class constructs filters for ETFs based on specific criteria such as category, fund family, exchange, and performance ratings.

    Start with value operations: `EQ` (equals), `IS-IN` (is in), `BTWN` (between), `GT` (greater than), `LT` (less than), `GTE` (greater or equal), `LTE` (less or equal).

    Combine them with logical operations: `AND`, `OR`.

    Example:
        Predefined Yahoo query `top_etfs_us`:
        
        .. code-block:: python

            from yfinance import ETFQuery

            ETFQuery('and', [
                ETFQuery('gt', ['intradayprice', 10]),
                ETFQuery('is-in', ['performanceratingoverall', 4, 5]),
                ETFQuery('eq', ['region', 'us'])
            ])
    r�   r:   c                 C   r‚   rƒ   )r   r<   r7   r7   r8   r=   ó   r„   zETFQuery.valid_fieldsr…   c                 C   r‚   r‰   )r   r<   r7   r7   r8   r?   ü   r„   zETFQuery.valid_valuesN)rv   r{   r|   rŠ   r   r   r   r   r   r=   r   r?   r7   r7   r7   r8   r�   Þ   s    r�   )Úabcr   r   ra   Útypingr   r   r   r   r   Úyfinance.constr	   r
   r   r   r   r   Úyfinance.exceptionsr   Úutilsr   r   r~   rb   r   r}   r   r€   rŒ   r�   r7   r7   r7   r8   Ú<module>   s    ~()