Skip to content

Commit

Permalink
Refactor doctor.py into a directory (#13298)
Browse files Browse the repository at this point in the history
  • Loading branch information
skullydazed authored Jun 22, 2021
1 parent d61e5c0 commit e87d231
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 49 deletions.
5 changes: 5 additions & 0 deletions lib/python/qmk/cli/doctor/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
"""QMK Doctor
Check out the user's QMK environment and make sure it's ready to compile.
"""
from .main import doctor
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""OS-agnostic helper functions
"""Check for specific programs.
"""
from enum import Enum
import re
Expand Down Expand Up @@ -30,7 +30,7 @@ class CheckStatus(Enum):
}


def parse_gcc_version(version):
def _parse_gcc_version(version):
m = re.match(r"(\d+)(?:\.(\d+))?(?:\.(\d+))?", version)

return {
Expand All @@ -40,7 +40,7 @@ def parse_gcc_version(version):
}


def check_arm_gcc_version():
def _check_arm_gcc_version():
"""Returns True if the arm-none-eabi-gcc version is not known to cause problems.
"""
if 'output' in ESSENTIAL_BINARIES['arm-none-eabi-gcc']:
Expand All @@ -50,7 +50,7 @@ def check_arm_gcc_version():
return CheckStatus.OK # Right now all known arm versions are ok


def check_avr_gcc_version():
def _check_avr_gcc_version():
"""Returns True if the avr-gcc version is not known to cause problems.
"""
rc = CheckStatus.ERROR
Expand All @@ -60,15 +60,15 @@ def check_avr_gcc_version():
cli.log.info('Found avr-gcc version %s', version_number)
rc = CheckStatus.OK

parsed_version = parse_gcc_version(version_number)
parsed_version = _parse_gcc_version(version_number)
if parsed_version['major'] > 8:
cli.log.warning('{fg_yellow}We do not recommend avr-gcc newer than 8. Downgrading to 8.x is recommended.')
rc = CheckStatus.WARNING

return rc


def check_avrdude_version():
def _check_avrdude_version():
if 'output' in ESSENTIAL_BINARIES['avrdude']:
last_line = ESSENTIAL_BINARIES['avrdude']['output'].split('\n')[-2]
version_number = last_line.split()[2][:-1]
Expand All @@ -77,7 +77,7 @@ def check_avrdude_version():
return CheckStatus.OK


def check_dfu_util_version():
def _check_dfu_util_version():
if 'output' in ESSENTIAL_BINARIES['dfu-util']:
first_line = ESSENTIAL_BINARIES['dfu-util']['output'].split('\n')[0]
version_number = first_line.split()[1]
Expand All @@ -86,7 +86,7 @@ def check_dfu_util_version():
return CheckStatus.OK


def check_dfu_programmer_version():
def _check_dfu_programmer_version():
if 'output' in ESSENTIAL_BINARIES['dfu-programmer']:
first_line = ESSENTIAL_BINARIES['dfu-programmer']['output'].split('\n')[0]
version_number = first_line.split()[1]
Expand All @@ -111,7 +111,7 @@ def check_binary_versions():
"""Check the versions of ESSENTIAL_BINARIES
"""
versions = []
for check in (check_arm_gcc_version, check_avr_gcc_version, check_avrdude_version, check_dfu_util_version, check_dfu_programmer_version):
for check in (_check_arm_gcc_version, _check_avr_gcc_version, _check_avrdude_version, _check_dfu_util_version, _check_dfu_programmer_version):
versions.append(check())
return versions

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
"""OS-specific functions for: Linux
"""
from pathlib import Path
import platform
import shutil
from pathlib import Path

from milc import cli

from qmk.constants import QMK_FIRMWARE
from qmk.os_helpers import CheckStatus
from .check import CheckStatus


def _udev_rule(vid, pid=None, *args):
Expand Down Expand Up @@ -138,3 +140,23 @@ def check_modem_manager():
"""(TODO): Add check for non-systemd systems
"""
return False


def os_test_linux():
"""Run the Linux specific tests.
"""
# Don't bother with udev on WSL, for now
if 'microsoft' in platform.uname().release.lower():
cli.log.info("Detected {fg_cyan}Linux (WSL){fg_reset}.")

# https://github.com/microsoft/WSL/issues/4197
if QMK_FIRMWARE.as_posix().startswith("/mnt"):
cli.log.warning("I/O performance on /mnt may be extremely slow.")
return CheckStatus.WARNING

return CheckStatus.OK
else:
cli.log.info("Detected {fg_cyan}Linux{fg_reset}.")
from .linux import check_udev_rules

return check_udev_rules()
13 changes: 13 additions & 0 deletions lib/python/qmk/cli/doctor/macos.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import platform

from milc import cli

from .check import CheckStatus


def os_test_macos():
"""Run the Mac specific tests.
"""
cli.log.info("Detected {fg_cyan}macOS %s{fg_reset}.", platform.mac_ver()[0])

return CheckStatus.OK
43 changes: 5 additions & 38 deletions lib/python/qmk/cli/doctor.py → lib/python/qmk/cli/doctor/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@

from milc import cli
from milc.questions import yesno

from qmk import submodules
from qmk.constants import QMK_FIRMWARE
from qmk.os_helpers import CheckStatus, check_binaries, check_binary_versions, check_submodules, check_git_repo
from .check import CheckStatus, check_binaries, check_binary_versions, check_submodules, check_git_repo


def os_tests():
Expand All @@ -18,53 +19,19 @@ def os_tests():
platform_id = platform.platform().lower()

if 'darwin' in platform_id or 'macos' in platform_id:
from .macos import os_test_macos
return os_test_macos()
elif 'linux' in platform_id:
from .linux import os_test_linux
return os_test_linux()
elif 'windows' in platform_id:
from .windows import os_test_windows
return os_test_windows()
else:
cli.log.warning('Unsupported OS detected: %s', platform_id)
return CheckStatus.WARNING


def os_test_linux():
"""Run the Linux specific tests.
"""
# Don't bother with udev on WSL, for now
if 'microsoft' in platform.uname().release.lower():
cli.log.info("Detected {fg_cyan}Linux (WSL){fg_reset}.")

# https://github.com/microsoft/WSL/issues/4197
if QMK_FIRMWARE.as_posix().startswith("/mnt"):
cli.log.warning("I/O performance on /mnt may be extremely slow.")
return CheckStatus.WARNING

return CheckStatus.OK
else:
cli.log.info("Detected {fg_cyan}Linux{fg_reset}.")
from qmk.os_helpers.linux import check_udev_rules

return check_udev_rules()


def os_test_macos():
"""Run the Mac specific tests.
"""
cli.log.info("Detected {fg_cyan}macOS %s{fg_reset}.", platform.mac_ver()[0])

return CheckStatus.OK


def os_test_windows():
"""Run the Windows specific tests.
"""
win32_ver = platform.win32_ver()
cli.log.info("Detected {fg_cyan}Windows %s (%s){fg_reset}.", win32_ver[0], win32_ver[1])

return CheckStatus.OK


@cli.argument('-y', '--yes', action='store_true', arg_only=True, help='Answer yes to all questions.')
@cli.argument('-n', '--no', action='store_true', arg_only=True, help='Answer no to all questions.')
@cli.subcommand('Basic QMK environment checks')
Expand Down
14 changes: 14 additions & 0 deletions lib/python/qmk/cli/doctor/windows.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import platform

from milc import cli

from .check import CheckStatus


def os_test_windows():
"""Run the Windows specific tests.
"""
win32_ver = platform.win32_ver()
cli.log.info("Detected {fg_cyan}Windows %s (%s){fg_reset}.", win32_ver[0], win32_ver[1])

return CheckStatus.OK

0 comments on commit e87d231

Please sign in to comment.