mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-03 23:02:34 +01:00 
			
		
		
		
	* Basic qmk lint command * check for keymap readme * change the workflow from qmk info to qmk lint * add a strict mode * parsing -> parse * document qmk lint * small info logging cleanup * Apply suggestions from code review Co-authored-by: Ryan <fauxpark@gmail.com> * honor --strict in more places * change the job name to lint Co-authored-by: Ryan <fauxpark@gmail.com>
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Command to look over a keyboard/keymap and check for common mistakes.
 | 
						|
"""
 | 
						|
from milc import cli
 | 
						|
 | 
						|
from qmk.decorators import automagic_keyboard, automagic_keymap
 | 
						|
from qmk.info import info_json
 | 
						|
from qmk.keymap import locate_keymap
 | 
						|
from qmk.path import is_keyboard, keyboard
 | 
						|
 | 
						|
 | 
						|
@cli.argument('--strict', action='store_true', help='Treat warnings as errors.')
 | 
						|
@cli.argument('-kb', '--keyboard', help='The keyboard to check.')
 | 
						|
@cli.argument('-km', '--keymap', help='The keymap to check.')
 | 
						|
@cli.subcommand('Check keyboard and keymap for common mistakes.')
 | 
						|
@automagic_keyboard
 | 
						|
@automagic_keymap
 | 
						|
def lint(cli):
 | 
						|
    """Check keyboard and keymap for common mistakes.
 | 
						|
    """
 | 
						|
    if not cli.config.lint.keyboard:
 | 
						|
        cli.log.error('Missing required argument: --keyboard')
 | 
						|
        cli.print_help()
 | 
						|
        return False
 | 
						|
 | 
						|
    if not is_keyboard(cli.config.lint.keyboard):
 | 
						|
        cli.log.error('No such keyboard: %s', cli.config.lint.keyboard)
 | 
						|
        return False
 | 
						|
 | 
						|
    # Gather data about the keyboard.
 | 
						|
    ok = True
 | 
						|
    keyboard_path = keyboard(cli.config.lint.keyboard)
 | 
						|
    keyboard_info = info_json(cli.config.lint.keyboard)
 | 
						|
    readme_path = keyboard_path / 'readme.md'
 | 
						|
 | 
						|
    # Check for errors in the info.json
 | 
						|
    if keyboard_info['parse_errors']:
 | 
						|
        ok = False
 | 
						|
        cli.log.error('Errors found when generating info.json.')
 | 
						|
 | 
						|
    if cli.config.lint.strict and keyboard_info['parse_warnings']:
 | 
						|
        ok = False
 | 
						|
        cli.log.error('Warnings found when generating info.json (Strict mode enabled.)')
 | 
						|
 | 
						|
    # Check for a readme.md and warn if it doesn't exist
 | 
						|
    if not readme_path.exists():
 | 
						|
        ok = False
 | 
						|
        cli.log.error('Missing %s', readme_path)
 | 
						|
 | 
						|
    # Keymap specific checks
 | 
						|
    if cli.config.lint.keymap:
 | 
						|
        keymap_path = locate_keymap(cli.config.lint.keyboard, cli.config.lint.keymap)
 | 
						|
 | 
						|
        if not keymap_path:
 | 
						|
            ok = False
 | 
						|
            cli.log.error("Can't find %s keymap for %s keyboard.", cli.config.lint.keymap, cli.config.lint.keyboard)
 | 
						|
        else:
 | 
						|
            keymap_readme = keymap_path.parent / 'readme.md'
 | 
						|
            if not keymap_readme.exists():
 | 
						|
                cli.log.warning('Missing %s', keymap_readme)
 | 
						|
 | 
						|
                if cli.config.lint.strict:
 | 
						|
                    ok = False
 | 
						|
 | 
						|
    # Check and report the overall status
 | 
						|
    if ok:
 | 
						|
        cli.log.info('Lint check passed!')
 | 
						|
        return True
 | 
						|
 | 
						|
    cli.log.error('Lint check failed!')
 | 
						|
    return False
 |