
    Ej8*                     :   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                   Ze	d         Z G d de          Z G d de          Z G d de          Z G 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                      e Zd Zdedeed          ee         eej                 f         fdZ	e
edefd                        Ze
edefd                        Zded          ddfdZdeeeej        f                  ddfd	Zdeeeej        f                  ddfd
Zdeeeej        f                  ddfdZded          ddfdZdefdZddefdZdefdZdS )	QueryBaseoperatoroperandc                    |                                 }t          |t                    st          d          t	          |          dk    rt          d          |dk    r|                     |           n{|dv r|                     |           na|dk    r|                     |           nE|dk    r| 	                    |           n)|dv r| 
                    |           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"   s      S/var/www/html/bolsaweb/venv/lib/python3.11/site-packages/yfinance/screener/query.py__init__zQueryBase.__init__   s   >>##'4(( 	42333w<<1<===w''0000%%))'2222%%g....''0000000  ))))5666     returnc                      t          d          )Nz/valid_fields() needs to be implemented by childr   r9   s    r:   valid_fieldszQueryBase.valid_fields(        $$UVVVr<   c                      t          d          )Nz/valid_values() needs to be implemented by childr   r?   s    r:   valid_valueszQueryBase.valid_values-   rA   r<   Nc                     t          |          dk    rt          d          t          d |D                       du r t          dt	          |            d          d S )N   z$Operand must be length longer than 1c              3   @   K   | ]}t          |t                    V  d S Nr.   r    .0es     r:   	<genexpr>z5QueryBase._validate_or_and_operand.<locals>.<genexpr>5   s,      99Az!Y''999999r<   FzOperand must be type z for OR/AND)r1   r2   allr0   typer9   r"   s     r:   r4   z"QueryBase._validate_or_and_operand2   sm    w<<1CDDD9999999UBBKDJJKKKLLL CBr<   c                    t                    dk    rt          d          t          fd| j                                        D                       s)t          dt          |            dd          d          d         | j        v r}| j        d                  }t          |t                    r2 t                      j
        d |                                D              }d	         |vrt          d
d	          d          d S d S )Nr   zOperand must be length 2 for EQc              3   ,   K   | ]}d          |v V  dS r   N rJ   fields_by_typer"   s     r:   rL   z1QueryBase._validate_eq_operand.<locals>.<genexpr><   ,      bb^GAJ.0bbbbbbr<   Invalid field for  "r   "c                     g | ]}|S rS   rS   rI   s     r:   
<listcomp>z2QueryBase._validate_eq_operand.<locals>.<listcomp>C       ":":":1":":":r<   rE   Invalid EQ value ")r1   r2   anyr@   valuesrN   rC   r.   dictsetunion)r9   r"   vvs    ` r:   r5   zQueryBase._validate_eq_operand8   s!   w<<1>???bbbbtGXG_G_GaGabbbbb 	OM$t**MM
MMMNNN1:***"71:.B"d## < !SUU[":":biikk":":":;qz## !Cgaj!C!C!CDDD +* $#r<   c                    t                    dk    rt          d          t          f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   ,   K   | ]}d          |v V  dS rR   rS   rT   s     r:   rL   z3QueryBase._validate_btwn_operand.<locals>.<genexpr>J   rV   r<   rW   rE   Fz Invalid comparison type for BTWNr   
r1   r2   r^   r@   r_   rN   r.   numbersRealr0   rO   s    `r:   r6   z QueryBase._validate_btwn_operandG   s    w<<1@AAAbbbbtGXG_G_GaGabbbbb 	@>$t**>>???gaj',//588>???gaj',//588>??? 98r<   c                 d   t                    dk    rt          d          t          fd| j                                        D                       s)t          dt          |            dd          d          t          d         t          j                  d	u rt          d
          d S )Nr   z"Operand must be length 2 for GT/LTc              3   ,   K   | ]}d          |v V  dS rR   rS   rT   s     r:   rL   z,QueryBase._validate_gt_lt.<locals>.<genexpr>T   rV   r<   rW   rX   r   rY   rE   Fz!Invalid comparison type for GT/LTrg   rO   s    `r:   r7   zQueryBase._validate_gt_ltQ   s    w<<1ABBBbbbbtGXG_G_GaGabbbbb 	OM$t**MM
MMMNNNgaj',//588?@@@ 98r<   c                 ^   t                    dk     rt          d          t          fd| j                                        D                       s)t          dt          |            dd          d          d         | j        v r| j        d                  }t          |t                    r2 t                      j
        d |                                D              }t          d	t                              D ]'}|         |vrt          d
|          d          &d S d S )Nr   z#Operand must be length 2+ for IS-INc              3   ,   K   | ]}d          |v V  dS rR   rS   rT   s     r:   rL   z3QueryBase._validate_isin_operand.<locals>.<genexpr>]   rV   r<   rW   rX   r   rY   c                     g | ]}|S rS   rS   rI   s     r:   r[   z4QueryBase._validate_isin_operand.<locals>.<listcomp>d   r\   r<   rE   r]   )r1   r2   r^   r@   r_   rN   rC   r.   r`   ra   rb   range)r9   r"   rc   is    `  r:   r3   z QueryBase._validate_isin_operandY   sK   w<<!BCCCbbbbtGXG_G_GaGabbbbb 	OM$t**MM
MMMNNN1:***"71:.B"d## < !SUU[":":biikk":":":;1c'll++ I I1:R''$%G'!*%G%G%GHHH ( +*I Ir<   c                       j         } j        } j         dk    rd} fd j        dd          D             }|d |D             dS )Nr$   r%   c                 \    g | ](} t                    d j        d         |g          )S )r'   r   )rN   r8   )rJ   vr9   s     r:   r[   z%QueryBase.to_dict.<locals>.<listcomp>o   s7    VVVq:4::dT]1%5q$9::VVVr<   rE   c                 d    g | ]-}t          |t                    r|                                n|.S rS   )r.   r    to_dict)rJ   os     r:   r[   z%QueryBase.to_dict.<locals>.<listcomp>r   s3    UUUA
1i(@(@GaUUUr<   r!   r8   rw   )r9   opopss   `  r:   ru   zQueryBase.to_dicti   sn    ]m=G##BVVVVDMRSRTRTDUVVVCUUQTUUU
 
 	
r<   r   c                    dz  | j         j        }t          | j        t                    rzt          d | j        D                       r:d                    f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              3   @   K   | ]}t          |t                    V  d S rG   rH   )rJ   rx   s     r:   rL   z%QueryBase.__repr__.<locals>.<genexpr>{   s,      EE:b),,EEEEEEr<   z,
c              3      K   | ]E} d t          |t                    r|                    dz             nt          |           V  FdS )r{   rE   N)r.   r    __repr__repr)rJ   rx   indent
indent_strs     r:   rL   z%QueryBase.__repr__.<locals>.<genexpr>}   ss       * * "ii
2y@Y@Y%gR[[!%<%<%<_cdf_g_gii* * * * * *r<   (z, [

z])z, ))		__class____name__r.   r8   r/   r^   joinr!   r   )r9   r   
class_nameoperands_strr   s    `  @r:   r~   zQueryBase.__repr__u   s   F]
^,
dmT** 	KEEt}EEEEE 	O$zz * * * * *"m* * *     %YYt}YY<YY:YYYY %NNt}NNT]8K8KNNNN !JJ4=JJD4G4GJJJJr<   c                 *    |                                  S rG   )r~   r?   s    r:   __str__zQueryBase.__str__   s    }}r<   )r   )r   
__module____qualname__Operatorr   r   strrh   ri   r;   propertyr   r   r@   rC   r4   r5   r6   r7   r3   ru   r~   r   rS   r<   r:   r    r       s$          E4;LdSViY]^e^jYk;k4m        0 Wd W W W ^ XW Wd W W W ^ XWM[0A Md M M M MEDsGL7H1I,J Et E E E E@d5gl9J3K.L @QU @ @ @ @AtE#w|2C,D'E A$ A A A AId;.? ID I I I I 

 

 

 

 

K KC K K K K(      r<   r    c                       e Zd ZdZ ed ee          i          edefd                        Z	 ed ee
ddg          i          edef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                     t           S z[
        Valid operands, grouped by category.
        {valid_operand_fields_table}
        )r   r?   s    r:   r@   zEquityQuery.valid_fields   
     &%r<   valid_values_tableexchangeindustry)concat_keysc                     t           S z
        Most operands take number values, but some have a restricted set of valid values.
        {valid_values_table}
        )r
   r?   s    r:   rC   zEquityQuery.valid_values   r   r<   N)r   r   r   __doc__r   r   r   r   r   r@   r
   rC   rS   r<   r:   r   r      s         ( 46]6]^t6u6uvww&d & & & X xw& ,.U.UVl  |F  HR  {S  /T  /T  /T  U  V  V&d & & & X V  V& & &r<   r   c                       e Zd ZdZ ed ee          i          edefd                        Z	 ed ee
          i          edef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                     t           S r   )r   r?   s    r:   r@   zFundQuery.valid_fields   
     $#r<   r   c                     t           S r   )r   r?   s    r:   rC   zFundQuery.valid_values   r   r<   N)r   r   r   r   r   r   r   r   r   r@   r   rC   rS   r<   r:   r   r      s         , 46]6]^r6s6stuu$d $ $ $ X vu$ ,.U.UVj.k.klmm$d $ $ $ X nm$ $ $r<   r   c                       e Zd ZdZ ed ee          i          edefd                        Z	 ed ee
          i          edefd                        ZdS )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                     t           S r   )r   r?   s    r:   r@   zETFQuery.valid_fields   
     #"r<   r   c                     t           S r   )r   r?   s    r:   rC   zETFQuery.valid_values   r   r<   N)r   r   r   r   r   r   r   r   r   r@   r   rC   rS   r<   r:   r   r      s         ( 46]6]^q6r6rstt#d # # # X ut# ,.U.UVi.j.jkll#d # # # X ml# # #r<   r   )abcr   r   rh   typingr   r   r   r   r	   yfinance.constr
   r   r   r   r   r   yfinance.exceptionsr   utilsr   r   r   ri   r   r   r    r   r   r   rS   r<   r:   <module>r      s   # # # # # # # #  6 6 6 6 6 6 6 6 6 6 6 6 6 6 I I I I I I I I E E E E E E E E C C C C C C C C 5 5 5 5 5 5 N N N N N N N NGCuS',./000OP{ { { { { { { {|%& %& %& %& %&) %& %& %&P'$ '$ '$ '$ '$	 '$ '$ '$R%# %# %# %# %#y %# %# %# %# %#r<   