
    mj                        S r SSKrSSKJrJr  SSKJr  SSKJr  \R                  " S5      r
\ " S S5      5       rS	 rS
 rS r\ " S S5      5       r\ " S S5      5       rS rS r\ " S S5      5       rSSSSSSSSSSSSS .r\R                  " S!5      r\R                  " S"5      rS# rS$ r\R                  " S%5      rS& rS' rS( rg))uz   Чтение markdown-таблиц волта: дневной ряд, тренировки, дневник питания.    N)	dataclassreplace)date)Optionalz^\d{4}-\d{2}-\d{2}$c                      \ rS rSr% \\S'   Sr\\   \S'   Sr	\\   \S'   Sr
\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S	'   Sr\\   \S
'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Srg)DayRow   dayNweightfat_pctleanstepsexercise_minhrv
resting_hrsleep_hawake_hactive_kcal	cycle_daymeds )__name__
__module____qualname____firstlineno__r   __annotations__r   r   floatr   r   r   intr   r   r   r   r   r   r   r   str__static_attributes__r       #/home/rasp/health-digest/parsers.pyr   r      s    	I"FHUO"#GXe_# D(5/ E8C="&L(3-&C% $J$#GXe_##GXe_#!%K#%#Ix}#D(3-r!   r   c                     U R                  5       R                  S5      (       d  g U R                  5       R                  S5      R                  S5       Vs/ s H  oR                  5       PM     sn$ s  snf )N|)strip
startswithsplit)linecs     r"   _cellsr*      sV    ::<""3''#zz|11#6<<SABA!GGIABBBs   A2c                 h    U b  U S;   a  g  U" U R                  SS5      5      $ ! [         a     g f = f)N u   —-,.)r   
ValueError)rawcasts     r"   _numr4   "   s?    
{c--CKKS)** s   $ 
11c                     U b  U S;   a  g U $ )Nr,   r   )r2   s    r"   _textr6   +   s    
{c--Jr!   c                   X    \ rS rSr% \\S'   \\S'   \\S'   Sr\	\   \S'   \
S 5       rSrg)	Workout1   r
   kindminutesNavg_hrc                 <    SU R                   R                  5       ;   $ )Nu
   силов)r:   lower)selfs    r"   is_strengthWorkout.is_strength8   s    tyy000r!   r   )r   r   r   r   r   r   r   r   r<   r   propertyr@   r    r   r!   r"   r8   r8   1   s1    	I
IL FHSM 1 1r!   r8   c                   H    \ rS rSr% \\S'   Sr\\   \S'   Sr	\\   \S'   Sr
g)Measurement=   r
   Nr   r   r   )r   r   r   r   r   r   r   r   r   r   r    r   r!   r"   rD   rD   =   s#    	I"FHUO"#GXe_#r!   rD   c           	         0 nU R                  5        H  n[        U5      nU(       a,  [        R                  US   5      (       a  [	        U5      S:  a  MC  U Vs/ s H2  oDR                  SS5      R                  SS5      R                  5       PM4     nn[        R                  " US   5      n[        U[        US   [        5      [	        U5      S:  a  [        US   [        5      OSS9X'   M     U$ s  snf )	u  Таблица замеров веса и состава тела → {date: Measurement}.

Нужна потому, что health-sync кладёт вес в дневной ряд с задержкой,
а свежий замер появляется здесь раньше.
r      *r-   %   N)r
   r   r   )
splitlinesr*   DATE_REmatchlenr   r%   r   fromisoformatrD   r4   r   )textrowsr(   cellsr)   cleanr
   s          r"   parse_body_compositionrT   D   s     D!tGMM%(33s5zA~FKLe3#++C4::<eL  q*a%(-0Z!^Dq5)
	 " K Ms   9C4c                 
   [        U 5      nUR                  5        Hc  u  p4UR                  c  M  UR                  U5      nUc  [	        X4R                  S9X#'   M?  UR                  b  MN  [        XTR                  S9X#'   Me     U$ )u{   Дополняет дневной ряд весом из замеров. Состав тела не переносится.)r
   r   )r   )dictitemsr   getr   r   )daysmeasurementsmergedr
   measurementrows         r"   merge_weightsr^   Y   sw    $ZF(..0%jjo; S1C1CDFKZZ!#.@.@AFK 1 Mr!   c                   ~    \ rS rSr% \\S'   Sr\\   \S'   Sr	\\   \S'   Sr
\\   \S'   Sr\\   \S'   Sr\\S	'   S
rg)
FoodTotalsg   r
   NkcalproteinfatcarbsF	estimatedr   )r   r   r   r   r   r   rb   r   r   rc   rd   re   rf   boolr    r   r!   r"   r`   r`   g   sI    	I D(5/ #GXe_#C%!E8E?!Itr!   r`   rJ   rG                     	   
   r	      )u
   январu   февралu   мартu
   апрелu   маu   июнu   июлu   августu   сентябрu   октябрu
   ноябрu   декабрu'   ^##\s+([А-Яа-яЁё]+)\s+(\d{4})\s*$u   ^###\s+(\d{1,2})\s+([а-яё]+)c                     U R                  5       n [        [        R                  5       S S9 H  u  pU R	                  U5      (       d  M  Us  $    g )Nc                      [        U S   5      * $ )Nr   )rN   )kvs    r"   <lambda>_month_number.<locals>.<lambda>|   s    s2a5zkr!   )key)r>   sortedMONTHSrW   r&   )wordstemnumbers      r"   _month_numberr|   z   sA    ::<Dv||~3IJ??4  M K r!   c                    0 nSnSnU R                  5        GHg  n[        R                  U5      nU(       a  [        UR	                  S5      5      nSnM>  [
        R                  U5      nU(       aP  [        UR	                  S5      5      nU(       a+  U(       a$  [        X'[        UR	                  S5      5      5      OSnM  Ub  SU;  a  M  [        U5      nU(       a  [        U5      S:  a  M  USS  V	s/ s H"  oR                  SS5      R                  5       PM$     n
n	U
 V	s/ s H"  n	[        U	R                  S5      [        5      PM$     nn	[        UUS	   US   US   US
   [!        S U
 5       5      S9X'   SnGMj     U$ s  sn	f s  sn	f )uz   Дневник питания → {date: FoodTotals}. Год берётся из заголовка месяца выше.NrG   rJ   u
   Итогоrj   rH   r-   ~r   rh   c              3   B   #    U  H  oR                  S 5      v   M     g7f)r~   N)r&   ).0r)   s     r"   	<genexpr>#parse_food_diary.<locals>.<genexpr>   s     9S,,s++Ss   )r
   rb   rc   rd   re   rf   )rK   MONTH_HEADING_RErM   r   groupDAY_HEADING_REr|   r   r*   rN   r   r%   r4   lstripr   r`   any)rP   rY   yearcurrentr(   month_headingday_headingmonthrR   r)   r2   valuess               r"   parse_food_diaryr      sr   DDG!(..t4}**1-.DG$**40!+"3"3A"67E E T#k&7&7&:";< 
 ?l$6tE
Q381:>:ayyb!''):>69:c$qxx}e,c:"1Iq	)9S99
 C "F K ?:s   6)F%)F
uD   последний день с данными:\s*(\d{4}-\d{2}-\d{2})c                     [         R                  U 5      nU(       a%  [        R                  " UR	                  S5      5      $ S$ )u^   Дата последнего дня с данными из шапки файла health-sync.rJ   N)FRESHNESS_REsearchr   rO   r   )rP   rM   s     r"   parse_freshnessr      s2    %E164ekk!n-@D@r!   c                    / nU R                  5        H  n[        U5      nU(       a,  [        R                  US   5      (       a  [	        U5      S:  a  MC  [        US   [        5      nUc  M[  UR                  [        [        R                  " US   5      US   U[	        U5      S:  a  [        US   [        5      OSS95        M     U$ )u2   Таблица тренировок → [Workout].r   rh   rG   NrJ   )r
   r:   r;   r<   )rK   r*   rL   rM   rN   r4   r   appendr8   r   rO   )rP   workoutsr(   rR   r;   s        r"   parse_workoutsr      s    H!tGMM%(33s5zA~uQx%?&&uQx01X.1%j1ntE!Hc*$		
 " Or!   c                    0 nU R                  5        GHW  n[        U5      nU(       a  [        R                  US   5      (       d  M5  US/S[	        U5      -
  -  -   n[        [        R                  " US   5      [        US   [        5      [        US   [        5      [        US   [        5      [        US   [        5      [        US   [        5      [        US	   [        5      [        US
   [        5      [        US   [        5      [        US   [        5      [        US   [        5      [        US   [        5      [        US   5      S9U[        R                  " US   5      '   GMZ     U$ )u6   Дневной ряд Apple Health → {date: DayRow}.r   N   rJ   rG   rh   ri   rj   rk   rl   rm   rn   ro   r	   rp   )r
   r   r   r   r   r   r   r   r   r   r   r   r   )rK   r*   rL   rM   rN   r   r   rO   r4   r   r   r6   )rP   rY   r(   rR   paddeds        r"   parse_daily_seriesr      s/   D!tGMM%(33$2E
?33-3""58,q	5)E*fQi'vay#&fQi-VAY&F1Is+E*E*VBZ-6":s+vbz".
Ta)* "( Kr!   )__doc__redataclassesr   r   datetimer   typingr   compilerL   r   r*   r4   r6   r8   rD   rT   r^   r`   rx   r   r   r|   r   r   r   r   r   r   r!   r"   <module>r      s   A 	 *  
**+
,    C 1 1 1 $ $ $*    QAQPQ]^a[]oq

 ::HI >?)X zzabA*r!   