
    7j                         d dl mZ d dlmZ d dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d Zd Zd	 Z G d
 d      Z G d de      Zy)    )environ)PathN)cli)validate	json_load)UserspaceJSONEncoderc                     g } t        j                  d      st        t         d         }t        |j                        dkD  rI|dz  j                         r| j                  |       |j                  }t        |j                        dkD  rIt        j                  d      At        t         d         j                         }|j                         r| j                  |       t        j                  j                  j                  jt        t        j                  j                  j                        j                         j                         }|j                         r| j                  |       t        t         j#                  |             S )NORIG_CWD   qmk.jsonQMK_USERSPACE)r   getr   lenpartsis_fileappendparent
expanduseris_dirr   configuseroverlay_dirresolvelistdictfromkeys)	test_dirscurrent_dirs     F/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/userspace.pyqmk_userspace_pathsr       s,   I {{:*7:./+##$q(j(113  -%,,K +##$q( {{?#/7?34??A[) zz"".3::??667BBDLLN[) i())    c                 \    | dz  j                         rt        | dz         y t        d      )Nr   zNo qmk.json file found.)r   UserspaceDefsFileNotFoundError)paths    r   qmk_userspace_validater&   )   s1    z""$dZ'( 5
66r!   c                  v    t               } | D ]  }	 t        |       |c S  y # t        $ r Y  t        $ r Y *w xY wN)r    r&   r$   UserspaceValidationError)r   test_dirs     r   detect_qmk_userspacer+   3   sO    #%I 	"8,O 	 ! 	' 		s   "	888c                   F    e Zd ZdefdZd ZddZddZd Zd Z	d	 Z
d
 Zy)r#   userspace_jsonc                    || _         g | _        t        |      }t               }d}	 t	        |d       d| j                  fd| j                  fg}|D ]$  }|d   }|d   }		 t	        ||        |	|       d} n |s|y # t
        j                  $ r}|j                  d|       |d }~ww xY w# t
        j                  $ r}|j                  ||       Y d }~d }~ww xY w)NFzqmk.user_repo.v0qmk.user_repo.v1_1zqmk.user_repo.v1r   r   T)
r%   build_targetsr   r)   r   
jsonschemaValidationErroradd_UserspaceDefs__load_v1_1_UserspaceDefs__load_v1)
selfr-   json	exceptionsuccesserrschema_versionsvschemaloaders
             r   __init__zUserspaceDefs.__init__B   s    "	(,.		T-. "4#3#340

 ! 		+AqTFqTF+v&t		+ O + )) 	MM,c2O	$ -- +fc**+s/   A= B,=B)B$$B),C?CCc                 ^   dg d}| j                   D ]  }t        |t              r7|d   |d   g}d|v r|j                  |d          |d   j                  |       Jt        |t              s[|d   j                  t        |j                  | j                  j                                      	 t        |d       t        j                   t        j"                  | j                  j%                               t&        d
      }t        j                   |t&        d
      }||k7  rH| j                  j)                  |       t        j                  j+                  d| j                   d       y
# t        j                  $ r,}t        j                  j                  d|        Y d }~y	d }~ww xY w)Nz1.1)userspace_versionr0   keyboardkeymapenvr0   r/   zCould not save userspace file: FT)cls	sort_keyszSaved userspace file to .)r0   
isinstancer   r   r   strrelative_tor%   r   r   r1   r2   r   logerrorr7   dumpsloads	read_textr   
write_textinfo)r6   target_jsoneentryr:   old_datanew_datas          r   savezUserspaceDefs.saved   s`   !&

 ## 	ZA!T":(4A:LL5*O,33E:At$O,33CdiiFVFV8W4XY	Z	["67 ::djj)<)<)>?EYeij::k/CtTxII  *GGLL3DII;a@A )) 	GGMM;C5AB	s   0E- -F, "F''F,Nc                    |~t        |      }|| j                  vrA| j                  j                  |       |rGt        j                  j                  d| d       y t        j                  j                  | d       y y ||||d}|||d<   || j                  vrE| j                  j                  |       |r't        j                  j                  d| d| d       y y |r&t        j                  j                  | d| d       y y y y )NzAdded z to userspace build targets.z% is already a userspace build target.rB   rC   rD   :)r   r0   r   r   rK   rQ   r6   rB   rC   	build_env	json_pathdo_printrS   s          r   
add_targetzUserspaceDefs.add_target   s    YI 2 22"")))4GGLL6)4P!QR	{*OPQ 
 !f&8%8A$$%***""))!,GGLL6(1VH<X!YZ  GGLLH:Qvh6[!\]  '9!r!   c                    |~t        |      }|| j                  v rA| j                  j                  |       |rGt        j                  j                  d| d       y t        j                  j                  | d       y y ||||d}|||d<   || j                  v rE| j                  j                  |       |r't        j                  j                  d| d| d       y y |r&t        j                  j                  | d| d       y y y y )NzRemoved z from userspace build targets.z! is not a userspace build target.rY   rD   rZ   )r   r0   remover   rK   rQ   r[   s          r   remove_targetzUserspaceDefs.remove_target   s    YID..."")))4GGLL8I;6T!UV	{*KLM 
 !f&8%8A$$%D&&&""))!,GGLL8H:Qvh>\!]^  GGLLH:Qvh6W!XY  '9!r!   c                 :    |d   D ]  }| j                  |        y Nr0   )_UserspaceDefs__load_v1_targetr6   r7   rS   s      r   	__load_v1zUserspaceDefs.__load_v1   s$    o& 	%A!!!$	%r!   c                 :    |d   D ]  }| j                  |        y rd   ) _UserspaceDefs__load_v1_1_targetrf   s      r   __load_v1_1zUserspaceDefs.__load_v1_1   s$    o& 	'A##A&	'r!   c                 0   t        |t              r(t        |      dk(  r| j                  |d   |d   d       t        |t              rN| j
                  j                  |z  }|j                         r$|j                  dk(  r| j                  |d       y y y y )N   r   r   F)rB   rC   r^   z.json)r]   r^   )	rH   r   r   r_   rI   r%   r   existssuffix)r6   rS   ps      r   __load_v1_targetzUserspaceDefs.__load_v1_target   s~    a3q6Q;OOQqT!A$OGa		  1$Axxzahh'1!e< 2z r!   c                     t        |t              r-t        |      dk(  r| j                  |d   |d   |d   d       y | j	                  |       y )N   r   r   rl   F)rB   rC   r\   r^   )rH   r   r   r_   re   )r6   rS   s     r   __load_v1_1_targetz UserspaceDefs.__load_v1_1_target   sE    a3q6Q;OOQqT!A$!A$QVOW!!!$r!   )NNNNT)__name__
__module____qualname__r   r?   rW   r_   rb   r5   r4   re   ri    r!   r   r#   r#   A   s4     t  D<^0Z0%'=%r!   r#   c                   :     e Zd Z fdZd Zed        Zd Z xZS )r)   c                 2    t        |   |i | g | _        y r(   )superr?   %_UserspaceValidationError__exceptions)r6   argskwargs	__class__s      r   r?   z!UserspaceValidationError.__init__   s    $)&)r!   c                     | j                   S r(   )messager6   s    r   __str__z UserspaceValidationError.__str__   s    ||r!   c                     | j                   S r(   )r{   r   s    r   
exceptionsz#UserspaceValidationError.exceptions   s       r!   c           	          | j                   j                  ||f       dj                  | j                   D cg c]  \  }}| d|  c}}      }d| | _        y c c}}w )Nz

z: zICould not validate against any version of the userspace schema. Errors:

)r{   r   joinr   )r6   r=   r8   	errorlists       r   r3   zUserspaceValidationError.add   sa      &)!45KKSWSdSd e>OfiF82i[!9 ef	dendop !fs   A
)	rt   ru   rv   r?   r   propertyr   r3   __classcell__)r~   s   @r   r)   r)      s'     ! !qr!   r)   )osr   pathlibr   r7   r1   milcr   qmk.json_schemar   r   qmk.json_encodersr   r    r&   r+   r#   	Exceptionr)   rw   r!   r   <module>r      sF         / 2*67F% F%Rqy qr!   