
    U>qj8*                        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y)    )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y)	QueryBaseoperatoroperandc                    |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      V/opt/rentech/trading_bot/.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   r9   s    r:   valid_fieldszQueryBase.valid_fields(        $$U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      y )N   z$Operand must be length longer than 1c              3   <   K   | ]  }t        |t                y wNr.   r    ).0es     r:   	<genexpr>z5QueryBase._validate_or_and_operand.<locals>.<genexpr>5   s     9Az!Y'9   FzOperand must be type z for OR/AND)r1   r2   allr0   typer9   r"   s     r:   r4   z"QueryBase._validate_or_and_operand2   sL    w<1CDD999UB3DJ<{KLL Cr<   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 rI   fields_by_typer"   s     r:   rK   z1QueryBase._validate_eq_operand.<locals>.<genexpr><        b^GAJ.0b   Invalid field for  "r   "rE   Invalid EQ value ")r1   r2   anyr@   valuesrN   rC   r.   dictsetunion)r9   r"   vvrJ   s    `  r:   r5   zQueryBase._validate_eq_operand8   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rR   rS   rT   s     r:   rK   z3QueryBase._validate_btwn_operand.<locals>.<genexpr>J   rV   rW   rX   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btGXGXG_G_Gabb1$t*>??gaj',,/58>??gaj',,/58>?? 9r<   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rR   rS   rT   s     r:   rK   z,QueryBase._validate_gt_lt.<locals>.<genexpr>T   rV   rW   rX   rY   r   rZ   rE   Fz!Invalid comparison type for GT/LTre   rO   s    `r:   r7   zQueryBase._validate_gt_ltQ   s    w<1ABBbtGXGXG_G_Gabb1$t*R
|1MNNgaj',,/58?@@ 9r<   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rR   rS   rT   s     r:   rK   z3QueryBase._validate_isin_operand.<locals>.<genexpr>]   rV   rW   rX   rY   r   rZ   rE   r[   )r1   r2   r\   r@   r]   rN   rC   r.   r^   r_   r`   range)r9   r"   ra   rJ   is    `   r:   r3   z QueryBase._validate_isin_operandY   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%   rE   r'   r   )r!   r8   )r!   r8   rN   r.   r    to_dict)r9   opopsvos        r:   ro   zQueryBase.to_dicti   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rG   rH   )rI   rp   s     r:   rK   z%QueryBase.__repr__.<locals>.<genexpr>{   s     E:b),ErL   z,
c              3      K   | ]8  } d t        |t              r|j                  dz         n
t        |        : yw)ru   rE   N)r.   r    __repr__repr)rI   rp   indent
indent_strs     r:   rK   z%QueryBase.__repr__.<locals>.<genexpr>}   sD      * "l"
2y@YR[[!%<_cdf_g$hi*s   >A(z, [

z])z, ))		__class____name__r.   r8   r/   r\   joinr!   ry   )r9   rz   
class_nameoperands_strr{   s    `  @r:   rx   zQueryBase.__repr__u   s    F]
^^,,
dmmT*Et}}EE$zz *"mm*   %Qt}}oU<.:,VXYY %Qt}}oRT]]8K7LANN !\4==/D4G3HJJr<   c                 "    | j                         S rG   )rx   r?   s    r:   __str__zQueryBase.__str__   s    }}r<   )r   )r   
__module____qualname__Operatorr   r   strrf   rg   r;   propertyr   r   r@   rC   r4   r5   r6   r7   r3   ro   rx   r   rS   r<   r:   r    r       s\      E4;LdSViY]^e^j^jYk;k4m  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( 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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_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]^t6uvw&d &  x& ,.UVl  |F  HR  {S  /T  U  V&d &  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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   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      ss    , 46]^r6stu$d $  v$ ,.UVj.klm$d $  n$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y)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      ss    ( 46]^q6rst#d #  u# ,.UVi.jkl#d #  m#r<   r   )abcr   r   rf   typingr   r   r   r   r	   yfinance.constr
   r   r   r   r   r   yfinance.exceptionsr   utilsr   r   r   rg   r   r   r    r   r   r   rS   r<   r:   <module>r      sz    #  6 6 I E C 5 NCuS',,./0OP{ {|%&) %&P'$	 '$R%#y %#r<   