
    7j/2              	          d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ g dZ eg d      ZddgZ d Z!d1dZ"d1dZ#d1dZ$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d  Z/d! Z0 ejb                  d"d#d$%       ejb                  d&d'd(eed)*       ejb                  d+d,d-.       ejd                  d/      ee	d0                                           Z3y)2zFCommand to look over a keyboard/keymap and check for common mistakes.
    )dotty)Path)cli)automagic_keyboardautomagic_keymap)	info_json)keyboard_completerkeyboard_folder_or_allis_all_keyboardslist_keyboards)locate_keymaplist_keymaps)keyboard)git_get_ignored_files)c_source_filespreprocess_c_file)	json_load)zchconf.hz	halconf.hz	mcuconf.hzboard.h)encoder_mapdip_switch_mapcombo	tap_danceviar   vialc                     ddg}|j                  t               t               }t        | d      D ])  }||v s|j	                  d      s|j                  |       + |S )z5Return default like keymaps for a given keyboard
    ansiisoF)include_userspacedefault)extendINVALID_KM_NAMESsetr   
startswithadd)kb
defaultishkeymapsxs       E/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/cli/lint.py_list_defaultish_keymapsr)      s_     %J &'eG"6 
?all95KKN N    Nc                 x   |rt        | |      j                  n
t        |       }g }|sQt        |j                  d         }|j                  dd D ]'  }||z  }|j                  |j                  d             ) |j                  d      D ]$  }|sd|j                  v r|j                  |       & t        |      S )z2Return potential keyboard/keymap readme files
    r      Nz
*readme.mdz**/*readme.mdr&   	r   parentr   r   partsr   globappendr!   )r$   kmsearch_pathreadme_filescurrent_path	path_partfiles          r(   _get_readme_filesr8   &   s     35-B'..(2,KLK--a01$**12. 	AI')3L 1 1, ?@	A   1 "i4::-D!	" |r*   c                 V   |rt        | |      j                  n
t        |       }g }|s@t               }|j                  D ]'  }||z  }|j                  |j                  d             ) |j                  d      D ]$  }|sd|j                  v r|j                  |       & t        |      S )z1Return potential keyboard/keymap build files
    z	*rules.mkz**/*rules.mkr&   r-   )r$   r2   r3   build_filesr5   r6   r7   s          r(   _get_build_filesr;   <   s     35-B'..(2,KKv$** 	?I')3L|00=>	?   0 !i4::-4 	! {r*   c                 z   |rt        | |      j                  n
t        |       }g }|s`t               }|j                  D ]G  }||z  }|j                  |j                  d             |j                  |j                  d             I t        |g      D ]$  }|sd|j                  v r|j                  |       & |S )z0Return potential keyboard/keymap code files
    z*.hz*.cr&   )	r   r.   r   r   r/   r   r0   r   r1   )r$   r2   r3   
code_filesr5   r6   r7   s          r(   _get_code_filesr>   R   s     35-B'..(2,KJv$** 	8I')3Ll//67l//67	8
 }-  i4::-$	  r*   c                     g d}| j                  d      j                  d      D ]  t        fd|D              s y y)z0Check if file contains any unfilled content
    )z
%KEYBOARD%z%REAL_NAME%z%USER_NAME%zimage replace me!z+A short description of the keyboard/projectzThe PCBs, controllers supportedz)Links to where you can find this hardwareutf-8encoding
c              3   &   K   | ]  }|v  
 y wN ).0tokenlines     r(   	<genexpr>z%_is_invalid_readme.<locals>.<genexpr>w   s     1u}1s   TF)	read_textsplitany)r7   tokensrI   s     @r(   _is_invalid_readmerO   i   sG    F 066t< 1&11 r*   c                     | j                  d      j                  d      D ]5  }t        |      dkD  s|j                         r#|j	                  d      r5 y y).Check if file contains any useful content
    r@   rA   rC   r   #FT)rK   rL   lenisspacer"   r7   rI   s     r(   _is_empty_rulesrV   |   sO     066t< t9q=8L r*   c                     t        |       j                  d      D ]5  }t        |      dkD  s|j                         r#|j	                  d      r5 y y)rQ   rC   r   z#pragma onceFT)r   rL   rS   rT   r"   rU   s     r(   _is_empty_includerX      sI     "$'--d3 t9q=8W r*   c                 r    t        |       j                         j                         }|j                  d      S )z$Check file has a license header
    )z/*z//)openreadlinerstripr"   )r7   flines     r(   _has_licenser^      s0     J!((*EL))r*   c                     d}|d   r$d}t         j                  j                  |  d       t         j                  j                  j
                  r)|d   r$d}t         j                  j                  |  d       |S )z-Convert any json errors into lint errors
    Tparse_errorsFz): Errors found when generating info.json.parse_warningszA: Warnings found when generating info.json (Strict mode enabled.))r   logerrorconfiglintstrict)r$   infooks      r(   _handle_json_errorsri      si     
BNEFG
zz$'7"8]^_Ir*   c                     d}t        |j                  dg             }|t        z  D ](  }d}t        j                  j                  |  d|        * |S )zJCheck for features that should never be enabled at the keyboard level
    TfeaturesFz,: Invalid keyboard level feature detected - )r!   getINVALID_KB_FEATURESr   rb   rc   )r$   rg   rh   rk   founds        r(   _handle_invalid_featuresro      s]     
B488J+,H// RHPQR Ir*   c                 p    |j                  d      dk(  r"t        j                  j                  |  d       y)z,Check for invalid keyboard level config
    url zT: Invalid keyboard level config detected - Optional field "url" should not be empty.T)rl   r   rb   warning)r$   rg   s     r(   _handle_invalid_configrt      s/     xx"2$rstr*   c           
          t        | j                               D ]<  \  }}d| j                   d|v sd| j                   d| d|  d| j                   d	c S  y)	zJCheck the ChibiOS conf.h for the correct inclusion of the next conf.h
    z#include_next ""zFound `#include_next "z"` on line z of z, should be `#include_next <z#>` (use angle brackets, not quotes)N)	enumeraterZ   name)targetirI   s      r(   _chibios_conf_includenext_checkr{      sw     V[[]+ `4V[[M+t3+FKK=A3d6(Rnouozozn{  |_  `  `` r*   c           	         g }d}t        | j                               D ]i  \  }}|j                         }d|v r|d|j                  d       }|r||z   }d}|s:|d   dk(  r|dd }H|sKd|vsP|j	                  d| d|  d|        k |S )	zICheck the keyboard-level rules.mk to ensure it only has assignments.
    NrR   \=zNon-assignment code on line + : )rw   rZ   stripindexr1   )rules_mkerrorscontinuationrz   rI   s        r(   _rules_mk_assignment_onlyr      s     FLX]]_- V4zz|$;(C)D$&DLBx4#CRy4 =aS(2dVTU!V$ Mr*   c           	          dfd	t        t        d            }t        |      } |      D ]D  \  }}|j                  |      }||k(  st        j
                  j                  |  d| d| d       F y)Nc              3      K   t        |       D ][  }|r| d| n|}t        | |   t              r | |   |      E d{    6t        | |   t              r
|| |   f S|| |   f ] y7 .w)zIPrint the info.json in a plain text format with dot-joined keys.
        .N)sorted
isinstancedictlist)kb_info_jsonprefixkey
new_prefix_collect_dotted_outputs       r(   r   zA_handle_duplicating_code_defaults.<locals>._collect_dotted_output   s      ,' 		6C.4F81SE*#J,s+T21,s2CZPPPL-t4!<#455!<#455		6 Qs   <A0A. /A0z!data/mappings/info_defaults.hjsonz
: Option "z" duplicates default value of "rv   T)rr   )r   r   r   rl   r   rb   rs   )r$   rg   defaults_map
dotty_infor   	v_defaultv_infor   s          @r(   !_handle_duplicating_code_defaultsr      s    6 T"EFGLtJ0> _Y$GGOOrd*SE1PQZP[[\]^_
 r*   c           	         d}t        | |      }|s%d}t        j                  j                  d| |       |S |t        v r%d}t        j                  j                  d| |       |S t        |j                  j                               }|D ],  }t        j                  j                  |  d| d| d       d}. t        | |      D ]  }t        |      s*t        j                  j                  |  d| d| d       d}|j                  t        v sKt        |      }|Yt        j                  j                  |  d| d	|        d} |S )
z%Perform the keymap level checks.
    TFz%s: Can't find %s keymap.z#%s: The keymap %s should not exist!/: The file "" should not exist!!" does not have a license header!r   )r   r   rb   rc   r    r   r.   as_posixr>   r^   rx   CHIBIOS_CONF_CHECKSr{   )r$   r2   rh   keymap_pathinvalid_filesr7   check_errors          r(   keymap_checkr      sE    
BB'K12r:		;RD	 *+*<*<*E*E*GHM AbTdV3FGH  B' 	D!GGMMRD"\$7XYZB99++9$?K&AbTK=9:	 Ir*   c                    d}t        |       }t        | |      sd}t        | |      sd}t        | |      sd}t	        | |      sd}t        d|  d      }|D ].  }d|v rt        j                  j                  |  d| d       d}0 t        |       s$t        j                  j                  |  d       d}t        |       D ]5  }t        |      st        j                  j                  |  d| d	       d}7 t        |       D ]  }t        |      r't        j                  j                  |  d| d
       d}|j                  dv sDt        |      }|sRd}t        j                  j                  d|        |D ]!  }t        j                  j                  |       #  t        |       D ]  }t!        |      s't        j                  j                  |  d| d       d}|j"                  dv r2t%        |      r't        j                  j                  |  d| d
       d}|j"                  t&        v st)        |      }|t        j                  j                  |  d|        d} |S )z'Perform the keyboard level checks.
    TFz
keyboards/r   keymapr   r   z: Is missing a readme.md file!z!" still contains template tokens!z-" is effectively empty and should be removed!)zrules.mkzL%s: Non-assignment code found in rules.mk. Move it to post_rules.mk instead.r   )zconfig.hr   )r   ri   ro   rt   r   r   r   rb   rc   r8   rO   r;   rV   suffixr   r>   r^   rx   rX   r   r{   )r$   rh   kb_infor   r7   rules_mk_assignment_errorsassignment_errorr   s           r(   keyboard_checkr     sW    
BmGr7+ $B0!"g.,R9)Jrd!*<=M tL.ABC	 R :;<!"% d#GGMMRDTF2STUB
 !$ 44 GGMMRDTF2_`aB;;,&)B4)H&)lnpq(B 4$GGMM"2344  # D!GGMMRDTF2STUB99$ &L6cde99++9$?K&B{m45  Ir*   z--strict
store_truezTreat warnings as errors)actionhelpz-kbz
--keyboardr1   z0Keyboard to check. May be passed multiple times.)r   type	completerr   z-kmz--keymapzThe keymap to check)r   z.Check keyboard and keymap for common mistakes.c                     | j                   j                  j                  s-| j                  j	                  d        | j
                          yt        | j                   j                  j                  t              r"| j                   j                  j                  g}nct        d | j                  j                  D              rt               }n2t        t        | j                   j                  j                              }g }|D ]  }| j                  j                  dk(  rt        |      }n^| j                   j                  j                  r"| j                   j                  j                  h}nt        |      }|j!                  d       d}t#        |      sd}|D ]  }t%        ||      rd} |r|j'                  |        |r,| j                  j	                  ddj)                  |             y| j                  j+                  d	       y)
z3Check keyboard and keymap for common mistakes.
    z&Missing required arguments: --keyboardFc              3   2   K   | ]  }t        |        y wrE   )r   )rG   r$   s     r(   rJ   zlint.<locals>.<genexpr>n  s     >bb!>s   allr   TzLint check failed for: %sz, zLint check passed!)rd   re   r   rb   rc   
print_helpr   strrM   argsr   r   r!   r   r   r)   r#   r   r   r1   joinrg   )r   keyboard_listfailedr$   r&   rh   r   s          r(   re   re   \  s    ::??##>?#**//**C0112	>CHH,=,=>	>&(S!9!9:;F  88??e#"2&GZZ__##zz--.G.r2GKK	" b!B  	FF+	
 MM"16 1499V3DEGGLL%&r*   rE   )4__doc__
dotty_dictr   pathlibr   milcr   qmk.decoratorsr   r   qmk.infor   qmk.keyboardr	   r
   r   r   
qmk.keymapr   r   qmk.pathr   qmk.gitr   qmk.c_parser   r   qmk.json_schemar   r   r!   rm   r    r)   r8   r;   r>   rO   rV   rX   r^   ri   ro   rt   r{   r   r   r   r   argument
subcommandre   rF   r*   r(   <module>r      s'      ?  e e 2  ) 9 %G XY 6?  ,,.&*44!H@F j4NOe\(9O[m  ug  heZ&;<@A4   B = h P4r*   