diff options
Diffstat (limited to 'lib/python/qmk/cli')
| -rw-r--r-- | lib/python/qmk/cli/__init__.py | 1 | ||||
| -rw-r--r-- | lib/python/qmk/cli/c2json.py | 2 | ||||
| -rw-r--r-- | lib/python/qmk/cli/generate/__init__.py | 1 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/generate/api.py | 58 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/info.py | 56 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/json2c.py | 2 | ||||
| -rw-r--r-- | lib/python/qmk/cli/list/keyboards.py | 19 | 
7 files changed, 92 insertions, 47 deletions
| diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index ba964ebbbb..47e1b44351 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -13,6 +13,7 @@ from . import config  from . import docs  from . import doctor  from . import flash +from . import generate  from . import hello  from . import info  from . import json diff --git a/lib/python/qmk/cli/c2json.py b/lib/python/qmk/cli/c2json.py index 0267303fd2..8c8bd1f57e 100644 --- a/lib/python/qmk/cli/c2json.py +++ b/lib/python/qmk/cli/c2json.py @@ -44,7 +44,7 @@ def c2json(cli):      # 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']) +        keymap_json = qmk.keymap.generate_json(keymap_json['keymap'], keymap_json['keyboard'], keymap_json['layout'], keymap_json['layers'])      except KeyError:          cli.log.error('Something went wrong. Try to use --no-cpp.')          sys.exit(1) diff --git a/lib/python/qmk/cli/generate/__init__.py b/lib/python/qmk/cli/generate/__init__.py new file mode 100644 index 0000000000..4dc7607ef2 --- /dev/null +++ b/lib/python/qmk/cli/generate/__init__.py @@ -0,0 +1 @@ +from . import api diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py new file mode 100755 index 0000000000..9807a9cd68 --- /dev/null +++ b/lib/python/qmk/cli/generate/api.py @@ -0,0 +1,58 @@ +"""This script automates the generation of the QMK API data. +""" +from pathlib import Path +from shutil import copyfile +import json + +from milc import cli + +from qmk.datetime import current_datetime +from qmk.info import info_json +from qmk.keyboard import list_keyboards + + [email protected]('Creates a new keymap for the keyboard of your choosing', hidden=False if cli.config.user.developer else True) +def generate_api(cli): +    """Generates the QMK API data. +    """ +    api_data_dir = Path('api_data') +    v1_dir = api_data_dir / 'v1' +    keyboard_list = v1_dir / 'keyboard_list.json' +    keyboard_all = v1_dir / 'keyboards.json' +    usb_file = v1_dir / 'usb.json' + +    if not api_data_dir.exists(): +        api_data_dir.mkdir() + +    kb_all = {'last_updated': current_datetime(), 'keyboards': {}} +    usb_list = {'last_updated': current_datetime(), 'devices': {}} + +    # Generate and write keyboard specific JSON files +    for keyboard_name in list_keyboards(): +        kb_all['keyboards'][keyboard_name] = info_json(keyboard_name) +        keyboard_dir = v1_dir / 'keyboards' / keyboard_name +        keyboard_info = keyboard_dir / 'info.json' +        keyboard_readme = keyboard_dir / 'readme.md' +        keyboard_readme_src = Path('keyboards') / keyboard_name / 'readme.md' + +        keyboard_dir.mkdir(parents=True, exist_ok=True) +        keyboard_info.write_text(json.dumps(kb_all['keyboards'][keyboard_name])) + +        if keyboard_readme_src.exists(): +            copyfile(keyboard_readme_src, keyboard_readme) + +        if 'usb' in kb_all['keyboards'][keyboard_name]: +            usb = kb_all['keyboards'][keyboard_name]['usb'] + +            if usb['vid'] not in usb_list['devices']: +                usb_list['devices'][usb['vid']] = {} + +            if usb['pid'] not in usb_list['devices'][usb['vid']]: +                usb_list['devices'][usb['vid']][usb['pid']] = {} + +            usb_list['devices'][usb['vid']][usb['pid']][keyboard_name] = usb + +    # Write the global JSON files +    keyboard_list.write_text(json.dumps({'last_updated': current_datetime(), 'keyboards': sorted(kb_all['keyboards'])})) +    keyboard_all.write_text(json.dumps(kb_all)) +    usb_file.write_text(json.dumps(usb_list)) diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py index 0e64d40742..44ce1186aa 100755 --- a/lib/python/qmk/cli/info.py +++ b/lib/python/qmk/cli/info.py @@ -16,7 +16,7 @@ ROW_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop'  COL_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijilmnopqrstuvwxyz' -def show_keymap(info_json, title_caps=True): +def show_keymap(kb_info_json, title_caps=True):      """Render the keymap in ascii art.      """      keymap_path = locate_keymap(cli.config.info.keyboard, cli.config.info.keymap) @@ -36,7 +36,7 @@ def show_keymap(info_json, title_caps=True):              else:                  cli.echo('{fg_cyan}layer_%s{fg_reset}:', layer_num) -            print(render_layout(info_json['layouts'][layout_name]['layout'], layer)) +            print(render_layout(kb_info_json['layouts'][layout_name]['layout'], layer))  def show_layouts(kb_info_json, title_caps=True): @@ -48,10 +48,10 @@ def show_layouts(kb_info_json, title_caps=True):          print(layout_art)  # Avoid passing dirty data to cli.echo() -def show_matrix(info_json, title_caps=True): +def show_matrix(kb_info_json, title_caps=True):      """Render the layout with matrix labels in ascii art.      """ -    for layout_name, layout in info_json['layouts'].items(): +    for layout_name, layout in kb_info_json['layouts'].items():          # Build our label list          labels = []          for key in layout['layout']: @@ -69,54 +69,54 @@ def show_matrix(info_json, title_caps=True):          else:              cli.echo('{fg_blue}matrix_%s{fg_reset}:', layout_name) -        print(render_layout(info_json['layouts'][layout_name]['layout'], labels)) +        print(render_layout(kb_info_json['layouts'][layout_name]['layout'], labels)) -def print_friendly_output(info_json): +def print_friendly_output(kb_info_json):      """Print the info.json in a friendly text format.      """ -    cli.echo('{fg_blue}Keyboard Name{fg_reset}: %s', info_json.get('keyboard_name', 'Unknown')) -    cli.echo('{fg_blue}Manufacturer{fg_reset}: %s', info_json.get('manufacturer', 'Unknown')) -    if 'url' in info_json: -        cli.echo('{fg_blue}Website{fg_reset}: %s', info_json.get('url', '')) -    if info_json.get('maintainer', 'qmk') == 'qmk': +    cli.echo('{fg_blue}Keyboard Name{fg_reset}: %s', kb_info_json.get('keyboard_name', 'Unknown')) +    cli.echo('{fg_blue}Manufacturer{fg_reset}: %s', kb_info_json.get('manufacturer', 'Unknown')) +    if 'url' in kb_info_json: +        cli.echo('{fg_blue}Website{fg_reset}: %s', kb_info_json.get('url', '')) +    if kb_info_json.get('maintainer', 'qmk') == 'qmk':          cli.echo('{fg_blue}Maintainer{fg_reset}: QMK Community')      else: -        cli.echo('{fg_blue}Maintainer{fg_reset}: %s', info_json['maintainer']) -    cli.echo('{fg_blue}Keyboard Folder{fg_reset}: %s', info_json.get('keyboard_folder', 'Unknown')) -    cli.echo('{fg_blue}Layouts{fg_reset}: %s', ', '.join(sorted(info_json['layouts'].keys()))) -    if 'width' in info_json and 'height' in info_json: -        cli.echo('{fg_blue}Size{fg_reset}: %s x %s' % (info_json['width'], info_json['height'])) -    cli.echo('{fg_blue}Processor{fg_reset}: %s', info_json.get('processor', 'Unknown')) -    cli.echo('{fg_blue}Bootloader{fg_reset}: %s', info_json.get('bootloader', 'Unknown')) +        cli.echo('{fg_blue}Maintainer{fg_reset}: %s', kb_info_json['maintainer']) +    cli.echo('{fg_blue}Keyboard Folder{fg_reset}: %s', kb_info_json.get('keyboard_folder', 'Unknown')) +    cli.echo('{fg_blue}Layouts{fg_reset}: %s', ', '.join(sorted(kb_info_json['layouts'].keys()))) +    if 'width' in kb_info_json and 'height' in kb_info_json: +        cli.echo('{fg_blue}Size{fg_reset}: %s x %s' % (kb_info_json['width'], kb_info_json['height'])) +    cli.echo('{fg_blue}Processor{fg_reset}: %s', kb_info_json.get('processor', 'Unknown')) +    cli.echo('{fg_blue}Bootloader{fg_reset}: %s', kb_info_json.get('bootloader', 'Unknown'))      if cli.config.info.layouts: -        show_layouts(info_json, True) +        show_layouts(kb_info_json, True)      if cli.config.info.matrix: -        show_matrix(info_json, True) +        show_matrix(kb_info_json, True)      if cli.config_source.info.keymap and cli.config_source.info.keymap != 'config_file': -        show_keymap(info_json, True) +        show_keymap(kb_info_json, True) -def print_text_output(info_json): +def print_text_output(kb_info_json):      """Print the info.json in a plain text format.      """ -    for key in sorted(info_json): +    for key in sorted(kb_info_json):          if key == 'layouts': -            cli.echo('{fg_blue}layouts{fg_reset}: %s', ', '.join(sorted(info_json['layouts'].keys()))) +            cli.echo('{fg_blue}layouts{fg_reset}: %s', ', '.join(sorted(kb_info_json['layouts'].keys())))          else: -            cli.echo('{fg_blue}%s{fg_reset}: %s', key, info_json[key]) +            cli.echo('{fg_blue}%s{fg_reset}: %s', key, kb_info_json[key])      if cli.config.info.layouts: -        show_layouts(info_json, False) +        show_layouts(kb_info_json, False)      if cli.config.info.matrix: -        show_matrix(info_json, False) +        show_matrix(kb_info_json, False)      if cli.config_source.info.keymap and cli.config_source.info.keymap != 'config_file': -        show_keymap(info_json, False) +        show_keymap(kb_info_json, False)  @cli.argument('-kb', '--keyboard', help='Keyboard to show info for.') diff --git a/lib/python/qmk/cli/json2c.py b/lib/python/qmk/cli/json2c.py index 2a90094368..426078063c 100755 --- a/lib/python/qmk/cli/json2c.py +++ b/lib/python/qmk/cli/json2c.py @@ -38,7 +38,7 @@ def json2c(cli):          user_keymap = json.load(fd)      # Generate the keymap -    keymap_c = qmk.keymap.generate(user_keymap['keyboard'], user_keymap['layout'], user_keymap['layers']) +    keymap_c = qmk.keymap.generate_c(user_keymap['keyboard'], user_keymap['layout'], user_keymap['layers'])      if cli.args.output:          cli.args.output.parent.mkdir(parents=True, exist_ok=True) diff --git a/lib/python/qmk/cli/list/keyboards.py b/lib/python/qmk/cli/list/keyboards.py index ca0c5661a4..8b6c451673 100644 --- a/lib/python/qmk/cli/list/keyboards.py +++ b/lib/python/qmk/cli/list/keyboards.py @@ -1,28 +1,13 @@  """List the keyboards currently defined within QMK  """ -# We avoid pathlib here because this is performance critical code. -import os -import glob -  from milc import cli -BASE_PATH = os.path.join(os.getcwd(), "keyboards") + os.path.sep -KB_WILDCARD = os.path.join(BASE_PATH, "**", "rules.mk") - - -def find_name(path): -    """Determine the keyboard name by stripping off the base_path and rules.mk. -    """ -    return path.replace(BASE_PATH, "").replace(os.path.sep + "rules.mk", "") +import qmk.keyboard  @cli.subcommand("List the keyboards currently defined within QMK")  def list_keyboards(cli):      """List the keyboards currently defined within QMK      """ -    # find everywhere we have rules.mk where keymaps isn't in the path -    paths = [path for path in glob.iglob(KB_WILDCARD, recursive=True) if 'keymaps' not in path] - -    # Extract the keyboard name from the path and print it -    for keyboard_name in sorted(map(find_name, paths)): +    for keyboard_name in qmk.keyboard.list_keyboards():          print(keyboard_name) | 
