Move all useful functions to the qmk module and use the cli subcommand as a wrapper around it. Add both inline comments and documentation.refactor_process_record_kb_user
parent
f96085af38
commit
26f53d38d9
@ -0,0 +1,77 @@ |
||||
""" Functions for working with Makefiles |
||||
""" |
||||
import os |
||||
import glob |
||||
import re |
||||
|
||||
import qmk.path |
||||
from qmk.errors import NoSuchKeyboardError |
||||
|
||||
def parse_rules_mk(file_path): |
||||
""" Parse a rules.mk file |
||||
|
||||
Args: |
||||
file_path: path to the rules.mk file |
||||
|
||||
Returns: |
||||
a dictionary with the file's content |
||||
""" |
||||
# regex to match lines with comment at the end |
||||
# group(1) = option's name |
||||
# group(2) = operator (eg.: '=', '+=') |
||||
# group(3) = value(s) |
||||
commented_regex = re.compile(r"^\s*(\w+)\s*([\:\+\-]?=)\s*(.*?)(?=\s*\#)") |
||||
# regex to match lines without comment at the end |
||||
# group(1) = option's name |
||||
# group(2) = operator (eg.: '=', '+=') |
||||
# group(3) = value(s) |
||||
uncommented_regex = re.compile(r"^\s*(\w+)\s*([\:\+\-]?=)\s*(.*?)(?=\s*$)") |
||||
mk_content = qmk.path.unicode_lines(file_path) |
||||
parsed_file = dict() |
||||
for line in mk_content: |
||||
found = commented_regex.search(line) if "#" in line else uncommented_regex.search(line) |
||||
if found: |
||||
parsed_file[found.group(1)] = dict(operator = found.group(2), value = found.group(3)) |
||||
return parsed_file |
||||
|
||||
def merge_rules_mk_files(base, revision): |
||||
""" Merge a keyboard revision's rules.mk file with |
||||
the 'base' rules.mk file |
||||
|
||||
Args: |
||||
base: the base rules.mk file's content as dictionary |
||||
revision: the revision's rules.mk file's content as dictionary |
||||
|
||||
Returns: |
||||
a dictionary with the merged content |
||||
""" |
||||
return {**base, **revision} |
||||
|
||||
def get_rules_mk(keyboard, revision = ""): |
||||
""" Get a rules.mk for a keyboard |
||||
|
||||
Args: |
||||
keyboard: name of the keyboard |
||||
revision: revision of the keyboard |
||||
|
||||
Returns: |
||||
a dictionary with the content of the rules.mk file |
||||
""" |
||||
base_path = os.path.join(os.getcwd(), "keyboards", keyboard) + os.path.sep |
||||
rules_mk = dict() |
||||
if os.path.exists(base_path + os.path.sep + revision): |
||||
rules_mk_path_wildcard = os.path.join(base_path, "**", "rules.mk") |
||||
rules_mk_regex = re.compile(r"^" + base_path + "(?:" + revision + os.path.sep + ")?rules.mk") |
||||
paths = [path for path in glob.iglob(rules_mk_path_wildcard, recursive = True) if rules_mk_regex.search(path)] |
||||
for file_path in paths: |
||||
rules_mk[revision if revision in file_path else "base"] = parse_rules_mk(file_path) |
||||
else: |
||||
raise NoSuchKeyboardError("The requested keyboard and/or revision does not exist.") |
||||
|
||||
# if the base or the revision directory does not contain a rules.mk |
||||
if len(rules_mk) == 1: |
||||
rules_mk = rules_mk[revision] |
||||
# if both directories contain rules.mk files |
||||
elif len(rules_mk) == 2: |
||||
rules_mk = merge_rules_mk_files(rules_mk["base"], rules_mk[revision]) |
||||
return rules_mk |
Loading…
Reference in new issue