summaryrefslogtreecommitdiffstats
path: root/lib/python/qmk/cli
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/qmk/cli')
-rw-r--r--lib/python/qmk/cli/__init__.py1
-rw-r--r--lib/python/qmk/cli/c2json.py62
-rwxr-xr-xlib/python/qmk/cli/doctor.py4
-rwxr-xr-xlib/python/qmk/cli/info.py11
-rwxr-xr-xlib/python/qmk/cli/json/keymap.py2
-rwxr-xr-xlib/python/qmk/cli/json2c.py4
-rwxr-xr-xlib/python/qmk/cli/kle2json.py6
-rw-r--r--lib/python/qmk/cli/list/keymaps.py2
-rwxr-xr-xlib/python/qmk/cli/new/keymap.py6
9 files changed, 80 insertions, 18 deletions
diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py
index 47f60c601b..ba964ebbbb 100644
--- a/lib/python/qmk/cli/__init__.py
+++ b/lib/python/qmk/cli/__init__.py
@@ -6,6 +6,7 @@ import sys
from milc import cli
+from . import c2json
from . import cformat
from . import compile
from . import config
diff --git a/lib/python/qmk/cli/c2json.py b/lib/python/qmk/cli/c2json.py
new file mode 100644
index 0000000000..0267303fd2
--- /dev/null
+++ b/lib/python/qmk/cli/c2json.py
@@ -0,0 +1,62 @@
+"""Generate a keymap.json from a keymap.c file.
+"""
+import json
+import sys
+
+from milc import cli
+
+import qmk.keymap
+import qmk.path
+
+
+@cli.argument('--no-cpp', arg_only=True, action='store_false', help='Do not use \'cpp\' on keymap.c')
+@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('-kb', '--keyboard', arg_only=True, required=True, help='The keyboard\'s name')
+@cli.argument('-km', '--keymap', arg_only=True, required=True, help='The keymap\'s name')
+@cli.argument('filename', arg_only=True, help='keymap.c file')
+@cli.subcommand('Creates a keymap.json from a keymap.c file.')
+def c2json(cli):
+ """Generate a keymap.json from a keymap.c file.
+
+ This command uses the `qmk.keymap` module to generate a keymap.json from a keymap.c file. The generated keymap is written to stdout, or to a file if -o is provided.
+ """
+ cli.args.filename = qmk.path.normpath(cli.args.filename)
+
+ # Error checking
+ if not cli.args.filename.exists():
+ cli.log.error('C file does not exist!')
+ cli.print_usage()
+ exit(1)
+
+ if str(cli.args.filename) == '-':
+ # TODO(skullydazed/anyone): Read file contents from STDIN
+ cli.log.error('Reading from STDIN is not (yet) supported.')
+ cli.print_usage()
+ exit(1)
+
+ # Environment processing
+ if cli.args.output == ('-'):
+ cli.args.output = None
+
+ # Parse the keymap.c
+ keymap_json = qmk.keymap.c2json(cli.args.keyboard, cli.args.keymap, cli.args.filename, use_cpp=cli.args.no_cpp)
+
+ # Generate the keymap.json
+ try:
+ keymap_json = qmk.keymap.generate(keymap_json['keyboard'], keymap_json['layout'], keymap_json['layers'], type='json', keymap=keymap_json['keymap'])
+ except KeyError:
+ cli.log.error('Something went wrong. Try to use --no-cpp.')
+ sys.exit(1)
+
+ if cli.args.output:
+ cli.args.output.parent.mkdir(parents=True, exist_ok=True)
+ if cli.args.output.exists():
+ cli.args.output.replace(cli.args.output.name + '.bak')
+ cli.args.output.write_text(json.dumps(keymap_json))
+
+ if not cli.args.quiet:
+ cli.log.info('Wrote keymap to %s.', cli.args.output)
+
+ else:
+ print(json.dumps(keymap_json))
diff --git a/lib/python/qmk/cli/doctor.py b/lib/python/qmk/cli/doctor.py
index bad864f72d..7fafd57575 100755
--- a/lib/python/qmk/cli/doctor.py
+++ b/lib/python/qmk/cli/doctor.py
@@ -58,7 +58,7 @@ def parse_gcc_version(version):
return {
'major': int(m.group(1)),
'minor': int(m.group(2)) if m.group(2) else 0,
- 'patch': int(m.group(3)) if m.group(3) else 0
+ 'patch': int(m.group(3)) if m.group(3) else 0,
}
@@ -364,3 +364,5 @@ def doctor(cli):
else:
cli.log.info('{fg_yellow}Problems detected, please fix these problems before proceeding.')
# FIXME(skullydazed/unclaimed): Link to a document about troubleshooting, or discord or something
+
+ return ok
diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py
index 5e4b391411..0e64d40742 100755
--- a/lib/python/qmk/cli/info.py
+++ b/lib/python/qmk/cli/info.py
@@ -134,11 +134,11 @@ def info(cli):
if not cli.config.info.keyboard:
cli.log.error('Missing paramater: --keyboard')
cli.subcommands['info'].print_help()
- exit(1)
+ return False
if not is_keyboard(cli.config.info.keyboard):
cli.log.error('Invalid keyboard: "%s"', cli.config.info.keyboard)
- exit(1)
+ return False
# Build the info.json file
kb_info_json = info_json(cli.config.info.keyboard)
@@ -146,13 +146,10 @@ def info(cli):
# Output in the requested format
if cli.args.format == 'json':
print(json.dumps(kb_info_json))
- exit()
-
- if cli.args.format == 'text':
+ elif cli.args.format == 'text':
print_text_output(kb_info_json)
-
elif cli.args.format == 'friendly':
print_friendly_output(kb_info_json)
-
else:
cli.log.error('Unknown format: %s', cli.args.format)
+ return False
diff --git a/lib/python/qmk/cli/json/keymap.py b/lib/python/qmk/cli/json/keymap.py
index c97a2d0462..2af9faaa72 100755
--- a/lib/python/qmk/cli/json/keymap.py
+++ b/lib/python/qmk/cli/json/keymap.py
@@ -13,4 +13,4 @@ def json_keymap(cli):
"""Renamed to `qmk json2c`.
"""
cli.log.error('This command has been renamed to `qmk json2c`.')
- exit(1)
+ return False
diff --git a/lib/python/qmk/cli/json2c.py b/lib/python/qmk/cli/json2c.py
index af0d80a9ac..2a90094368 100755
--- a/lib/python/qmk/cli/json2c.py
+++ b/lib/python/qmk/cli/json2c.py
@@ -22,12 +22,12 @@ def json2c(cli):
# TODO(skullydazed/anyone): Read file contents from STDIN
cli.log.error('Reading from STDIN is not (yet) supported.')
cli.print_usage()
- exit(1)
+ return False
if not cli.args.filename.exists():
cli.log.error('JSON file does not exist!')
cli.print_usage()
- exit(1)
+ return False
# Environment processing
if cli.args.output and cli.args.output.name == '-':
diff --git a/lib/python/qmk/cli/kle2json.py b/lib/python/qmk/cli/kle2json.py
index 798f95fd19..3d1bb8c43c 100755
--- a/lib/python/qmk/cli/kle2json.py
+++ b/lib/python/qmk/cli/kle2json.py
@@ -37,7 +37,8 @@ def kle2json(cli):
file_path = Path(os.environ['ORIG_CWD'], cli.args.filename)
# Check for valid file_path for more graceful failure
if not file_path.exists():
- return cli.log.error('File {fg_cyan}%s{style_reset_all} was not found.', file_path)
+ cli.log.error('File {fg_cyan}%s{style_reset_all} was not found.', file_path)
+ return False
out_path = file_path.parent
raw_code = file_path.open().read()
# Check if info.json exists, allow overwrite with force
@@ -50,8 +51,7 @@ def kle2json(cli):
except Exception as e:
cli.log.error('Could not parse KLE raw data: %s', raw_code)
cli.log.exception(e)
- # FIXME: This should be better
- return cli.log.error('Could not parse KLE raw data.')
+ return False
keyboard = OrderedDict(
keyboard_name=kle.name,
url='',
diff --git a/lib/python/qmk/cli/list/keymaps.py b/lib/python/qmk/cli/list/keymaps.py
index b18289eb35..49bc84b2ce 100644
--- a/lib/python/qmk/cli/list/keymaps.py
+++ b/lib/python/qmk/cli/list/keymaps.py
@@ -15,7 +15,7 @@ def list_keymaps(cli):
"""
if not is_keyboard(cli.config.list_keymaps.keyboard):
cli.log.error('Keyboard %s does not exist!', cli.config.list_keymaps.keyboard)
- exit(1)
+ return False
for name in qmk.keymap.list_keymaps(cli.config.list_keymaps.keyboard):
print(name)
diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py
index 474fe7974f..52c564997b 100755
--- a/lib/python/qmk/cli/new/keymap.py
+++ b/lib/python/qmk/cli/new/keymap.py
@@ -29,15 +29,15 @@ def new_keymap(cli):
# check directories
if not kb_path.exists():
cli.log.error('Keyboard %s does not exist!', kb_path)
- exit(1)
+ return False
if not keymap_path_default.exists():
cli.log.error('Keyboard default %s does not exist!', keymap_path_default)
- exit(1)
+ return False
if keymap_path_new.exists():
cli.log.error('Keymap %s already exists!', keymap_path_new)
- exit(1)
+ return False
# create user directory with default keymap files
shutil.copytree(keymap_path_default, keymap_path_new, symlinks=True)