~ruther/qmk_firmware

4b6db33a1df798c8895f623937aa61233f1516cc — QMK Bot 3 years ago 9401836 + fefd7fd
Merge remote-tracking branch 'origin/master' into develop
M data/templates/avr/config.h => data/templates/avr/config.h +4 -18
@@ 1,19 1,5 @@
/*
Copyright %YEAR% %YOUR_NAME%

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once



@@ 23,8 9,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define VENDOR_ID    0xFEED
#define PRODUCT_ID   0x0000
#define DEVICE_VER   0x0001
#define MANUFACTURER %YOUR_NAME%
#define PRODUCT      %KEYBOARD%
#define MANUFACTURER %(USER_NAME)s
#define PRODUCT      %(KEYBOARD)s

/* key matrix size */
#define MATRIX_ROWS 2

M data/templates/avr/readme.md => data/templates/avr/readme.md +5 -5
@@ 1,20 1,20 @@
# %KEYBOARD%
# %(KEYBOARD)s

![%KEYBOARD%](imgur.com image replace me!)
![%(KEYBOARD)s](imgur.com image replace me!)

*A short description of the keyboard/project*

* Keyboard Maintainer: [%YOUR_NAME%](https://github.com/yourusername)
* Keyboard Maintainer: [%(YOUR_NAME)s](https://github.com/%(USER_NAME)s)
* Hardware Supported: *The PCBs, controllers supported*
* Hardware Availability: *Links to where you can find this hardware*

Make example for this keyboard (after setting up your build environment):

    make %KEYBOARD%:default
    make %(KEYBOARD)s:default

Flashing example for this keyboard:

    make %KEYBOARD%:default:flash
    make %(KEYBOARD)s:default:flash

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).


A data/templates/base/%(KEYBOARD)s.c => data/templates/base/%(KEYBOARD)s.c +4 -0
@@ 0,0 1,4 @@
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
// SPDX-License-Identifier: GPL-2.0-or-later

#include "%(KEYBOARD)s.h"

R data/templates/base/keyboard.h => data/templates/base/%(KEYBOARD)s.h +2 -15
@@ 1,18 1,5 @@
/* Copyright %YEAR% %YOUR_NAME%
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once


M data/templates/base/info.json => data/templates/base/info.json +2 -2
@@ 1,7 1,7 @@
{
    "keyboard_name": "%KEYBOARD%",
    "keyboard_name": "%(KEYBOARD)s",
    "url": "",
    "maintainer": "%YOUR_NAME%",
    "maintainer": "%(USER_NAME)s",
    "layouts": {
        "LAYOUT": {
            "layout": [

D data/templates/base/keyboard.c => data/templates/base/keyboard.c +0 -17
@@ 1,17 0,0 @@
/* Copyright %YEAR% %YOUR_NAME%
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "%KEYBOARD%.h"

M data/templates/base/keymaps/default/keymap.c => data/templates/base/keymaps/default/keymap.c +4 -44
@@ 1,18 1,6 @@
/* Copyright %YEAR% %YOUR_NAME%
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
// SPDX-License-Identifier: GPL-2.0-or-later

#include QMK_KEYBOARD_H

// Defines names for use in layer keycodes and the keymap


@@ 21,12 9,6 @@ enum layer_names {
    _FN
};

// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
    QMKBEST = SAFE_RANGE,
    QMKURL
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [_BASE] = LAYOUT(


@@ 34,29 16,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
            KC_TAB,   KC_SPC
    ),
    [_FN] = LAYOUT(
        QMKBEST, QMKURL,  _______,
        _______, _______,  _______,
            RESET,    XXXXXXX
    )
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case QMKBEST:
            if (record->event.pressed) {
                // when keycode QMKBEST is pressed
                SEND_STRING("QMK is the best thing ever!");
            } else {
                // when keycode QMKBEST is released
            }
            break;
        case QMKURL:
            if (record->event.pressed) {
                // when keycode QMKURL is pressed
                SEND_STRING("https://qmk.fm/\n");
            } else {
                // when keycode QMKURL is released
            }
            break;
    }
    return true;
}

M data/templates/base/keymaps/default/readme.md => data/templates/base/keymaps/default/readme.md +1 -1
@@ 1,1 1,1 @@
# The default keymap for %KEYBOARD%
# The default keymap for %(KEYBOARD)s

M data/templates/ps2avrgb/config.h => data/templates/ps2avrgb/config.h +4 -18
@@ 1,19 1,5 @@
/*
Copyright %YEAR% %YOUR_NAME%

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once



@@ 23,8 9,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define VENDOR_ID    0xFEED
#define PRODUCT_ID   0x0000
#define DEVICE_VER   0x0001
#define MANUFACTURER %YOUR_NAME%
#define PRODUCT      %KEYBOARD%
#define MANUFACTURER %(USER_NAME)s
#define PRODUCT      %(KEYBOARD)s

/* key matrix size */
#define MATRIX_ROWS 8

M data/templates/ps2avrgb/readme.md => data/templates/ps2avrgb/readme.md +5 -5
@@ 1,20 1,20 @@
# %KEYBOARD%
# %(KEYBOARD)s

![%KEYBOARD%](imgur.com image replace me!)
![%(KEYBOARD)s](imgur.com image replace me!)

*A short description of the keyboard/project*

* Keyboard Maintainer: [%YOUR_NAME%](https://github.com/yourusername)
* Keyboard Maintainer: [%(YOUR_NAME)s](https://github.com/yourusername)
* Hardware Supported: *The PCBs, controllers supported*
* Hardware Availability: *Links to where you can find this hardware*

Make example for this keyboard (after setting up your build environment):

    make %KEYBOARD%:default
    make %(KEYBOARD)s:default

Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))

    make %KEYBOARD%:default:flash
    make %(KEYBOARD)s:default:flash

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).


M docs/coding_conventions_python.md => docs/coding_conventions_python.md +1 -1
@@ 2,7 2,7 @@

Most of our style follows PEP8 with some local modifications to make things less nit-picky. 

* We target Python 3.6 for compatability with all supported platforms.
* We target Python 3.7 for compatability with all supported platforms.
* We indent using four (4) spaces (soft tabs)
* We encourage liberal use of comments
  * Think of them as a story describing the feature

M lib/python/qmk/cli/new/keyboard.py => lib/python/qmk/cli/new/keyboard.py +38 -41
@@ 1,10 1,8 @@
"""This script automates the creation of new keyboard directories using a starter template.
"""
from datetime import date
import fileinput
from pathlib import Path
import re
import shutil

from qmk.commands import git_get_username
import qmk.path


@@ 32,6 30,7 @@ def validate_keyboard_name(name):
@cli.argument('-kb', '--keyboard', help='Specify the name for the new keyboard directory', arg_only=True, type=keyboard_name)
@cli.argument('-t', '--type', help='Specify the keyboard type', arg_only=True, choices=KEYBOARD_TYPES)
@cli.argument('-u', '--username', help='Specify your username (default from Git config)', arg_only=True)
@cli.argument('-n', '--realname', help='Specify your real name if you want to use that. Defaults to username', arg_only=True)
@cli.subcommand('Creates a new keyboard directory')
def new_keyboard(cli):
    """Creates a new keyboard.


@@ 69,7 68,7 @@ def new_keyboard(cli):
    # Get username
    user_name = None
    while not user_name:
        user_name = question('Your Name:', default=find_user_name())
        user_name = question('Your GitHub User Name:', default=find_user_name())

        if not user_name:
            cli.log.error('You didn\'t provide a username, and we couldn\'t find one set in your QMK or Git configs. Please try again.')


@@ 78,26 77,21 @@ def new_keyboard(cli):
            if cli.args.username:
                return False

    # Copy all the files
    copy_templates(keyboard_type, keyboard_path)
    real_name = None
    while not real_name:
        real_name = question('Your real name:', default=user_name)

    # Replace all the placeholders
    keyboard_basename = keyboard_path.name
    replacements = [
        ('%YEAR%', str(date.today().year)),
        ('%KEYBOARD%', keyboard_basename),
        ('%YOUR_NAME%', user_name),
    ]
    filenames = [
        keyboard_path / 'config.h',
        keyboard_path / 'info.json',
        keyboard_path / 'readme.md',
        keyboard_path / f'{keyboard_basename}.c',
        keyboard_path / f'{keyboard_basename}.h',
        keyboard_path / 'keymaps/default/readme.md',
        keyboard_path / 'keymaps/default/keymap.c',
    ]
    replace_placeholders(replacements, filenames)
    replacements = {
        "YEAR": str(date.today().year),
        "KEYBOARD": keyboard_basename,
        "USER_NAME": user_name,
        "YOUR_NAME": real_name,
    }

    template_dir = Path('data/templates')
    template_tree(template_dir / 'base', keyboard_path, replacements)
    template_tree(template_dir / keyboard_type, keyboard_path, replacements)

    cli.echo('')
    cli.log.info(f'{{fg_green}}Created a new keyboard called {{fg_cyan}}{new_keyboard_name}{{fg_green}}.{{fg_reset}}')


@@ 114,29 108,32 @@ def find_user_name():
        return git_get_username()


def copy_templates(keyboard_type, keyboard_path):
    """Copies the template files from data/templates to the new keyboard directory.
    """
    template_base_path = Path('data/templates')
    keyboard_basename = keyboard_path.name
def template_tree(src: Path, dst: Path, replacements: dict):
    """Recursively copy template and replace placeholders

    cli.log.info('Copying base template files...')
    shutil.copytree(template_base_path / 'base', keyboard_path)
    Args:
        src (Path)
            The source folder to copy from
        dst (Path)
            The destination folder to copy to
        replacements (dict)
            a dictionary with "key":"value" pairs to replace.

    cli.log.info(f'Copying {{fg_cyan}}{keyboard_type}{{fg_reset}} template files...')
    shutil.copytree(template_base_path / keyboard_type, keyboard_path, dirs_exist_ok=True)
    Raises:
        FileExistsError
            When trying to overwrite existing files
    """

    cli.log.info(f'Renaming {{fg_cyan}}keyboard.[ch]{{fg_reset}} to {{fg_cyan}}{keyboard_basename}.[ch]{{fg_reset}}...')
    shutil.move(keyboard_path / 'keyboard.c', keyboard_path / f'{keyboard_basename}.c')
    shutil.move(keyboard_path / 'keyboard.h', keyboard_path / f'{keyboard_basename}.h')
    dst.mkdir(parents=True, exist_ok=True)

    for child in src.iterdir():
        if child.is_dir():
            template_tree(child, dst / child.name, replacements=replacements)

def replace_placeholders(replacements, filenames):
    """Replaces the given placeholders in each template file.
    """
    for replacement in replacements:
        cli.log.info(f'Replacing {{fg_cyan}}{replacement[0]}{{fg_reset}} with {{fg_cyan}}{replacement[1]}{{fg_reset}}...')
        if child.is_file():
            file_name = dst / (child.name % replacements)

        with fileinput.input(files=filenames, inplace=True) as file:
            for line in file:
                print(line.replace(replacement[0], replacement[1]), end='')
            with file_name.open(mode='x') as dst_f:
                with child.open() as src_f:
                    template = src_f.read()
                    dst_f.write(template % replacements)