
    g2                        S r SSKJr  SSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
Jr  SS	KJr  SS
KJr  SSKJrJr  SSKJrJrJr  SSKJr  SSKJr  SSKJrJr  Sr\S/ 4SSSSSSSSSS/ 44-   r\SSSS S!S"S#S$S%S&S'S(/ 4S)S*S+4-   r  " S, S-5      r!g).zData handler for HACS.    )annotationsN)UTCdatetime)Any)callback)HomeAssistantError   )HacsBase)HACS_REPOSITORY_ID)HacsDisabledReasonHacsDispatchEvent)TOPIC_FILTERHacsManifestHacsRepository   )LOGGER)is_safe)async_load_from_storeasync_save_to_store)newF)	full_name authors)categoryr   )descriptionr   )domainN)	downloadsr   )etag_repositoryN)hideF)last_updatedr   r   )stargazers_countr   topics)archivedF)config_flowF)default_branchN)first_installF)installed_commitN)	installedF)last_commitN)last_versionN)manifest_nameN)open_issuesr   )
prereleaseNpublished_tags)releasesF)selected_tagN)	show_betaFc                      \ rS rSrSrSS jrSS jrSSS jjrSS jrSS jr	\
SS	 j5       r\
SS
 j5       rS r S   SS jjr\
SS j5       rSrg)HacsData:   zHacsData class.c                4    [         U l        Xl        0 U l        g)zInitialize.N)r   loggerhacscontent)selfr8   s     ,/config/custom_components/hacs/utils/data.py__init__HacsData.__init__=   s    	    Nc                >   #    U R                  SS9I Sh  vN   g N7f)zForce write.T)forceN)async_write)r:   _s     r;   async_force_writeHacsData.async_force_writeC   s     T***s   c                  #    U(       d&  U R                   R                  R                  (       a  gU R                  R	                  S5        [        U R                   R                  SU R                   R                  R                  U R                   R                  R                  U R                   R                  R                  S.5      I Sh  vN   U R                  5       I Sh  vN   U R                  5       I Sh  vN   g N5 N N	7f)z!Write content to the store files.Nz"<HacsData async_write> Saving datar8   )archived_repositoriesrenamed_repositoriesignored_repositories)r8   systemdisabledr7   debugr   hasscommonrF   rG   rH   +_async_store_experimental_content_and_repos_async_store_content_and_repos)r:   r@   s     r;   rA   HacsData.async_writeG   s     ))22>? "IINN)-)9)9)O)O(,		(8(8(M(M(,		(8(8(M(M
 	
 	
 >>@@@11333	
 	A3s6   CD	DD	%D&D	=D>D	D	D	c                  #    0 U l         U R                  R                  R                   HN  nUR                  R
                  U R                  R                  R                  ;   d  M=  U R                  U5        MP     [        U R                  R                  SU R                   5      I Sh  vN   [        R                  [        R                  4 H  nU R                  R                  U0 5        M!     g NH7f)<Store the main repos file and each repo that is out of date.repositoriesN)r9   r8   rS   list_alldatar   rM   
categoriesasync_store_repository_datar   rL   r   
REPOSITORYCONFIGasync_dispatch)r:   rB   
repositoryevents       r;   rO   'HacsData._async_store_content_and_repos[   s      ))0099J''499+;+;+F+FF00< : "$))...$,,OOO'224E4L4LMEII$$UB/ N 	Ps   A!C5'AC5*C3+A	C5c                l  #    0 U l         U R                  R                  R                   HN  nUR                  R
                  U R                  R                  R                  ;   d  M=  U R                  U5        MP     [        U R                  R                  SSU R                   05      I Sh  vN   g N7f)rR   rU   rS   N)r9   r8   rS   rT   rU   r   rM   rV   (async_store_experimental_repository_datar   rL   )r:   rB   r[   s      r;   rN   4HacsData._async_store_experimental_content_and_reposg   s}      ))0099J''499+;+;+F+FF==jI : "$))..&>4<<:XYYYs   A!B4'AB4,B2-B4c                   SUR                   R                  0nUR                  R                  (       a  [        O[
         H&  u  p4[        UR                  X45      =oT:w  d  M"  XRU'   M(     UR                  R                  (       a  UR                  R                  US'   UR                  R                  (       a'  UR                  R                  R                  5       US'   X R                  [        UR                  R                  5      '   g)zStore the repository data.repository_manifestversion_installedlast_fetchedN)rb   manifestrU   r)   #EXPORTED_DOWNLOADED_REPOSITORY_DATAEXPORTED_REPOSITORY_DATAgetattrinstalled_versionrd   	timestampr9   stridr:   r[   rU   keydefaultvalues         r;   rW   $HacsData.async_store_repository_dataq   s     &z'E'E'N'NO (( 0)* C
 !#??K!S	* ??,,(2(I(ID$%??''#-??#?#?#I#I#KD 04S++,-r>   c                $   0 nU R                   R                  UR                  R                  / 5        UR                  R                  (       a  UR
                  R                  US'   [         H&  u  p4[        UR                  X45      =oT:w  d  M"  XRU'   M(     UR                  R                  (       a  UR                  R                  US'   UR                  R                  (       a'  UR                  R                  R                  5       US'   O0[         H&  u  p4[        UR                  X45      =oT:w  d  M"  XRU'   M(     U R                   UR                  R                     R                  S[        UR                  R                  5      0UE5        g)zGStore the experimental repository data for non downloaded repositories.rb   rc   rd   rl   N)r9   
setdefaultrU   r   r)   rb   re   rf   rh   ri   rd   rj   EXPORTED_BASE_DATAappendrk   rl   rm   s         r;   r_   1HacsData.async_store_experimental_repository_data   s*    
 8 8"=??$$*4*H*H*Q*QD&' C$Z__cCCEO %I !D 00,6OO,M,M()++'1'C'C'M'M'O^$ 2$Z__cCCEO %I !3 	Z__--.55tSASAS=T6]X\6]^r>   c                z  #    SU R                   R                  l        0 n0 n [        U R                   R                  S5      I Sh  vN =(       d    0 n [        U R                   R                  S5      I Sh  vN nU(       dl  [        U R                   R                  S5      I Sh  vN =n(       a=  UR                  S0 5      R                  5        H  u  pEU H  nSU0UEXS   '   M     M     U(       d#  U(       d  S
U R                   R                  l        g
U R                  R!                  S5        [#        5       U R                   R$                  l        [#        5       U R                   R$                  l        0 U R                   R$                  l        UR                  S0 5      nU H=  n	UR                  U	5      n
X;  d  M  XR                   R$                  R*                  U	'   M?     UR                  S[#        5       5       HW  n	XR                   R$                  R&                  ;  d  M(  U R                   R$                  R&                  R-                  U	5        MY     UR                  S[#        5       5       HW  n	XR                   R$                  R(                  ;  d  M(  U R                   R$                  R(                  R-                  U	5        MY      U R/                  U5      I Sh  vN   UR                  5        H:  u  pU	S:X  a  U R                  R1                  SX5        M)  U R3                  X5        M<     U R                  R!                  S5        g
 GN! [
         a     GNf = f GN GN! [
         a  nU R                   R                  R                  SU R                   R                  R                  R                  S	5      U5        U R                   R                  [        R                  5         SnAgSnAff = f GN! [4         a$  nU R                  R7                  SXwS9   SnAgSnAff = f7f)zRestore saved data.Fr8   NrS   rU   r   rl   z6Could not read %s, restore the file from a backup - %sz.storage/hacs.dataTz"<HacsData restore> Restore startedrG   rF   rH   0z3<HacsData restore> Found repository with ID %s - %sz<HacsData restore> Restore donez'<HacsData restore> [%s] Restore Failed!)exc_info)r8   statusr   r   rL   r   getitemslogerrorconfigpathdisable_hacsr   RESTOREr7   infosetrM   rF   rH   rG   addregister_unknown_repositoriesrK   async_restore_repositoryBaseExceptioncritical)r:   rS   r8   rU   r   entriesr[   	exceptionrenamedentryrp   	repo_datas               r;   restoreHacsData.restore   sS    $			.tyy~~vFFL"D	!6tyy~~~!VVL3HY_3`-`%`T%`)-.")E)K)K)M%H&-
:Dh9]R\9]%56 '. *N L#'DII => 25		.03		-02		- ((126EKK&E#?D		  55e<  XX5su=EII,,BBB		  66::5A >
 XX4ce<EII,,AAA		  5599%@ =	44\BBB$0$6$6$8 C<KK%%Mu --e? %9 KK>? M G! 		 W-`
 " 	IIMMH		%%**+?@
 II""#5#=#=>	N C 	 KK  99 !  	s    P;#M MM #M3 8M-9.M3 'M0(AM3 0CP;A$P;-A1P;"3P;P
 *P+A-P
 P;M 
M*&P;)M**P;-M3 0M3 3
P=A=O?:P;?PP;P
 

P8P3.P;3P88P;c                  #    [        UR                  5       5       H  u  nu  pEUS:X  d;  UR                  SU5      b(  U R                  R                  R                  US9(       a  MK  U R                  R                  US   UR                  SU5      SUS9I Sh  vN   US-  S	:X  d  M  [        R                  " S	5      I Sh  vN   M     g N2 N7f)
z"Registry any unknown repositories.rx   r   N)repository_idr   F)repository_full_namer   checkr   d   r   )		enumerater|   r{   r8   rS   is_registeredasync_register_repositoryasynciosleep)r:   rS   r   repo_idxr   r   s         r;   r   &HacsData.register_unknown_repositories   s      -6l6H6H6J,K(H(u ==X6>99))77e7L))55%.{%;"z8<#	 6    #~"mmA&&&# -L 's*   BCCC)CC
CCc                   SnUR                  S5      =n(       a%  U R                  R                  R                  U5      nU(       d%  U R                  R                  R	                  U5      nU(       d  g U R                  R                  R                  X15        UR                  S/ 5      UR                  l
        UR                  SS5      UR                  l        UR                  SS5      UR                  l        UR                  S	S5      UR                  l        U R                  R                  R                  (       aA  UR                  S
5      UR                  l        UR                  SS5      UR                  l        UR                  S5      UR                  l        UR                  S/ 5       Vs/ s H  of[&        ;  d  M  UPM     snUR                  l        UR                  S5      UR                  l        UR                  S5      =(       d    UR                  SS5      UR                  l        UR                  S5      UR.                  l        UR                  SS5      UR                  l        UR                  SS5      UR                  l        UR                  SS5      UR                  l        UR                  S5      UR                  l        UR                  SS5      UR                  l        UR                  S5      UR                  l        UR                  S5      UR                  l        UR                  S5      UR                  l        UR                  S5      UR                  l         UR                  S5      UR                  l!        UR                  S5      UR                  l"        UR                  S5      =n(       a*  [F        RH                  " U[J        5      UR                  l&        [N        RP                  " UR                  S5      =(       d    UR                  S 5      =(       d    0 5      Ul)        UR                  R<                  UR                  R:                  :X  a  SUR                  l        URT                  bJ  [W        U R                  URT                  5      (       a%  URT                  URX                  RZ                  l.        UR                  R2                  (       a  SUR                  l/        U[`        :X  a7  U R                  Rb                  UR                  l         S!UR                  l        gg! [         a&  nU R                  R                  SU5         SnAgSnAff = fs  snf )"zRestore repository.Nr   z4<HacsData async_restore_repository> duplicate IDs %sr   r   r   r   r   r!   etag_releasesr-   r   r#   r   r"   starslast_release_tagr0   Fr)   r   r1   r2   r+   r.   r*   rc   r(   r,   rd   re   rb   T)2r{   r8   rS   get_by_full_name	get_by_idset_repository_id
ValueErrorr7   warningrU   r   r   r   r!   rI   	generatorr   r-   r   r   r#   r   r"   r0   last_releaser)   r   r1   r2   r+   r.   r*   ri   r(   r,   r   fromtimestampr   rd   r   	from_dictrb   	localpathr   r9   r   localr'   r   version)r:   r   repository_datar[   r   r   topicrd   s           r;   r   !HacsData.async_restore_repository  s#    -1
'++K8898//@@KJ//99%@J	II""44ZG #2"5"5i"D
&5&9&9-&L
#$3$7$7Q$G
!'6':':>1'M
$99%%,;,?,?,PJOO)*9*=*=mQ*OJOO'*9*=*=>O*P
'.228R@"
@eQ]D]E@"

 "1!4!4X!>
+:+>+>,
 ,-  !, 	( ,;+>+>?Q+R
(#2#6#6z5#I
 $3$7$7U$K
!-11%?
'6':':>'J
$$3$7$7U$K
!'6':':>'J
$%4%8%8%F
"&5&9&9-&H
#,;,?,?@S,T
)+:+>+>?Q+R
((7(;(;O(L
%*..~>><>+3+A+A,PS+TJOO()5)?)?
+_/B/BCX/Y_]_*

& ??%%)E)EE)-JOO&+		:CWCW0X0X,6,@,@J##)??$$,1JOO)&&04		0A0AJOO-(,JOO% 'e  	KK VXab	"
s$   5%U 8V	V
U?U::U?)r9   r8   r7   )r8   r
   )N)F)r@   boolreturnNone)r[   r   r   dict)r[   r   r   r   )rS   zdict[str, dict[str, Any]]r   z
str | None)r   rk   r   zdict[str, Any])__name__
__module____qualname____firstlineno____doc__r<   rC   rA   rO   rN   r   rW   r_   r   r   r   __static_attributes__ r>   r;   r4   r4   :   s    +4(
0Z 5 5& _ _,M` OS'5'AK'. @- @-r>   r4   )"r   
__future__r   r   r   r   typingr   homeassistant.corer   homeassistant.exceptionsr   baser
   constr   enumsr   r   repositories.baser   r   r   r7   r   r   r   storer   r   rt   rg   rf   r4   r   r>   r;   <module>r      s     "  "  ' 7  & 9 J J   = 
 .OrN1   '?rB ' #&I- I-r>   