diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py index 322ce6a2571..db195f78a59 100755 --- a/lib/python/qmk/cli/compile.py +++ b/lib/python/qmk/cli/compile.py @@ -2,15 +2,14 @@ You can compile a keymap already in the repo or using a QMK Configurator export. """ -from argparse import FileType - from milc import cli +import qmk.path from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json -@cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), help='The configurator export to compile') +@cli.argument('filename', nargs='?', arg_only=True, type=qmk.path.FileType('r'), help='The configurator export to compile') @cli.argument('-kb', '--keyboard', help='The keyboard to build a firmware for. Ignored when a configurator export is supplied.') @cli.argument('-km', '--keymap', help='The keymap to build a firmware for. Ignored when a configurator export is supplied.') @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually build, just show the make command to be run.") diff --git a/lib/python/qmk/cli/flash.py b/lib/python/qmk/cli/flash.py index a8762900356..173dee3df5c 100644 --- a/lib/python/qmk/cli/flash.py +++ b/lib/python/qmk/cli/flash.py @@ -3,7 +3,6 @@ You can compile a keymap already in the repo or using a QMK Configurator export. A bootloader must be specified. """ -from argparse import FileType from milc import cli @@ -30,7 +29,7 @@ def print_bootloader_help(): cli.echo('For more info, visit https://docs.qmk.fm/#/flashing') -@cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), help='The configurator export JSON to compile.') +@cli.argument('filename', nargs='?', arg_only=True, type=qmk.path.FileType('r'), help='The configurator export JSON to compile.') @cli.argument('-b', '--bootloaders', action='store_true', help='List the available bootloaders.') @cli.argument('-bl', '--bootloader', default='flash', help='The flash command, corresponding to qmk\'s make options of bootloaders.') @cli.argument('-km', '--keymap', help='The keymap to build a firmware for. Use this if you dont have a configurator file. Ignored when a configurator file is supplied.') diff --git a/lib/python/qmk/cli/json2c.py b/lib/python/qmk/cli/json2c.py index 97d8fb0c332..e7babc0e4c7 100755 --- a/lib/python/qmk/cli/json2c.py +++ b/lib/python/qmk/cli/json2c.py @@ -1,7 +1,6 @@ """Generate a keymap.c from a configurator export. """ import json -import sys from milc import cli @@ -11,7 +10,7 @@ import qmk.path @cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") -@cli.argument('filename', type=qmk.path.normpath, arg_only=True, help='Configurator JSON file') +@cli.argument('filename', type=qmk.path.FileType('r'), arg_only=True, help='Configurator JSON file') @cli.subcommand('Creates a keymap.c from a QMK Configurator export.') def json2c(cli): """Generate a keymap.c from a configurator export. @@ -20,19 +19,8 @@ def json2c(cli): """ try: - # Parse the configurator from stdin - if cli.args.filename and cli.args.filename.name == '-': - user_keymap = json.load(sys.stdin) - - else: - # Error checking - if not cli.args.filename.exists(): - cli.log.error('JSON file does not exist!') - return False - - # Parse the configurator json file - else: - user_keymap = json.loads(cli.args.filename.read_text()) + # Parse the configurator from json file (or stdin) + user_keymap = json.load(cli.args.filename) except json.decoder.JSONDecodeError as ex: cli.log.error('The JSON input does not appear to be valid.') diff --git a/lib/python/qmk/path.py b/lib/python/qmk/path.py index 54def1d5d6c..2aa1916f558 100644 --- a/lib/python/qmk/path.py +++ b/lib/python/qmk/path.py @@ -2,6 +2,7 @@ """ import logging import os +import argparse from pathlib import Path from qmk.constants import MAX_KEYBOARD_SUBFOLDERS, QMK_FIRMWARE @@ -65,3 +66,12 @@ def normpath(path): return path return Path(os.environ['ORIG_CWD']) / path + + +class FileType(argparse.FileType): + def __call__(self, string): + """normalize and check exists + otherwise magic strings like '-' for stdin resolve to bad paths + """ + norm = normpath(string) + return super().__call__(norm if norm.exists() else string)