summaryrefslogtreecommitdiffstats
path: root/lib/python/qmk/cli/generate
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/qmk/cli/generate')
-rwxr-xr-xlib/python/qmk/cli/generate/api.py6
-rw-r--r--lib/python/qmk/cli/generate/autocorrect_data.py6
-rwxr-xr-xlib/python/qmk/cli/generate/info_json.py2
-rwxr-xr-xlib/python/qmk/cli/generate/keyboard_h.py44
-rw-r--r--lib/python/qmk/cli/generate/keycodes.py2
5 files changed, 52 insertions, 8 deletions
diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py
index 580e080eeb..61a2f9f732 100755
--- a/lib/python/qmk/cli/generate/api.py
+++ b/lib/python/qmk/cli/generate/api.py
@@ -66,6 +66,12 @@ def _filtered_copy(src, dst):
dst.write_text(json.dumps(data, separators=(',', ':')), encoding='utf-8')
return dst
+ if dst.suffix == '.jsonschema':
+ data = json_load(src)
+
+ dst.write_text(json.dumps(data), encoding='utf-8')
+ return dst
+
return shutil.copy2(src, dst)
diff --git a/lib/python/qmk/cli/generate/autocorrect_data.py b/lib/python/qmk/cli/generate/autocorrect_data.py
index 5b70e0cb4e..b11c66d95d 100644
--- a/lib/python/qmk/cli/generate/autocorrect_data.py
+++ b/lib/python/qmk/cli/generate/autocorrect_data.py
@@ -63,7 +63,13 @@ def parse_file(file_name: str) -> List[Tuple[str, str]]:
"""
try:
+ import english_words
+ correct_words = english_words.get_english_words_set(['web2'], lower=True, alpha=True)
+ except AttributeError:
from english_words import english_words_lower_alpha_set as correct_words
+ if not cli.args.quiet:
+ cli.echo('The english_words package is outdated, update by running:')
+ cli.echo(' {fg_cyan}python3 -m pip install english_words --upgrade')
except ImportError:
if not cli.args.quiet:
cli.echo('Autocorrection will falsely trigger when a typo is a substring of a correctly spelled word.')
diff --git a/lib/python/qmk/cli/generate/info_json.py b/lib/python/qmk/cli/generate/info_json.py
index 0dc80f10cc..08c294146b 100755
--- a/lib/python/qmk/cli/generate/info_json.py
+++ b/lib/python/qmk/cli/generate/info_json.py
@@ -76,7 +76,7 @@ def generate_info_json(cli):
# Build the info.json file
kb_info_json = info_json(cli.config.generate_info_json.keyboard)
strip_info_json(kb_info_json)
- info_json_text = json.dumps(kb_info_json, indent=4, cls=InfoJSONEncoder)
+ info_json_text = json.dumps(kb_info_json, indent=4, cls=InfoJSONEncoder, sort_keys=True)
if cli.args.output:
# Write to a file
diff --git a/lib/python/qmk/cli/generate/keyboard_h.py b/lib/python/qmk/cli/generate/keyboard_h.py
index 152921bdce..fa4036e39a 100755
--- a/lib/python/qmk/cli/generate/keyboard_h.py
+++ b/lib/python/qmk/cli/generate/keyboard_h.py
@@ -11,12 +11,9 @@ from qmk.keyboard import keyboard_completer, keyboard_folder
from qmk.constants import COL_LETTERS, ROW_LETTERS, GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
-def _generate_layouts(keyboard):
- """Generates the layouts.h file.
+def _generate_layouts(keyboard, kb_info_json):
+ """Generates the layouts macros.
"""
- # Build the info.json file
- kb_info_json = info_json(keyboard)
-
if 'matrix_size' not in kb_info_json:
cli.log.error(f'{keyboard}: Invalid matrix config.')
return []
@@ -65,6 +62,32 @@ def _generate_layouts(keyboard):
return lines
+def _generate_keycodes(kb_info_json):
+ """Generates keyboard level keycodes.
+ """
+ if 'keycodes' not in kb_info_json:
+ return []
+
+ lines = []
+ lines.append('enum keyboard_keycodes {')
+
+ for index, item in enumerate(kb_info_json.get('keycodes')):
+ key = item["key"]
+ if index == 0:
+ lines.append(f' {key} = QK_KB_0,')
+ else:
+ lines.append(f' {key},')
+
+ lines.append('};')
+
+ for item in kb_info_json.get('keycodes', []):
+ key = item["key"]
+ for alias in item.get("aliases", []):
+ lines.append(f'#define {alias} {key}')
+
+ return lines
+
+
@cli.argument('-i', '--include', nargs='?', arg_only=True, help='Optional file to include')
@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
@@ -73,8 +96,12 @@ def _generate_layouts(keyboard):
def generate_keyboard_h(cli):
"""Generates the keyboard.h file.
"""
+ # Build the info.json file
+ kb_info_json = info_json(cli.args.keyboard)
+
keyboard_h = cli.args.include
- dd_layouts = _generate_layouts(cli.args.keyboard)
+ dd_layouts = _generate_layouts(cli.args.keyboard, kb_info_json)
+ dd_keycodes = _generate_keycodes(kb_info_json)
valid_config = dd_layouts or keyboard_h
# Build the layouts.h file.
@@ -87,6 +114,11 @@ def generate_keyboard_h(cli):
if keyboard_h:
keyboard_h_lines.append(f'#include "{Path(keyboard_h).name}"')
+ keyboard_h_lines.append('')
+ keyboard_h_lines.append('// Keycode content')
+ if dd_keycodes:
+ keyboard_h_lines.extend(dd_keycodes)
+
# Protect against poorly configured keyboards
if not valid_config:
keyboard_h_lines.append('#error("<keyboard>.h is required unless your keyboard uses data-driven configuration. Please rename your keyboard\'s header file to <keyboard>.h")')
diff --git a/lib/python/qmk/cli/generate/keycodes.py b/lib/python/qmk/cli/generate/keycodes.py
index 17503bac63..3b69b17ed1 100644
--- a/lib/python/qmk/cli/generate/keycodes.py
+++ b/lib/python/qmk/cli/generate/keycodes.py
@@ -143,7 +143,7 @@ def generate_keycode_extras(cli):
"""
# Build the header file.
- keycodes_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '#include "keymap.h"', '// clang-format off']
+ keycodes_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '#include "keycodes.h"', '// clang-format off']
keycodes = load_spec(cli.args.version, cli.args.lang)