
    Wg$                         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y)    )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y)	QueryBaseoperatoroperand.c                    |j                         }t        |t              st        d      t	        |      dk  rt        d      |dk(  r| j                  |       ne|dv r| j                  |       nO|dk(  r| j                  |       n8|dk(  r| j                  |       n!|dv r| j                  |       nt        d	      || _        || _        y )
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      J/var/www/html/venv/lib/python3.12/site-packages/yfinance/screener/query.py__init__zQueryBase.__init__   s    >>#'4(233w<1<==w''0%))'2%%g.''000  )566     returnc                     t        d      )Nz/valid_fields() needs to be implemented by childr   r/   s    r0   valid_fieldszQueryBase.valid_fields%        $$U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      y )N   z$Operand must be length longer than 1c              3   <   K   | ]  }t        |t                y wNr$   r   ).0es     r0   	<genexpr>z5QueryBase._validate_or_and_operand.<locals>.<genexpr>2   s     9Az!Y'9   FzOperand must be type z for OR/AND)r'   r(   allr&   typer/   r   s     r0   r*   z"QueryBase._validate_or_and_operand/   sL    w<1CDD999UB3DJ<{KLL Cr2   c                    t              dk7  rt        d      t        fd| j                  j	                         D              st        dt        |        dd    d      d   | j                  v ro| j                  d      }t        |t              r3 t               j                  |j	                         D cg c]  }| c} }d   |vrt        d	d    d      y y c c}w )
Nr   zOperand must be length 2 for EQc              3   ,   K   | ]  }d    |v   ywr   N r?   fields_by_typer   s     r0   rA   z1QueryBase._validate_eq_operand.<locals>.<genexpr>9        b^GAJ.0b   Invalid field for  "r   "r;   Invalid EQ value ")r'   r(   anyr6   valuesrD   r9   r$   dictsetunion)r/   r   vvr@   s    `  r0   r+   zQueryBase._validate_eq_operand5   s    w<1>??btGXGXG_G_Gabb1$t*R
|1MNN1:***""71:.B"d# !SU[[biik":1":;qz# #5gaj\!CDD $ +
 #;s   >	C&c                 f   t              dk7  rt        d      t        fd| j                  j	                         D              st        dt        |              t        d   t        j                        du rt        d      t        d   t        j                        du rt        d      y )	N   z!Operand must be length 3 for BTWNc              3   ,   K   | ]  }d    |v   ywrH   rI   rJ   s     r0   rA   z3QueryBase._validate_btwn_operand.<locals>.<genexpr>G   rL   rM   rN   r;   Fz Invalid comparison type for BTWNr   
r'   r(   rR   r6   rS   rD   r$   numbersRealr&   rE   s    `r0   r,   z QueryBase._validate_btwn_operandD   s    w<1@AAbtGXGXG_G_Gabb1$t*>??gaj',,/58>??gaj',,/58>?? 9r2   c                     t              dk7  rt        d      t        fd| j                  j	                         D              st        dt        |        dd    d      t        d   t        j                        d	u rt        d
      y )Nr   z"Operand must be length 2 for GT/LTc              3   ,   K   | ]  }d    |v   ywrH   rI   rJ   s     r0   rA   z,QueryBase._validate_gt_lt.<locals>.<genexpr>Q   rL   rM   rN   rO   r   rP   r;   Fz!Invalid comparison type for GT/LTr[   rE   s    `r0   r-   zQueryBase._validate_gt_ltN   s    w<1ABBbtGXGXG_G_Gabb1$t*R
|1MNNgaj',,/58?@@ 9r2   c                 
   t              dk  rt        d      t        fd| j                  j	                         D              st        dt        |        dd    d      d   | j                  v r| j                  d      }t        |t              r3 t               j                  |j	                         D cg c]  }| c} }t        dt                    D ]  }|   |vst        d	|    d       y y c c}w )
Nr   z#Operand must be length 2+ for IS-INc              3   ,   K   | ]  }d    |v   ywrH   rI   rJ   s     r0   rA   z3QueryBase._validate_isin_operand.<locals>.<genexpr>Z   rL   rM   rN   rO   r   rP   r;   rQ   )r'   r(   rR   r6   rS   rD   r9   r$   rT   rU   rV   range)r/   r   rW   r@   is    `   r0   r)   z QueryBase._validate_isin_operandV   s    w<!BCCbtGXGXG_G_Gabb1$t*R
|1MNN1:***""71:.B"d# !SU[[biik":1":;1c'l+ I1:R'$'9'!*Q%GHHI +
 #;s   >	D c                 D   | j                   }| j                  }| j                   dk(  r=d}| j                  dd  D cg c]#  } t        |       d| j                  d   |g      % }}||D cg c]$  }t        |t              r|j                         n|& c}dS c c}w c c}w )Nr   r   r;   r   r   )r   r.   )r   r.   rD   r$   r   to_dict)r/   opopsvos        r0   re   zQueryBase.to_dictf   s    ]]mm==G#BDHMMRSRTDUVq:4:dT]]1%5q$9:VCVQTUA
1i(@aGU
 	
 W Vs   (B*)Bc                    dz  | j                   j                  }t        | j                  t              rt        d | j                  D              r=dj                  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                y wr=   r>   )r?   rf   s     r0   rA   z%QueryBase.__repr__.<locals>.<genexpr>x   s     E:b),ErB   z,
c              3      K   | ]8  } d t        |t              r|j                  dz         n
t        |        : yw)rk   r;   N)r$   r   __repr__repr)r?   rf   indent
indent_strs     r0   rA   z%QueryBase.__repr__.<locals>.<genexpr>z   sD      * "l"
2y@YR[[!%<_cdf_g$hi*s   >A(z, [

z])z, ))		__class____name__r$   r.   r%   rR   joinr   ro   )r/   rp   
class_nameoperands_strrq   s    `  @r0   rn   zQueryBase.__repr__r   s    F]
^^,,
dmmT*Et}}EE$zz *"mm*   %Qt}}oU<.:,VXYY %Qt}}oRT]]8K7LANN !\4==/D4G3HJJr2   c                 "    | j                         S r=   )rn   r5   s    r0   __str__zQueryBase.__str__   s    }}r2   )r   )rv   
__module____qualname__strr   r   r	   r\   r]   r1   propertyr   r6   r   r9   r*   r+   r,   r-   r)   re   rn   r{   rI   r2   r0   r   r      sq      ud;6GsTYZ_`celeqeq`qZruxZxTyOyIz6z/|  0 Wd W  W Wd W  WM[0A Md MEDsGLL7H1I,J Et E@d5gll9J3K.L @QU @AtE#w||2C,D'E A$ AId;.? ID I 

 

KC 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g      i      edefd              Zy	)
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)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)rv   r|   r}   __doc__r   r   r   r   r   r6   r
   r9   rI   r2   r0   r   r      s    ( 46]^t6uvw&d &  x& ,.UVl  |F  {G  /H  I  J&d &  J&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y)	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)rv   r|   r}   r   r   r   r   r   r   r6   r   r9   rI   r2   r0   r   r      ss    , 46]^r6stu$d $  v$ ,.UVj.klm$d $  n$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 I E 5 NCuS',,./0{ {|%&) %&P'$	 '$r2   