Export config dump/load and schema to PIO Home Project.RPC

This commit is contained in:
Ivan Kravets
2019-10-31 15:27:34 +02:00
parent 8ccf9d2e53
commit 9b65a091da
2 changed files with 181 additions and 69 deletions

View File

@ -29,6 +29,7 @@ from platformio.ide.projectgenerator import ProjectGenerator
from platformio.managers.platform import PlatformManager from platformio.managers.platform import PlatformManager
from platformio.project.config import ProjectConfig from platformio.project.config import ProjectConfig
from platformio.project.helpers import get_project_dir, is_platformio_project from platformio.project.helpers import get_project_dir, is_platformio_project
from platformio.project.options import get_config_options_schema
class ProjectRPC(object): class ProjectRPC(object):
@ -42,6 +43,20 @@ class ProjectRPC(object):
with fs.cd(project_dir): with fs.cd(project_dir):
return getattr(ProjectConfig(**init_kwargs), method)(*args) return getattr(ProjectConfig(**init_kwargs), method)(*args)
@staticmethod
def config_load(path):
return ProjectConfig(path).as_tuple()
@staticmethod
def config_dump(path, data):
config = ProjectConfig(path)
config.update(data, clear=True)
return config.save()
@staticmethod
def get_config_schema():
return get_config_options_schema()
@staticmethod @staticmethod
def _get_projects(project_dirs=None): def _get_projects(project_dirs=None):
def _get_project_data(): def _get_project_data():

View File

@ -15,40 +15,58 @@
# pylint: disable=redefined-builtin, too-many-arguments # pylint: disable=redefined-builtin, too-many-arguments
import os import os
from collections import OrderedDict, namedtuple from collections import OrderedDict
import click import click
from platformio import fs from platformio import fs
ConfigOptionClass = namedtuple(
"ConfigOption",
[
"scope",
"name",
"type",
"multiple",
"sysenvvar",
"buildenvvar",
"oldnames",
"default",
],
)
class ConfigOption(object): # pylint: disable=too-many-instance-attributes
def __init__(
self,
scope,
group,
name,
type=str,
multiple=False,
sysenvvar=None,
buildenvvar=None,
oldnames=None,
default=None,
description=None,
):
self.scope = scope
self.group = group
self.name = name
self.type = type
self.multiple = multiple
self.sysenvvar = sysenvvar
self.buildenvvar = buildenvvar
self.oldnames = oldnames
self.default = default
self.description = description
def ConfigOption( def as_dict(self):
scope, result = dict(
name, scope=self.scope,
type=str, group=self.group,
multiple=False, name=self.name,
sysenvvar=None, type="string",
buildenvvar=None, multiple=self.multiple,
oldnames=None, default=self.default,
default=None, description=self.description,
): )
return ConfigOptionClass( if isinstance(self.type, click.ParamType):
scope, name, type, multiple, sysenvvar, buildenvvar, oldnames, default result["type"] = self.type.name
)
if isinstance(self.type, (click.IntRange, click.FloatRange)):
result["min"] = self.type.min
result["max"] = self.type.max
if isinstance(self.type, click.Choice):
result["choices"] = self.type.choices
return result
def ConfigPlatformioOption(*args, **kwargs): def ConfigPlatformioOption(*args, **kwargs):
@ -66,90 +84,110 @@ ProjectOptions = OrderedDict(
# #
# [platformio] # [platformio]
# #
ConfigPlatformioOption(name="description"), ConfigPlatformioOption(group="generic", name="description"),
ConfigPlatformioOption( ConfigPlatformioOption(
group="generic",
name="default_envs", name="default_envs",
oldnames=["env_default"], oldnames=["env_default"],
multiple=True, multiple=True,
sysenvvar="PLATFORMIO_DEFAULT_ENVS", sysenvvar="PLATFORMIO_DEFAULT_ENVS",
), ),
ConfigPlatformioOption(name="extra_configs", multiple=True), ConfigPlatformioOption(
group="generic", name="extra_configs", multiple=True
),
# Dirs # Dirs
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="core_dir", name="core_dir",
oldnames=["home_dir"], oldnames=["home_dir"],
sysenvvar="PLATFORMIO_CORE_DIR", sysenvvar="PLATFORMIO_CORE_DIR",
default=os.path.join(fs.expanduser("~"), ".platformio"), default=os.path.join(fs.expanduser("~"), ".platformio"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="globallib_dir", name="globallib_dir",
sysenvvar="PLATFORMIO_GLOBALLIB_DIR", sysenvvar="PLATFORMIO_GLOBALLIB_DIR",
default=os.path.join("$PROJECT_CORE_DIR", "lib"), default=os.path.join("$PROJECT_CORE_DIR", "lib"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="platforms_dir", name="platforms_dir",
sysenvvar="PLATFORMIO_PLATFORMS_DIR", sysenvvar="PLATFORMIO_PLATFORMS_DIR",
default=os.path.join("$PROJECT_CORE_DIR", "platforms"), default=os.path.join("$PROJECT_CORE_DIR", "platforms"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="packages_dir", name="packages_dir",
sysenvvar="PLATFORMIO_PACKAGES_DIR", sysenvvar="PLATFORMIO_PACKAGES_DIR",
default=os.path.join("$PROJECT_CORE_DIR", "packages"), default=os.path.join("$PROJECT_CORE_DIR", "packages"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="cache_dir", name="cache_dir",
sysenvvar="PLATFORMIO_CACHE_DIR", sysenvvar="PLATFORMIO_CACHE_DIR",
default=os.path.join("$PROJECT_CORE_DIR", ".cache"), default=os.path.join("$PROJECT_CORE_DIR", ".cache"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
name="build_cache_dir", sysenvvar="PLATFORMIO_BUILD_CACHE_DIR" group="directory",
name="build_cache_dir",
sysenvvar="PLATFORMIO_BUILD_CACHE_DIR",
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="workspace_dir", name="workspace_dir",
sysenvvar="PLATFORMIO_WORKSPACE_DIR", sysenvvar="PLATFORMIO_WORKSPACE_DIR",
default=os.path.join("$PROJECT_DIR", ".pio"), default=os.path.join("$PROJECT_DIR", ".pio"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="build_dir", name="build_dir",
sysenvvar="PLATFORMIO_BUILD_DIR", sysenvvar="PLATFORMIO_BUILD_DIR",
default=os.path.join("$PROJECT_WORKSPACE_DIR", "build"), default=os.path.join("$PROJECT_WORKSPACE_DIR", "build"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="libdeps_dir", name="libdeps_dir",
sysenvvar="PLATFORMIO_LIBDEPS_DIR", sysenvvar="PLATFORMIO_LIBDEPS_DIR",
default=os.path.join("$PROJECT_WORKSPACE_DIR", "libdeps"), default=os.path.join("$PROJECT_WORKSPACE_DIR", "libdeps"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="lib_dir", name="lib_dir",
sysenvvar="PLATFORMIO_LIB_DIR", sysenvvar="PLATFORMIO_LIB_DIR",
default=os.path.join("$PROJECT_DIR", "lib"), default=os.path.join("$PROJECT_DIR", "lib"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="include_dir", name="include_dir",
sysenvvar="PLATFORMIO_INCLUDE_DIR", sysenvvar="PLATFORMIO_INCLUDE_DIR",
default=os.path.join("$PROJECT_DIR", "include"), default=os.path.join("$PROJECT_DIR", "include"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="src_dir", name="src_dir",
sysenvvar="PLATFORMIO_SRC_DIR", sysenvvar="PLATFORMIO_SRC_DIR",
default=os.path.join("$PROJECT_DIR", "src"), default=os.path.join("$PROJECT_DIR", "src"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="test_dir", name="test_dir",
sysenvvar="PLATFORMIO_TEST_DIR", sysenvvar="PLATFORMIO_TEST_DIR",
default=os.path.join("$PROJECT_DIR", "test"), default=os.path.join("$PROJECT_DIR", "test"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="boards_dir", name="boards_dir",
sysenvvar="PLATFORMIO_BOARDS_DIR", sysenvvar="PLATFORMIO_BOARDS_DIR",
default=os.path.join("$PROJECT_DIR", "boards"), default=os.path.join("$PROJECT_DIR", "boards"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="data_dir", name="data_dir",
sysenvvar="PLATFORMIO_DATA_DIR", sysenvvar="PLATFORMIO_DATA_DIR",
default=os.path.join("$PROJECT_DIR", "data"), default=os.path.join("$PROJECT_DIR", "data"),
), ),
ConfigPlatformioOption( ConfigPlatformioOption(
group="directory",
name="shared_dir", name="shared_dir",
sysenvvar="PLATFORMIO_SHARED_DIR", sysenvvar="PLATFORMIO_SHARED_DIR",
default=os.path.join("$PROJECT_DIR", "shared"), default=os.path.join("$PROJECT_DIR", "shared"),
@ -157,147 +195,206 @@ ProjectOptions = OrderedDict(
# #
# [env] # [env]
# #
ConfigEnvOption(name="extends", multiple=True), # Platform
# Generic
ConfigEnvOption(name="platform", buildenvvar="PIOPLATFORM"),
ConfigEnvOption(name="platform_packages", multiple=True),
ConfigEnvOption( ConfigEnvOption(
name="framework", multiple=True, buildenvvar="PIOFRAMEWORK" group="platform", name="platform", buildenvvar="PIOPLATFORM"
),
ConfigEnvOption(group="platform", name="platform_packages", multiple=True),
ConfigEnvOption(
group="platform",
name="framework",
multiple=True,
buildenvvar="PIOFRAMEWORK",
), ),
# Board # Board
ConfigEnvOption(name="board", buildenvvar="BOARD"), ConfigEnvOption(group="board", name="board", buildenvvar="BOARD"),
ConfigEnvOption( ConfigEnvOption(
name="board_build.mcu", oldnames=["board_mcu"], buildenvvar="BOARD_MCU" group="board",
name="board_build.mcu",
oldnames=["board_mcu"],
buildenvvar="BOARD_MCU",
), ),
ConfigEnvOption( ConfigEnvOption(
group="board",
name="board_build.f_cpu", name="board_build.f_cpu",
oldnames=["board_f_cpu"], oldnames=["board_f_cpu"],
buildenvvar="BOARD_F_CPU", buildenvvar="BOARD_F_CPU",
), ),
ConfigEnvOption( ConfigEnvOption(
group="board",
name="board_build.f_flash", name="board_build.f_flash",
oldnames=["board_f_flash"], oldnames=["board_f_flash"],
buildenvvar="BOARD_F_FLASH", buildenvvar="BOARD_F_FLASH",
), ),
ConfigEnvOption( ConfigEnvOption(
group="board",
name="board_build.flash_mode", name="board_build.flash_mode",
oldnames=["board_flash_mode"], oldnames=["board_flash_mode"],
buildenvvar="BOARD_FLASH_MODE", buildenvvar="BOARD_FLASH_MODE",
), ),
# Build # Build
ConfigEnvOption(name="build_type", type=click.Choice(["release", "debug"])),
ConfigEnvOption( ConfigEnvOption(
group="build",
name="build_type",
type=click.Choice(["release", "debug"]),
),
ConfigEnvOption(
group="build",
name="build_flags", name="build_flags",
multiple=True, multiple=True,
sysenvvar="PLATFORMIO_BUILD_FLAGS", sysenvvar="PLATFORMIO_BUILD_FLAGS",
buildenvvar="BUILD_FLAGS", buildenvvar="BUILD_FLAGS",
), ),
ConfigEnvOption( ConfigEnvOption(
group="build",
name="src_build_flags", name="src_build_flags",
multiple=True, multiple=True,
sysenvvar="PLATFORMIO_SRC_BUILD_FLAGS", sysenvvar="PLATFORMIO_SRC_BUILD_FLAGS",
buildenvvar="SRC_BUILD_FLAGS", buildenvvar="SRC_BUILD_FLAGS",
), ),
ConfigEnvOption( ConfigEnvOption(
group="build",
name="build_unflags", name="build_unflags",
multiple=True, multiple=True,
sysenvvar="PLATFORMIO_BUILD_UNFLAGS", sysenvvar="PLATFORMIO_BUILD_UNFLAGS",
buildenvvar="BUILD_UNFLAGS", buildenvvar="BUILD_UNFLAGS",
), ),
ConfigEnvOption( ConfigEnvOption(
group="build",
name="src_filter", name="src_filter",
multiple=True, multiple=True,
sysenvvar="PLATFORMIO_SRC_FILTER", sysenvvar="PLATFORMIO_SRC_FILTER",
buildenvvar="SRC_FILTER", buildenvvar="SRC_FILTER",
), ),
ConfigEnvOption(name="targets", multiple=True), ConfigEnvOption(group="build", name="targets", multiple=True),
# Upload # Upload
ConfigEnvOption( ConfigEnvOption(
group="upload",
name="upload_port", name="upload_port",
sysenvvar="PLATFORMIO_UPLOAD_PORT", sysenvvar="PLATFORMIO_UPLOAD_PORT",
buildenvvar="UPLOAD_PORT", buildenvvar="UPLOAD_PORT",
), ),
ConfigEnvOption(name="upload_protocol", buildenvvar="UPLOAD_PROTOCOL"),
ConfigEnvOption( ConfigEnvOption(
name="upload_speed", type=click.INT, buildenvvar="UPLOAD_SPEED" group="upload", name="upload_protocol", buildenvvar="UPLOAD_PROTOCOL"
), ),
ConfigEnvOption( ConfigEnvOption(
group="upload",
name="upload_speed",
type=click.INT,
buildenvvar="UPLOAD_SPEED",
),
ConfigEnvOption(
group="upload",
name="upload_flags", name="upload_flags",
multiple=True, multiple=True,
sysenvvar="PLATFORMIO_UPLOAD_FLAGS", sysenvvar="PLATFORMIO_UPLOAD_FLAGS",
buildenvvar="UPLOAD_FLAGS", buildenvvar="UPLOAD_FLAGS",
), ),
ConfigEnvOption( ConfigEnvOption(
name="upload_resetmethod", buildenvvar="UPLOAD_RESETMETHOD" group="upload",
name="upload_resetmethod",
buildenvvar="UPLOAD_RESETMETHOD",
),
ConfigEnvOption(
group="upload", name="upload_command", buildenvvar="UPLOADCMD"
), ),
ConfigEnvOption(name="upload_command", buildenvvar="UPLOADCMD"),
# Monitor # Monitor
ConfigEnvOption(name="monitor_port"), ConfigEnvOption(group="monitor", name="monitor_port"),
ConfigEnvOption(name="monitor_speed", oldnames=["monitor_baud"]), ConfigEnvOption(
ConfigEnvOption(name="monitor_rts", type=click.IntRange(0, 1)), group="monitor", name="monitor_speed", oldnames=["monitor_baud"]
ConfigEnvOption(name="monitor_dtr", type=click.IntRange(0, 1)), ),
ConfigEnvOption(name="monitor_flags", multiple=True), ConfigEnvOption(
group="monitor", name="monitor_rts", type=click.IntRange(0, 1)
),
ConfigEnvOption(
group="monitor", name="monitor_dtr", type=click.IntRange(0, 1)
),
ConfigEnvOption(group="monitor", name="monitor_flags", multiple=True),
# Library # Library
ConfigEnvOption( ConfigEnvOption(
group="lib",
name="lib_deps", name="lib_deps",
oldnames=["lib_use", "lib_force", "lib_install"], oldnames=["lib_use", "lib_force", "lib_install"],
multiple=True, multiple=True,
), ),
ConfigEnvOption(name="lib_ignore", multiple=True), ConfigEnvOption(group="lib", name="lib_ignore", multiple=True),
ConfigEnvOption( ConfigEnvOption(
group="lib",
name="lib_extra_dirs", name="lib_extra_dirs",
multiple=True, multiple=True,
sysenvvar="PLATFORMIO_LIB_EXTRA_DIRS", sysenvvar="PLATFORMIO_LIB_EXTRA_DIRS",
), ),
ConfigEnvOption( ConfigEnvOption(
group="lib",
name="lib_ldf_mode", name="lib_ldf_mode",
type=click.Choice(["off", "chain", "deep", "chain+", "deep+"]), type=click.Choice(["off", "chain", "deep", "chain+", "deep+"]),
), ),
ConfigEnvOption( ConfigEnvOption(
name="lib_compat_mode", type=click.Choice(["off", "soft", "strict"]) group="lib",
name="lib_compat_mode",
type=click.Choice(["off", "soft", "strict"]),
),
ConfigEnvOption(
group="lib", name="lib_archive", type=click.BOOL, default=True
), ),
ConfigEnvOption(name="lib_archive", type=click.BOOL),
# Test # Test
ConfigEnvOption(name="test_filter", multiple=True), ConfigEnvOption(group="test", name="test_filter", multiple=True),
ConfigEnvOption(name="test_ignore", multiple=True), ConfigEnvOption(group="test", name="test_ignore", multiple=True),
ConfigEnvOption(name="test_port"), ConfigEnvOption(group="test", name="test_port"),
ConfigEnvOption(name="test_speed", type=click.INT), ConfigEnvOption(group="test", name="test_speed", type=click.INT),
ConfigEnvOption(name="test_transport"), ConfigEnvOption(group="test", name="test_transport"),
ConfigEnvOption(name="test_build_project_src", type=click.BOOL),
# Debug
ConfigEnvOption(name="debug_tool"),
ConfigEnvOption(name="debug_init_break"),
ConfigEnvOption(name="debug_init_cmds", multiple=True),
ConfigEnvOption(name="debug_extra_cmds", multiple=True),
ConfigEnvOption( ConfigEnvOption(
name="debug_load_cmds", oldnames=["debug_load_cmd"], multiple=True group="test",
name="test_build_project_src",
type=click.BOOL,
default=False,
),
# Debug
ConfigEnvOption(group="debug", name="debug_tool"),
ConfigEnvOption(group="debug", name="debug_init_break"),
ConfigEnvOption(group="debug", name="debug_init_cmds", multiple=True),
ConfigEnvOption(group="debug", name="debug_extra_cmds", multiple=True),
ConfigEnvOption(
group="debug",
name="debug_load_cmds",
oldnames=["debug_load_cmd"],
multiple=True,
), ),
ConfigEnvOption( ConfigEnvOption(
group="debug",
name="debug_load_mode", name="debug_load_mode",
type=click.Choice(["always", "modified", "manual"]), type=click.Choice(["always", "modified", "manual"]),
), ),
ConfigEnvOption(name="debug_server", multiple=True), ConfigEnvOption(group="debug", name="debug_server", multiple=True),
ConfigEnvOption(name="debug_port"), ConfigEnvOption(group="debug", name="debug_port"),
ConfigEnvOption( ConfigEnvOption(
group="debug",
name="debug_svd_path", name="debug_svd_path",
type=click.Path(exists=True, file_okay=True, dir_okay=False), type=click.Path(exists=True, file_okay=True, dir_okay=False),
), ),
# Check # Check
ConfigEnvOption(name="check_tool", multiple=True), ConfigEnvOption(group="check", name="check_tool", multiple=True),
ConfigEnvOption(name="check_filter", multiple=True), ConfigEnvOption(group="check", name="check_filter", multiple=True),
ConfigEnvOption(name="check_flags", multiple=True), ConfigEnvOption(group="check", name="check_flags", multiple=True),
ConfigEnvOption( ConfigEnvOption(
group="check",
name="check_severity", name="check_severity",
multiple=True, multiple=True,
type=click.Choice(["low", "medium", "high"]), type=click.Choice(["low", "medium", "high"]),
), ),
# Other # Advanced
ConfigEnvOption( ConfigEnvOption(
group="advanced",
name="extra_scripts", name="extra_scripts",
oldnames=["extra_script"], oldnames=["extra_script"],
multiple=True, multiple=True,
sysenvvar="PLATFORMIO_EXTRA_SCRIPTS", sysenvvar="PLATFORMIO_EXTRA_SCRIPTS",
), ),
ConfigEnvOption(group="advanced", name="extends", multiple=True),
] ]
] ]
) )
def get_config_options_schema():
return [option.as_dict() for option in ProjectOptions.values()]