
    i                         d dl Z d dlZd dlmZmZmZmZ d dlmZ  ej        d          Z	de
de
fdZdee
ef         dee
ef         fd	Zd
ee
z  dz  defdZdee
z  defdZd ZdededefdZdS )    N)datedatetime	timedeltatimezone)Anyz;((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z])|(?<=[a-zA-Z])[0-9])	camel_strreturnc                 `    t                               d|           }|                                S )Nz_\1)CAMEL_TO_SNAKEsublower)r   	snake_strs     F/root/projects/butler/venv/lib/python3.11/site-packages/garth/utils.pycamel_to_snaker      s'    ""6955I??    
camel_dictc                     i }|                                  D ]f\  }}t          |          }t          |t                    rt	          |          ||<   <t          |t
                    rd |D             ||<   a|||<   g|S )z}
    Converts a dictionary's keys from camel case to snake case. This version
    handles nested dictionaries and lists.
    c                 Z    g | ](}t          |t                    rt          |          n|)S  )
isinstancedictcamel_to_snake_dict).0is     r   
<listcomp>z'camel_to_snake_dict.<locals>.<listcomp>   sB     # # #IJ*Q*=*=D#A&&&1# # #r   )itemsr   r   r   r   list)r   
snake_dictkvnew_keys        r   r   r      s    
 "$J  "" 	$ 	$1 ##a 	$"5a"8"8Jw4   	$# #NO# # #Jw #$Jwr   endc                     | t          j                    } n)t          | t                    rt          j        |           } | S )N)r   todayr   strfromisoformat)r"   s    r   format_end_dater'   $   s;    
{jll	C		 & %%Jr   date_daysc              #      K   t          | t                    r| nt          j        |           } t          |          D ]}| t	          |          z
  V  d S )N)r)   )r   r   r&   ranger   )r(   r)   days      r   
date_ranger-   ,   sg      t,,KEE$2DU2K2KET{{ * *iS))))))))* *r   c                 `   t          j        |           rGi }t          j        |           D ].}t          | |j                  }t          |          ||j        <   /|S t          | t                    rd | D             S t          | t          t          z            r| 
                                S | S )Nc                 ,    g | ]}t          |          S r   )asdict)r   r    s     r   r   zasdict.<locals>.<listcomp>;   s    '''aq		'''r   )dataclassesis_dataclassfieldsgetattrnamer0   r   r   r   r   	isoformat)objresultfieldvalues       r   r0   r0   2   s    $$  ',, 	/ 	/EC,,E!'F5:#t (''3''''#x$'' }}Jr   gmt_timestamplocal_timestampc                     || z
  }t          t          |                    }t          j        | dz  t           j                  }|                    |          S )N)millisecondsi  )r   r   r   fromtimestamputc
astimezone)r;   r<   
local_difflocal_offsetgmt_times        r   get_localized_datetimerE   C   sS     !=0JI:>>>??L%md&:HLIIH|,,,r   )r1   rer   r   r   r   typingr   compiler   r%   r   r   r   r'   intr-   r0   rE   r   r   r   <module>rJ      sR       				 8 8 8 8 8 8 8 8 8 8 8 8       B 
c c    
DcN tCH~    &d* t    *dSj * * * * *  "--),-- - - - - -r   