
    h$                         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 ddlmZmZ  ed	eeej        f         
          Z G d de          Z G d de          Z G d de          ZdS )    )ABCabstractmethodN)ListUnionDictTypeVarTuple)EQUITY_SCREENER_EQ_MAPEQUITY_SCREENER_FIELDS)FUND_SCREENER_EQ_MAPFUND_SCREENER_FIELDSYFNotImplementedError   )dynamic_docstring'generate_list_table_from_dict_universalT)boundc                      e Zd Zdedeed          eeeeeej        f         df         f         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operand.c                    |                                 }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      U/var/www/html/marketdash/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   r/   s    r0   valid_fieldszQueryBase.valid_fields%        $$UVVVr2   c                      t          d          )Nz/valid_values() needs to be implemented by childr   r5   s    r0   valid_valueszQueryBase.valid_values*   r7   r2   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     r0   	<genexpr>z5QueryBase._validate_or_and_operand.<locals>.<genexpr>2   s,      99Az!Y''999999r2   FzOperand must be type z for OR/AND)r'   r(   allr&   typer/   r   s     r0   r*   z"QueryBase._validate_or_and_operand/   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Br2   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 r@   fields_by_typer   s     r0   rB   z1QueryBase._validate_eq_operand.<locals>.<genexpr>9   ,      bb^GAJ.0bbbbbbr2   Invalid field for  "r   "c                     g | ]}|S rI   rI   r?   s     r0   
<listcomp>z2QueryBase._validate_eq_operand.<locals>.<listcomp>@       ":":":1":":":r2   r;   Invalid EQ value ")r'   r(   anyr6   valuesrD   r9   r$   dictsetunion)r/   r   vvs    ` r0   r+   zQueryBase._validate_eq_operand5   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 +* $#r2   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 rH   rI   rJ   s     r0   rB   z3QueryBase._validate_btwn_operand.<locals>.<genexpr>G   rL   r2   rM   r;   Fz Invalid comparison type for BTWNr   
r'   r(   rT   r6   rU   rD   r$   numbersRealr&   rE   s    `r0   r,   z QueryBase._validate_btwn_operandD   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8r2   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 rH   rI   rJ   s     r0   rB   z,QueryBase._validate_gt_lt.<locals>.<genexpr>Q   rL   r2   rM   rN   r   rO   r;   Fz!Invalid comparison type for GT/LTr]   rE   s    `r0   r-   zQueryBase._validate_gt_ltN   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8r2   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 rH   rI   rJ   s     r0   rB   z3QueryBase._validate_isin_operand.<locals>.<genexpr>Z   rL   r2   rM   rN   r   rO   c                     g | ]}|S rI   rI   r?   s     r0   rQ   z4QueryBase._validate_isin_operand.<locals>.<listcomp>a   rR   r2   r;   rS   )r'   r(   rT   r6   rU   rD   r9   r$   rV   rW   rX   range)r/   r   rY   is    `  r0   r)   z QueryBase._validate_isin_operandV   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r2   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   )rD   r.   )r@   vr/   s     r0   rQ   z%QueryBase.to_dict.<locals>.<listcomp>l   s7    VVVq:4::dT]1%5q$9::VVVr2   r;   c                 d    g | ]-}t          |t                    r|                                n|.S rI   )r$   r   to_dict)r@   os     r0   rQ   z%QueryBase.to_dict.<locals>.<listcomp>o   s3    UUUA
1i(@(@GaUUUr2   r   r.   rm   )r/   opopss   `  r0   rk   zQueryBase.to_dictf   sn    ]m=G##BVVVVDMRSRTRTDUVVVCUUQTUUU
 
 	
r2   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 r=   r>   )r@   rn   s     r0   rB   z%QueryBase.__repr__.<locals>.<genexpr>x   s,      EE:b),,EEEEEEr2   z,
c              3      K   | ]E} d t          |t                    r|                    dz             nt          |           V  FdS )rq   r;   N)r$   r   __repr__repr)r@   rn   indent
indent_strs     r0   rB   z%QueryBase.__repr__.<locals>.<genexpr>z   ss       * * "ii
2y@Y@Y%gR[[!%<%<%<_cdf_g_gii* * * * * *r2   (z, [

z])z, ))		__class____name__r$   r.   r%   rT   joinr   ru   )r/   rv   
class_nameoperands_strrw   s    `  @r0   rt   zQueryBase.__repr__r   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Jr2   c                 *    |                                  S r=   )rt   r5   s    r0   __str__zQueryBase.__str__   s    }}r2   )r   )r|   
__module____qualname__strr   r   r	   r^   r_   r1   propertyr   r6   r   r9   r*   r+   r,   r-   r)   rk   rt   r   rI   r2   r0   r   r      s9          ud;6GsTYZ_`celeq`qZruxZxTyOyIz6z/|        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(      r2   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_tabler3   c                     t           S z[
        Valid operands, grouped by category.
        {valid_operand_fields_table}
        )r   r5   s    r0   r6   zEquityQuery.valid_fields   
     &%r2   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
   r5   s    r0   r9   zEquityQuery.valid_values   r   r2   N)r|   r   r   __doc__r   r   r   r   r   r6   r
   r9   rI   r2   r0   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& & &r2   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   r3   c                     t           S r   )r   r5   s    r0   r6   zFundQuery.valid_fields   
     $#r2   r   c                     t           S r   )r   r5   s    r0   r9   zFundQuery.valid_values   r   r2   N)r|   r   r   r   r   r   r   r   r   r6   r   r9   rI   r2   r0   r   r      s         , 46]6]^r6s6stuu$d $ $ $ X vu$ ,.U.UVj.k.klmm$d $ $ $ X nm$ $ $r2   r   )abcr   r   r^   typingr   r   r   r   r	   yfinance.constr
   r   r   r   yfinance.exceptionsr   utilsr   r   r   r_   r   r   r   r   rI   r2   r0   <module>r      s\   # # # # # # # #  4 4 4 4 4 4 4 4 4 4 4 4 4 4 I I I I I I I I E E E E E E E E 5 5 5 5 5 5 N N N N N N N NGCuS',./000{ { { { { { { {|%& %& %& %& %&) %& %& %&P'$ '$ '$ '$ '$	 '$ '$ '$ '$ '$r2   