diff --git a/platformio/commands/home/rpc/handlers/project.py b/platformio/commands/home/rpc/handlers/project.py index dbd41a55..d00370c5 100644 --- a/platformio/commands/home/rpc/handlers/project.py +++ b/platformio/commands/home/rpc/handlers/project.py @@ -29,6 +29,7 @@ from platformio.ide.projectgenerator import ProjectGenerator from platformio.managers.platform import PlatformManager from platformio.project.config import ProjectConfig from platformio.project.helpers import get_project_dir, is_platformio_project +from platformio.project.options import get_config_options_schema class ProjectRPC(object): @@ -42,6 +43,20 @@ class ProjectRPC(object): with fs.cd(project_dir): 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 def _get_projects(project_dirs=None): def _get_project_data(): diff --git a/platformio/project/options.py b/platformio/project/options.py index 02762783..d4e2e962 100644 --- a/platformio/project/options.py +++ b/platformio/project/options.py @@ -15,40 +15,58 @@ # pylint: disable=redefined-builtin, too-many-arguments import os -from collections import OrderedDict, namedtuple +from collections import OrderedDict import click 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( - scope, - name, - type=str, - multiple=False, - sysenvvar=None, - buildenvvar=None, - oldnames=None, - default=None, -): - return ConfigOptionClass( - scope, name, type, multiple, sysenvvar, buildenvvar, oldnames, default - ) + def as_dict(self): + result = dict( + scope=self.scope, + group=self.group, + name=self.name, + type="string", + multiple=self.multiple, + default=self.default, + description=self.description, + ) + if isinstance(self.type, click.ParamType): + 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): @@ -66,90 +84,110 @@ ProjectOptions = OrderedDict( # # [platformio] # - ConfigPlatformioOption(name="description"), + ConfigPlatformioOption(group="generic", name="description"), ConfigPlatformioOption( + group="generic", name="default_envs", oldnames=["env_default"], multiple=True, sysenvvar="PLATFORMIO_DEFAULT_ENVS", ), - ConfigPlatformioOption(name="extra_configs", multiple=True), + ConfigPlatformioOption( + group="generic", name="extra_configs", multiple=True + ), # Dirs ConfigPlatformioOption( + group="directory", name="core_dir", oldnames=["home_dir"], sysenvvar="PLATFORMIO_CORE_DIR", default=os.path.join(fs.expanduser("~"), ".platformio"), ), ConfigPlatformioOption( + group="directory", name="globallib_dir", sysenvvar="PLATFORMIO_GLOBALLIB_DIR", default=os.path.join("$PROJECT_CORE_DIR", "lib"), ), ConfigPlatformioOption( + group="directory", name="platforms_dir", sysenvvar="PLATFORMIO_PLATFORMS_DIR", default=os.path.join("$PROJECT_CORE_DIR", "platforms"), ), ConfigPlatformioOption( + group="directory", name="packages_dir", sysenvvar="PLATFORMIO_PACKAGES_DIR", default=os.path.join("$PROJECT_CORE_DIR", "packages"), ), ConfigPlatformioOption( + group="directory", name="cache_dir", sysenvvar="PLATFORMIO_CACHE_DIR", default=os.path.join("$PROJECT_CORE_DIR", ".cache"), ), ConfigPlatformioOption( - name="build_cache_dir", sysenvvar="PLATFORMIO_BUILD_CACHE_DIR" + group="directory", + name="build_cache_dir", + sysenvvar="PLATFORMIO_BUILD_CACHE_DIR", ), ConfigPlatformioOption( + group="directory", name="workspace_dir", sysenvvar="PLATFORMIO_WORKSPACE_DIR", default=os.path.join("$PROJECT_DIR", ".pio"), ), ConfigPlatformioOption( + group="directory", name="build_dir", sysenvvar="PLATFORMIO_BUILD_DIR", default=os.path.join("$PROJECT_WORKSPACE_DIR", "build"), ), ConfigPlatformioOption( + group="directory", name="libdeps_dir", sysenvvar="PLATFORMIO_LIBDEPS_DIR", default=os.path.join("$PROJECT_WORKSPACE_DIR", "libdeps"), ), ConfigPlatformioOption( + group="directory", name="lib_dir", sysenvvar="PLATFORMIO_LIB_DIR", default=os.path.join("$PROJECT_DIR", "lib"), ), ConfigPlatformioOption( + group="directory", name="include_dir", sysenvvar="PLATFORMIO_INCLUDE_DIR", default=os.path.join("$PROJECT_DIR", "include"), ), ConfigPlatformioOption( + group="directory", name="src_dir", sysenvvar="PLATFORMIO_SRC_DIR", default=os.path.join("$PROJECT_DIR", "src"), ), ConfigPlatformioOption( + group="directory", name="test_dir", sysenvvar="PLATFORMIO_TEST_DIR", default=os.path.join("$PROJECT_DIR", "test"), ), ConfigPlatformioOption( + group="directory", name="boards_dir", sysenvvar="PLATFORMIO_BOARDS_DIR", default=os.path.join("$PROJECT_DIR", "boards"), ), ConfigPlatformioOption( + group="directory", name="data_dir", sysenvvar="PLATFORMIO_DATA_DIR", default=os.path.join("$PROJECT_DIR", "data"), ), ConfigPlatformioOption( + group="directory", name="shared_dir", sysenvvar="PLATFORMIO_SHARED_DIR", default=os.path.join("$PROJECT_DIR", "shared"), @@ -157,147 +195,206 @@ ProjectOptions = OrderedDict( # # [env] # - ConfigEnvOption(name="extends", multiple=True), - # Generic - ConfigEnvOption(name="platform", buildenvvar="PIOPLATFORM"), - ConfigEnvOption(name="platform_packages", multiple=True), + # Platform 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 - ConfigEnvOption(name="board", buildenvvar="BOARD"), + ConfigEnvOption(group="board", name="board", buildenvvar="BOARD"), ConfigEnvOption( - name="board_build.mcu", oldnames=["board_mcu"], buildenvvar="BOARD_MCU" + group="board", + name="board_build.mcu", + oldnames=["board_mcu"], + buildenvvar="BOARD_MCU", ), ConfigEnvOption( + group="board", name="board_build.f_cpu", oldnames=["board_f_cpu"], buildenvvar="BOARD_F_CPU", ), ConfigEnvOption( + group="board", name="board_build.f_flash", oldnames=["board_f_flash"], buildenvvar="BOARD_F_FLASH", ), ConfigEnvOption( + group="board", name="board_build.flash_mode", oldnames=["board_flash_mode"], buildenvvar="BOARD_FLASH_MODE", ), # Build - ConfigEnvOption(name="build_type", type=click.Choice(["release", "debug"])), ConfigEnvOption( + group="build", + name="build_type", + type=click.Choice(["release", "debug"]), + ), + ConfigEnvOption( + group="build", name="build_flags", multiple=True, sysenvvar="PLATFORMIO_BUILD_FLAGS", buildenvvar="BUILD_FLAGS", ), ConfigEnvOption( + group="build", name="src_build_flags", multiple=True, sysenvvar="PLATFORMIO_SRC_BUILD_FLAGS", buildenvvar="SRC_BUILD_FLAGS", ), ConfigEnvOption( + group="build", name="build_unflags", multiple=True, sysenvvar="PLATFORMIO_BUILD_UNFLAGS", buildenvvar="BUILD_UNFLAGS", ), ConfigEnvOption( + group="build", name="src_filter", multiple=True, sysenvvar="PLATFORMIO_SRC_FILTER", buildenvvar="SRC_FILTER", ), - ConfigEnvOption(name="targets", multiple=True), + ConfigEnvOption(group="build", name="targets", multiple=True), # Upload ConfigEnvOption( + group="upload", name="upload_port", sysenvvar="PLATFORMIO_UPLOAD_PORT", buildenvvar="UPLOAD_PORT", ), - ConfigEnvOption(name="upload_protocol", buildenvvar="UPLOAD_PROTOCOL"), ConfigEnvOption( - name="upload_speed", type=click.INT, buildenvvar="UPLOAD_SPEED" + group="upload", name="upload_protocol", buildenvvar="UPLOAD_PROTOCOL" ), ConfigEnvOption( + group="upload", + name="upload_speed", + type=click.INT, + buildenvvar="UPLOAD_SPEED", + ), + ConfigEnvOption( + group="upload", name="upload_flags", multiple=True, sysenvvar="PLATFORMIO_UPLOAD_FLAGS", buildenvvar="UPLOAD_FLAGS", ), 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 - ConfigEnvOption(name="monitor_port"), - ConfigEnvOption(name="monitor_speed", oldnames=["monitor_baud"]), - ConfigEnvOption(name="monitor_rts", type=click.IntRange(0, 1)), - ConfigEnvOption(name="monitor_dtr", type=click.IntRange(0, 1)), - ConfigEnvOption(name="monitor_flags", multiple=True), + ConfigEnvOption(group="monitor", name="monitor_port"), + ConfigEnvOption( + group="monitor", name="monitor_speed", oldnames=["monitor_baud"] + ), + 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 ConfigEnvOption( + group="lib", name="lib_deps", oldnames=["lib_use", "lib_force", "lib_install"], multiple=True, ), - ConfigEnvOption(name="lib_ignore", multiple=True), + ConfigEnvOption(group="lib", name="lib_ignore", multiple=True), ConfigEnvOption( + group="lib", name="lib_extra_dirs", multiple=True, sysenvvar="PLATFORMIO_LIB_EXTRA_DIRS", ), ConfigEnvOption( + group="lib", name="lib_ldf_mode", type=click.Choice(["off", "chain", "deep", "chain+", "deep+"]), ), 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 - ConfigEnvOption(name="test_filter", multiple=True), - ConfigEnvOption(name="test_ignore", multiple=True), - ConfigEnvOption(name="test_port"), - ConfigEnvOption(name="test_speed", type=click.INT), - ConfigEnvOption(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(group="test", name="test_filter", multiple=True), + ConfigEnvOption(group="test", name="test_ignore", multiple=True), + ConfigEnvOption(group="test", name="test_port"), + ConfigEnvOption(group="test", name="test_speed", type=click.INT), + ConfigEnvOption(group="test", name="test_transport"), 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( + group="debug", name="debug_load_mode", type=click.Choice(["always", "modified", "manual"]), ), - ConfigEnvOption(name="debug_server", multiple=True), - ConfigEnvOption(name="debug_port"), + ConfigEnvOption(group="debug", name="debug_server", multiple=True), + ConfigEnvOption(group="debug", name="debug_port"), ConfigEnvOption( + group="debug", name="debug_svd_path", type=click.Path(exists=True, file_okay=True, dir_okay=False), ), # Check - ConfigEnvOption(name="check_tool", multiple=True), - ConfigEnvOption(name="check_filter", multiple=True), - ConfigEnvOption(name="check_flags", multiple=True), + ConfigEnvOption(group="check", name="check_tool", multiple=True), + ConfigEnvOption(group="check", name="check_filter", multiple=True), + ConfigEnvOption(group="check", name="check_flags", multiple=True), ConfigEnvOption( + group="check", name="check_severity", multiple=True, type=click.Choice(["low", "medium", "high"]), ), - # Other + # Advanced ConfigEnvOption( + group="advanced", name="extra_scripts", oldnames=["extra_script"], multiple=True, 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()]