Esempio n. 1
0
def test_empty_config():
    config = ProjectConfig("/non/existing/platformio.ini")
    # unknown section
    with pytest.raises(InvalidProjectConfError):
        config.get("unknown_section", "unknown_option")
    assert config.sections() == []
    assert config.get("section", "option", 13) == 13
Esempio n. 2
0
        def _get_project_data(project_dir):
            data = {"boards": [], "envLibdepsDirs": [], "libExtraDirs": []}
            config = ProjectConfig(join(project_dir, "platformio.ini"))
            libdeps_dir = get_project_libdeps_dir()

            data['libExtraDirs'].extend(
                config.get("platformio", "lib_extra_dirs", []))

            for section in config.sections():
                if not section.startswith("env:"):
                    continue
                data['envLibdepsDirs'].append(join(libdeps_dir, section[4:]))
                if config.has_option(section, "board"):
                    data['boards'].append(config.get(section, "board"))
                data['libExtraDirs'].extend(
                    config.get(section, "lib_extra_dirs", []))

            # skip non existing folders and resolve full path
            for key in ("envLibdepsDirs", "libExtraDirs"):
                data[key] = [
                    expanduser(d) if d.startswith("~") else realpath(d)
                    for d in data[key] if isdir(d)
                ]

            return data
Esempio n. 3
0
        def _get_project_data():
            data = {"boards": [], "envLibdepsDirs": [], "libExtraDirs": []}
            config = ProjectConfig()
            data["envs"] = config.envs()
            data["description"] = config.get("platformio", "description")
            data["libExtraDirs"].extend(
                config.get("platformio", "lib_extra_dirs", []))

            libdeps_dir = config.get_optional_dir("libdeps")
            for section in config.sections():
                if not section.startswith("env:"):
                    continue
                data["envLibdepsDirs"].append(
                    os.path.join(libdeps_dir, section[4:]))
                if config.has_option(section, "board"):
                    data["boards"].append(config.get(section, "board"))
                data["libExtraDirs"].extend(
                    config.get(section, "lib_extra_dirs", []))

            # skip non existing folders and resolve full path
            for key in ("envLibdepsDirs", "libExtraDirs"):
                data[key] = [
                    fs.expanduser(d)
                    if d.startswith("~") else os.path.realpath(d)
                    for d in data[key] if os.path.isdir(d)
                ]

            return data
Esempio n. 4
0
def test_empty_config():
    config = ProjectConfig("/non/existing/platformio.ini")

    # unknown section
    with pytest.raises(ConfigParser.NoSectionError):
        config.getraw("unknown_section", "unknown_option")

    assert config.sections() == []
    assert config.get("section", "option") is None
    assert config.get("section", "option", 13) == 13
def test_empty_config():
    config = ProjectConfig("/non/existing/platformio.ini")

    # unknown section
    with pytest.raises(ConfigParser.NoSectionError):
        config.getraw("unknown_section", "unknown_option")

    assert config.sections() == []
    assert config.get("section", "option") is None
    assert config.get("section", "option", 13) == 13

    # sysenv
    os.environ["PLATFORMIO_HOME_DIR"] = "/custom/core/dir"
    assert config.get("platformio", "core_dir") == "/custom/core/dir"
    del os.environ["PLATFORMIO_HOME_DIR"]
Esempio n. 6
0
    def get_project_examples():
        result = []
        for manifest in PlatformManager().get_installed():
            examples_dir = join(manifest['__pkg_dir'], "examples")
            if not isdir(examples_dir):
                continue
            items = []
            for project_dir, _, __ in os.walk(examples_dir):
                project_description = None
                try:
                    config = ProjectConfig(join(project_dir, "platformio.ini"))
                    config.validate(silent=True)
                    project_description = config.get("platformio",
                                                     "description")
                except exception.PlatformIOProjectException:
                    continue

                path_tokens = project_dir.split(sep)
                items.append({
                    "name":
                    "/".join(path_tokens[path_tokens.index("examples") + 1:]),
                    "path":
                    project_dir,
                    "description":
                    project_description
                })
            result.append({
                "platform": {
                    "title": manifest['title'],
                    "version": manifest['version']
                },
                "items": sorted(items, key=lambda item: item['name'])
            })
        return sorted(result, key=lambda data: data['platform']['title'])
Esempio n. 7
0
def test_update_and_save(tmpdir_factory):
    tmpdir = tmpdir_factory.mktemp("project")
    tmpdir.join("platformio.ini").write(
        """
[platformio]
extra_configs = a.ini, b.ini

[env:myenv]
board = myboard
    """
    )
    config = ProjectConfig(tmpdir.join("platformio.ini").strpath)
    assert config.envs() == ["myenv"]
    assert config.as_tuple()[0][1][0][1] == ["a.ini", "b.ini"]

    config.update(
        [
            ["platformio", [("extra_configs", ["extra.ini"])]],
            ["env:myenv", [("framework", ["espidf", "arduino"])]],
            ["check_types", [("float_option", 13.99), ("bool_option", True)]],
        ]
    )
    config.get("platformio", "extra_configs") == "extra.ini"
    config.remove_section("platformio")
    assert config.as_tuple() == [
        ("env:myenv", [("board", "myboard"), ("framework", ["espidf", "arduino"])]),
        ("check_types", [("float_option", "13.99"), ("bool_option", "yes")]),
    ]

    config.save()
    contents = tmpdir.join("platformio.ini").read()
    assert contents[-4:] == "yes\n"
    lines = [
        line.strip()
        for line in contents.split("\n")
        if line.strip() and not line.startswith((";", "#"))
    ]
    assert lines == [
        "[env:myenv]",
        "board = myboard",
        "framework =",
        "espidf",
        "arduino",
        "[check_types]",
        "float_option = 13.99",
        "bool_option = yes",
    ]
Esempio n. 8
0
def fill_project_envs(ctx, project_dir, board_ids, project_option, env_prefix,
                      force_download):
    config = ProjectConfig(join(project_dir, "platformio.ini"),
                           parse_extra=False)
    used_boards = []
    for section in config.sections():
        cond = [
            section.startswith("env:"),
            config.has_option(section, "board")
        ]
        if all(cond):
            used_boards.append(config.get(section, "board"))

    pm = PlatformManager()
    used_platforms = []
    modified = False
    for id_ in board_ids:
        board_config = pm.board_config(id_)
        used_platforms.append(board_config['platform'])
        if id_ in used_boards:
            continue
        used_boards.append(id_)
        modified = True

        envopts = {"platform": board_config['platform'], "board": id_}
        # find default framework for board
        frameworks = board_config.get("frameworks")
        if frameworks:
            envopts['framework'] = frameworks[0]

        for item in project_option:
            if "=" not in item:
                continue
            _name, _value = item.split("=", 1)
            envopts[_name.strip()] = _value.strip()

        section = "env:%s%s" % (env_prefix, id_)
        config.add_section(section)

        for option, value in envopts.items():
            config.set(section, option, value)

    if force_download and used_platforms:
        _install_dependent_platforms(ctx, used_platforms)

    if modified:
        config.save()
        config.reset_instances()
Esempio n. 9
0
    def get_project_examples():
        result = []
        pm = PlatformPackageManager()
        for pkg in pm.get_installed():
            examples_dir = os.path.join(pkg.path, "examples")
            if not os.path.isdir(examples_dir):
                continue
            items = []
            for project_dir, _, __ in os.walk(examples_dir):
                project_description = None
                try:
                    config = ProjectConfig(
                        os.path.join(project_dir, "platformio.ini"))
                    config.validate(silent=True)
                    project_description = config.get("platformio",
                                                     "description")
                except ProjectError:
                    continue

                path_tokens = project_dir.split(os.path.sep)
                items.append({
                    "name":
                    "/".join(path_tokens[path_tokens.index("examples") + 1:]),
                    "path":
                    project_dir,
                    "description":
                    project_description,
                })
            manifest = pm.load_manifest(pkg)
            result.append({
                "platform": {
                    "title": manifest["title"],
                    "version": manifest["version"],
                },
                "items":
                sorted(items, key=lambda item: item["name"]),
            })
        return sorted(result, key=lambda data: data["platform"]["title"])
Esempio n. 10
0
def test_saving_deps(clirunner, validate_cliresult, isolated_pio_core,
                     tmpdir_factory):
    regclient = RegistryClient()
    project_dir = tmpdir_factory.mktemp("project")
    project_dir.join("platformio.ini").write("""
[env]
lib_deps = ArduinoJson

[env:one]
board = devkit

[env:two]
framework = foo
lib_deps =
    CustomLib
    ArduinoJson @ 5.10.1
""")
    result = clirunner.invoke(
        cmd_lib,
        [
            "-d",
            str(project_dir), "install", "64", "knolleary/PubSubClient@~2.7"
        ],
    )
    validate_cliresult(result)
    aj_pkg_data = regclient.get_package(PackageType.LIBRARY, "bblanchon",
                                        "ArduinoJson")
    config = ProjectConfig(os.path.join(str(project_dir), "platformio.ini"))
    assert sorted(config.get("env:one", "lib_deps")) == sorted([
        "bblanchon/ArduinoJson@^%s" % aj_pkg_data["version"]["name"],
        "knolleary/PubSubClient@~2.7",
    ])
    assert sorted(config.get("env:two", "lib_deps")) == sorted([
        "CustomLib",
        "bblanchon/ArduinoJson@^%s" % aj_pkg_data["version"]["name"],
        "knolleary/PubSubClient@~2.7",
    ])

    # ensure "build" version without NPM spec
    result = clirunner.invoke(
        cmd_lib,
        [
            "-d",
            str(project_dir), "-e", "one", "install",
            "mbed-sam-grove/LinkedList"
        ],
    )
    validate_cliresult(result)
    ll_pkg_data = regclient.get_package(PackageType.LIBRARY, "mbed-sam-grove",
                                        "LinkedList")
    config = ProjectConfig(os.path.join(str(project_dir), "platformio.ini"))
    assert sorted(config.get("env:one", "lib_deps")) == sorted([
        "bblanchon/ArduinoJson@^%s" % aj_pkg_data["version"]["name"],
        "knolleary/PubSubClient@~2.7",
        "mbed-sam-grove/LinkedList@%s" % ll_pkg_data["version"]["name"],
    ])

    # check external package via Git repo
    result = clirunner.invoke(
        cmd_lib,
        [
            "-d",
            str(project_dir),
            "-e",
            "one",
            "install",
            "https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3 @ 0.8.3",
        ],
    )
    validate_cliresult(result)
    config = ProjectConfig(os.path.join(str(project_dir), "platformio.ini"))
    assert len(config.get("env:one", "lib_deps")) == 4
    assert config.get("env:one", "lib_deps")[3] == (
        "https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3 @ 0.8.3")

    # test uninstalling
    # from all envs
    result = clirunner.invoke(
        cmd_lib, ["-d", str(project_dir), "uninstall", "ArduinoJson"])
    validate_cliresult(result)
    # from "one" env
    result = clirunner.invoke(
        cmd_lib,
        [
            "-d",
            str(project_dir),
            "-e",
            "one",
            "uninstall",
            "knolleary/PubSubClient@~2.7",
        ],
    )
    validate_cliresult(result)
    config = ProjectConfig(os.path.join(str(project_dir), "platformio.ini"))
    assert len(config.get("env:one", "lib_deps")) == 2
    assert len(config.get("env:two", "lib_deps")) == 2
    assert config.get("env:one", "lib_deps") == [
        "mbed-sam-grove/LinkedList@%s" % ll_pkg_data["version"]["name"],
        "https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3 @ 0.8.3",
    ]
    assert config.get("env:two", "lib_deps") == [
        "CustomLib",
        "knolleary/PubSubClient@~2.7",
    ]

    # test list
    result = clirunner.invoke(cmd_lib, ["-d", str(project_dir), "list"])
    validate_cliresult(result)
    assert "Version: 0.8.3+sha." in result.stdout
    assert (
        "Source: git+https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3"
        in result.stdout)
    result = clirunner.invoke(
        cmd_lib, ["-d", str(project_dir), "list", "--json-output"])
    validate_cliresult(result)
    data = {}
    for key, value in json.loads(result.stdout).items():
        data[os.path.basename(key)] = value
    ame_lib = next(item for item in data["one"]
                   if item["name"] == "AsyncMqttClient-esphome")
    ame_vcs = VCSClientFactory.new(ame_lib["__pkg_dir"], ame_lib["__src_url"])
    assert len(data["two"]) == 1
    assert data["two"][0]["name"] == "PubSubClient"
    assert "__pkg_dir" in data["one"][0]
    assert (ame_lib["__src_url"] ==
            "git+https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3")
    assert ame_lib["version"] == ("0.8.3+sha.%s" %
                                  ame_vcs.get_current_revision())
Esempio n. 11
0
def test_real_config(tmpdir):
    tmpdir.join("platformio.ini").write(BASE_CONFIG)
    tmpdir.join("extra_envs.ini").write(EXTRA_ENVS_CONFIG)
    tmpdir.join("extra_debug.ini").write(EXTRA_DEBUG_CONFIG)

    config = None
    with tmpdir.as_cwd():
        config = ProjectConfig(tmpdir.join("platformio.ini").strpath)
    assert config
    assert len(config.warnings) == 2
    assert "lib_install" in config.warnings[1]

    config.validate(["extra_2", "base"], silent=True)
    with pytest.raises(UnknownEnvNames):
        config.validate(["non-existing-env"])

    # unknown section
    with pytest.raises(ConfigParser.NoSectionError):
        config.getraw("unknown_section", "unknown_option")
    # unknown option
    with pytest.raises(ConfigParser.NoOptionError):
        config.getraw("custom", "unknown_option")
    # unknown option even if exists in [env]
    with pytest.raises(ConfigParser.NoOptionError):
        config.getraw("platformio", "monitor_speed")

    # sections
    assert config.sections() == [
        "platformio", "env", "custom", "env:base", "env:extra_1", "env:extra_2"
    ]

    # envs
    assert config.envs() == ["base", "extra_1", "extra_2"]
    assert config.default_envs() == ["base", "extra_2"]

    # options
    assert config.options(env="base") == [
        "build_flags", "targets", "monitor_speed", "lib_deps", "lib_ignore"
    ]

    # has_option
    assert config.has_option("env:base", "monitor_speed")
    assert not config.has_option("custom", "monitor_speed")
    assert not config.has_option("env:extra_1", "lib_install")

    # sysenv
    assert config.get("custom", "extra_flags") is None
    assert config.get("env:base", "build_flags") == ["-D DEBUG=1"]
    assert config.get("env:base", "upload_port") is None
    assert config.get("env:extra_2", "upload_port") == "/dev/extra_2/port"
    os.environ["PLATFORMIO_BUILD_FLAGS"] = "-DSYSENVDEPS1 -DSYSENVDEPS2"
    os.environ["PLATFORMIO_UPLOAD_PORT"] = "/dev/sysenv/port"
    os.environ["__PIO_TEST_CNF_EXTRA_FLAGS"] = "-L /usr/local/lib"
    assert config.get("custom", "extra_flags") == "-L /usr/local/lib"
    assert config.get("env:base", "build_flags") == [
        "-D DEBUG=1 -L /usr/local/lib", "-DSYSENVDEPS1 -DSYSENVDEPS2"
    ]
    assert config.get("env:base", "upload_port") == "/dev/sysenv/port"
    assert config.get("env:extra_2", "upload_port") == "/dev/extra_2/port"

    # getraw
    assert config.getraw("env:base", "targets") == ""
    assert config.getraw("env:extra_1", "lib_deps") == "574"
    assert config.getraw("env:extra_1", "build_flags") == "-lc -lm -D DEBUG=1"

    # get
    assert config.get("custom", "debug_flags") == "-D DEBUG=1"
    assert config.get("env:extra_1", "build_flags") == [
        "-lc -lm -D DEBUG=1", "-DSYSENVDEPS1 -DSYSENVDEPS2"
    ]
    assert config.get("env:extra_2",
                      "build_flags") == ["-Og", "-DSYSENVDEPS1 -DSYSENVDEPS2"]
    assert config.get("env:extra_2", "monitor_speed") == "115200"
    assert config.get("env:base", "build_flags") == ([
        "-D DEBUG=1 -L /usr/local/lib", "-DSYSENVDEPS1 -DSYSENVDEPS2"
    ])

    # items
    assert config.items("custom") == [
        ("debug_flags", "-D DEBUG=1"),
        ("lib_flags", "-lc -lm"),
        ("extra_flags", "-L /usr/local/lib"),
        ("lib_ignore", "LibIgnoreCustom")
    ]  # yapf: disable
    assert config.items(env="base") == [
        ("build_flags", [
            "-D DEBUG=1 -L /usr/local/lib", "-DSYSENVDEPS1 -DSYSENVDEPS2"]),
        ("targets", []),
        ("monitor_speed", "115200"),
        ("lib_deps", ["Lib1", "Lib2"]),
        ("lib_ignore", ["LibIgnoreCustom"]),
        ("upload_port", "/dev/sysenv/port")
    ]  # yapf: disable
    assert config.items(env="extra_1") == [
        ("build_flags", ["-lc -lm -D DEBUG=1", "-DSYSENVDEPS1 -DSYSENVDEPS2"]),
        ("lib_deps", ["574"]),
        ("monitor_speed", "115200"),
        ("lib_ignore", ["LibIgnoreCustom"]),
        ("upload_port", "/dev/sysenv/port")
    ]  # yapf: disable
    assert config.items(env="extra_2") == [
        ("build_flags", ["-Og", "-DSYSENVDEPS1 -DSYSENVDEPS2"]),
        ("lib_ignore", ["LibIgnoreCustom", "Lib3"]),
        ("upload_port", "/dev/extra_2/port"),
        ("monitor_speed", "115200"),
        ("lib_deps", ["Lib1", "Lib2"])
    ]  # yapf: disable

    # cleanup system environment variables
    del os.environ["PLATFORMIO_BUILD_FLAGS"]
    del os.environ["PLATFORMIO_UPLOAD_PORT"]
    del os.environ["__PIO_TEST_CNF_EXTRA_FLAGS"]