diff --git a/docs/userguide/cmd_settings.rst b/docs/userguide/cmd_settings.rst index c001c16f..b914d46c 100644 --- a/docs/userguide/cmd_settings.rst +++ b/docs/userguide/cmd_settings.rst @@ -27,7 +27,7 @@ Get/List existing settings Examples ~~~~~~~~ -1. List all settings and theirs current values +1. List all settings and current their values .. code-block:: bash @@ -38,9 +38,7 @@ Examples auto_update_platforms Yes Automatically update platforms (Yes/No) check_libraries_interval 7 Check for the library updates interval (days) check_platformio_interval 3 Check for the new PlatformIO interval (days) - check_platforms_interval 7 Check for the platform updates interval (days) - enable_prompts Yes Can PlatformIO communicate with you via prompts: propose to install platforms which aren't installed yet, paginate over library search results and etc.)? ATTENTION!!! If you call PlatformIO like subprocess, please disable prompts to avoid blocking (Yes/No) - enable_telemetry Yes Shares commands, platforms and libraries usage to help us make PlatformIO better (Yes/No) + check_platforms_interval 7 Check for the platforms updates interval (days) 2. Show specified setting diff --git a/examples/atmelavr-and-arduino/arduino-adafruit-library/README.rst b/examples/atmelavr-and-arduino/arduino-adafruit-library/README.rst index a0f29696..606c6479 100644 --- a/examples/atmelavr-and-arduino/arduino-adafruit-library/README.rst +++ b/examples/atmelavr-and-arduino/arduino-adafruit-library/README.rst @@ -81,5 +81,4 @@ Console Output ^ .pioenvs/arduino_uno/Adafruit_CC3000_Library/utility/sntp.cpp: In member function 'char sntp::GetNTPServerList(const char**, uint32_t*, int)': .pioenvs/arduino_uno/Adafruit_CC3000_Library/utility/sntp.cpp:360:25: warning: converting to non-pointer type 'uint32_t {aka long unsigned int}' from NULL [-Wconversion-null] - uint32_t ntpServer= NULL; - + uint32_t ntpServer= NULL; diff --git a/platformio/boards/arduino.json b/platformio/boards/arduino.json index 88cbe334..f3e6e5ec 100644 --- a/platformio/boards/arduino.json +++ b/platformio/boards/arduino.json @@ -560,5 +560,5 @@ "use_1200bps_touch": true, "wait_for_upload_port": false } - } + } } diff --git a/platformio/builder/main.py b/platformio/builder/main.py index 88698c26..3bde0b9d 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -81,11 +81,9 @@ if "BOARD" in env: if "BOARD_F_CPU" not in env: env.Replace(BOARD_F_CPU="${BOARD_OPTIONS['build']['f_cpu']}") if "UPLOAD_PROTOCOL" not in env: - env.Replace( - UPLOAD_PROTOCOL="${BOARD_OPTIONS['upload'].get('protocol', None)}") + env.Replace(UPLOAD_PROTOCOL="${BOARD_OPTIONS['upload']['protocol']}") if "UPLOAD_SPEED" not in env: - env.Replace( - UPLOAD_SPEED="${BOARD_OPTIONS['upload'].get('speed', None)}") + env.Replace(UPLOAD_SPEED="${BOARD_OPTIONS['upload']['speed']}") if "IGNORE_LIBS" in env: env['IGNORE_LIBS'] = [l.strip() for l in env['IGNORE_LIBS'].split(",")] diff --git a/platformio/util.py b/platformio/util.py index 305a37bd..7b13f9fc 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -10,7 +10,9 @@ from subprocess import PIPE, Popen import requests -from platformio import __apiurl__, __version__, exception +from platformio import __apiurl__, __version__ +from platformio.exception import (APIRequestError, GetSerialPortsError, + NotPlatformProject) try: from configparser import ConfigParser @@ -31,7 +33,7 @@ def get_home_dir(): if (config.has_section("platformio") and config.has_option("platformio", "home_dir")): home_dir = config.get("platformio", "home_dir") - except exception.NotPlatformProject: + except NotPlatformProject: pass if not home_dir: @@ -53,7 +55,7 @@ def get_lib_dir(): if lib_dir.startswith("~"): lib_dir = expanduser(lib_dir) return abspath(lib_dir) - except exception.NotPlatformProject: + except NotPlatformProject: pass return join(get_home_dir(), "lib") @@ -73,7 +75,7 @@ def get_pioenvs_dir(): def get_project_config(): path = join(get_project_dir(), "platformio.ini") if not isfile(path): - raise exception.NotPlatformProject(get_project_dir()) + raise NotPlatformProject(get_project_dir()) cp = ConfigParser() cp.read(path) return cp @@ -99,7 +101,7 @@ def get_serialports(): elif os_name == "posix": from serial.tools.list_ports_posix import comports else: - raise exception.GetSerialPortsError(os_name) + raise GetSerialPortsError(os_name) return[{"port": p, "description": d, "hwid": h} for p, d, h in comports()] @@ -125,15 +127,14 @@ def get_api_result(path, params=None, data=None): r.raise_for_status() except requests.exceptions.HTTPError as e: if result and "errors" in result: - raise exception.APIRequestError(result['errors'][0]['title']) + raise APIRequestError(result['errors'][0]['title']) else: - raise exception.APIRequestError(e) + raise APIRequestError(e) except requests.exceptions.ConnectionError: - raise exception.APIRequestError( + raise APIRequestError( "Could not connect to PlatformIO Registry Service") except ValueError: - raise exception.APIRequestError( - "Invalid response: %s" % r.text.encode("utf-8")) + raise APIRequestError("Invalid response: %s" % r.text.encode("utf-8")) finally: if r: r.close() @@ -142,24 +143,15 @@ def get_api_result(path, params=None, data=None): def get_boards(type_=None): boards = {} - try: - boards = get_boards._cache # pylint: disable=W0212 - except AttributeError: - bdirs = [join(get_source_dir(), "boards")] - if isdir(join(get_home_dir(), "boards")): - bdirs.append(join(get_home_dir(), "boards")) + bdirs = [join(get_source_dir(), "boards")] + if isdir(join(get_home_dir(), "boards")): + bdirs.append(join(get_home_dir(), "boards")) - for bdir in bdirs: - for json_file in listdir(bdir): - if not json_file.endswith(".json"): - continue - with open(join(bdir, json_file)) as f: - boards.update(json.load(f)) - get_boards._cache = boards # pylint: disable=W0212 + for bdir in bdirs: + for json_file in listdir(bdir): + if not json_file.endswith(".json"): + continue + with open(join(bdir, json_file)) as f: + boards.update(json.load(f)) - if type_ is None: - return boards - else: - if type_ not in boards: - raise exception.UnknownBoard(type_) - return boards[type_] + return boards[type_] if type_ is not None else boards diff --git a/tests/test_examples.py b/tests/test_examples.py new file mode 100644 index 00000000..180b89b4 --- /dev/null +++ b/tests/test_examples.py @@ -0,0 +1,70 @@ +# Copyright (C) Ivan Kravets +# See LICENSE for details. + +from os import listdir, walk +from os.path import dirname, getsize, isdir, isfile, join, normpath +from shutil import rmtree + +import pytest + +from platformio import app +from platformio.util import exec_command + + +@pytest.fixture(scope="module") +def platformio_setup(request): + prev_settings = dict( + enable_telemetry=None, + enable_prompts=None + ) + for key, value in prev_settings.iteritems(): + prev_settings[key] = app.get_setting(key) + # disable temporary + if prev_settings[key]: + app.set_setting(key, False) + + def platformio_teardown(): + # restore settings + for key, value in prev_settings.iteritems(): + app.set_setting(key, value) + + request.addfinalizer(platformio_teardown) + + +def pytest_generate_tests(metafunc): + if "pioproject_dir" not in metafunc.fixturenames: + return + example_dirs = normpath(join(dirname(__file__), "..", "examples")) + project_dirs = [] + for root, _, files in walk(example_dirs): + if "platformio.ini" not in files: + continue + project_dirs.append(root) + metafunc.parametrize("pioproject_dir", project_dirs) + + +def test_run(platformio_setup, pioproject_dir): + if isdir(join(pioproject_dir, ".pioenvs")): + rmtree(join(pioproject_dir, ".pioenvs")) + + result = exec_command( + ["platformio", "run"], + cwd=pioproject_dir + ) + output = "%s\n%s" % (result['out'], result['err']) + if "error" in output.lower(): + pytest.fail(output) + + # check .elf file + pioenvs_dir = join(pioproject_dir, ".pioenvs") + for item in listdir(pioenvs_dir): + assert isfile(join(pioenvs_dir, item, "firmware.elf")) + # check .hex or .bin file + bin_file = join(pioenvs_dir, item, "firmware.bin") + hex_file = join(pioenvs_dir, item, "firmware.hex") + if not isfile(bin_file): + if not isfile(hex_file): + pytest.fail("Missed firmware file") + assert getsize(hex_file) > 0 + else: + assert getsize(bin_file) > 0 diff --git a/tox.ini b/tox.ini index 5bb7965c..3d06ea90 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,10 @@ +# Copyright (C) Ivan Kravets +# See LICENSE for details. + [tox] # toxworkdir = /tmp/.tox # toxworkdir = C:\Users\User\Downloads\.tox -envlist = docs, lint +envlist = docs, lint, pytest [testenv] envlogdir = /tmp/toxlogdir @@ -33,3 +36,12 @@ deps = commands = flake8 ./platformio pylint --rcfile=./.pylintrc ./platformio + +[testenv:pytest] +changedir = tests +usedevelop = True +deps = + pytest +commands = + pip install --egg http://sourceforge.net/projects/scons/files/latest/download + py.test -v -s --basetemp={envtmpdir}