~ruther/qmk_firmware

f04e58dad6f56cdbd5d369c9e00405dcdb47c8ea — Dan McClain 5 years ago d9b0564
[CLI] Add `qmk list_keyboards` (#6927)

`list_keyboards` replicates the `make list-keyboards` by globbing for all paths
that include `rules.mk` and then removing the paths that include `keymaps`.

This basis of this cli command could be reused in the future as a util, but is
not done so here since this would be the only place that would use it currently

Resolves #6911
M docs/cli.md => docs/cli.md +10 -0
@@ 115,6 115,16 @@ This command examines your environment and alerts you to potential build or flas
qmk doctor
```

## `qmk list_keyboards`

This command lists all the keyboards currently defined in `qmk_firmware`

**Usage**:

```
qmk list_keyboards
```

## `qmk new-keymap`

This command creates a new keymap based on a keyboard's existing default keymap.

M lib/python/qmk/cli/__init__.py => lib/python/qmk/cli/__init__.py +1 -0
@@ 8,6 8,7 @@ from . import config
from . import doctor
from . import hello
from . import json
from . import list
from . import new
from . import pyformat
from . import pytest

A lib/python/qmk/cli/list/__init__.py => lib/python/qmk/cli/list/__init__.py +1 -0
@@ 0,0 1,1 @@
from . import keyboards

A lib/python/qmk/cli/list/keyboards.py => lib/python/qmk/cli/list/keyboards.py +26 -0
@@ 0,0 1,26 @@
"""List the keyboards currently defined within QMK
"""
import os
import re
import glob

from milc import cli

@cli.subcommand("List the keyboards currently defined within QMK")
def list_keyboards(cli):
    """List the keyboards currently defined within QMK
    """

    base_path = os.path.join(os.getcwd(), "keyboards") + os.path.sep
    kb_path_wildcard = os.path.join(base_path, "**", "rules.mk")

    # find everywhere we have rules.mk where keymaps isn't in the path
    paths = [path for path in glob.iglob(kb_path_wildcard, recursive=True) if 'keymaps' not in path]

    # strip the keyboard directory path prefix and rules.mk suffix and alphabetize
    find_name = lambda path: path.replace(base_path, "").replace(os.path.sep + "rules.mk", "")
    names = sorted(map(find_name, paths))

    for name in names:
        # We echo instead of cli.log.info to allow easier piping of this output
        cli.echo(name)

M lib/python/qmk/tests/test_cli_commands.py => lib/python/qmk/tests/test_cli_commands.py +8 -0
@@ 37,3 37,11 @@ def test_pyformat():
    result = check_subcommand('pyformat')
    assert result.returncode == 0
    assert 'Successfully formatted the python code' in result.stderr


def test_list_keyboards():
    result = check_subcommand('list_keyboards')
    assert result.returncode == 0
    # check to see if a known keyboard is returned
    # this will fail if handwired/onekey/pytest is removed
    assert 'handwired/onekey/pytest' in result.stdout