Finally removed all tracks to the Python 2.7

This commit is contained in:
Ivan Kravets
2022-04-09 17:46:21 +03:00
parent 541fcbf015
commit 5e18f9bbda
17 changed files with 49 additions and 117 deletions

View File

@ -51,12 +51,13 @@ PlatformIO Core 5
* **Integration** * **Integration**
- Added a new build variable (``COMPILATIONDB_INCLUDE_TOOLCHAIN``) to include toolchain paths in the compilation database (`issue #3735 <https://github.com/platformio/platformio-core/issues/3735>`_) - Added a new build variable (``COMPILATIONDB_INCLUDE_TOOLCHAIN``) to include toolchain paths in the compilation database (`issue #3735 <https://github.com/platformio/platformio-core/issues/3735>`_)
- Changed default path for compilation database `compile_commands.json <https://docs.platformio.org/en/latest/integration/compile_commands.html>`__ to the root of the project - Changed default path for compilation database `compile_commands.json <https://docs.platformio.org/en/latest/integration/compile_commands.html>`__ to the project root
* **Miscellaneous** * **Miscellaneous**
- Improved PIO Remote setup on credit-card sized computers (Raspberry Pi, BeagleBon, etc) (`issue #3865 <https://github.com/platformio/platformio-core/issues/3865>`_) - Improved PIO Remote setup on credit-card sized computers (Raspberry Pi, BeagleBon, etc) (`issue #3865 <https://github.com/platformio/platformio-core/issues/3865>`_)
- Better handling of the failed tests using the `Unit Testing <https://docs.platformio.org/en/latest/plus/unit-testing.html>`__ solution. - Better handling of the failed tests using the `Unit Testing <https://docs.platformio.org/en/latest/plus/unit-testing.html>`__ solution
- Finally removed all tracks to the Python 2.7, the Python 3.6 is the minimum supported version.
5.2.5 (2022-02-10) 5.2.5 (2022-02-10)
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~

2
docs

Submodule docs updated: 7c02d91f4e...bde1247be3

View File

@ -12,15 +12,13 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# pylint: disable=import-outside-toplevel
import os import os
import sys import sys
from traceback import format_exc from traceback import format_exc
import click import click
from platformio import __version__, exception from platformio import __version__, exception, maintenance
from platformio.commands import PlatformioCLI from platformio.commands import PlatformioCLI
from platformio.compat import IS_CYGWIN, ensure_python3 from platformio.compat import IS_CYGWIN, ensure_python3
@ -55,16 +53,12 @@ def cli(ctx, force, caller, no_ansi):
except: # pylint: disable=bare-except except: # pylint: disable=bare-except
pass pass
from platformio import maintenance
maintenance.on_platformio_start(ctx, force, caller) maintenance.on_platformio_start(ctx, force, caller)
@cli.result_callback() @cli.result_callback()
@click.pass_context @click.pass_context
def process_result(ctx, result, *_, **__): def process_result(ctx, result, *_, **__):
from platformio import maintenance
maintenance.on_platformio_end(ctx, result) maintenance.on_platformio_end(ctx, result)
@ -111,10 +105,7 @@ def main(argv=None):
exit_code = int(e.code) exit_code = int(e.code)
except Exception as e: # pylint: disable=broad-except except Exception as e: # pylint: disable=broad-except
if not isinstance(e, exception.ReturnErrorCode): if not isinstance(e, exception.ReturnErrorCode):
if sys.version_info.major != 2: maintenance.on_platformio_exception(e)
from platformio import maintenance
maintenance.on_platformio_exception(e)
error_str = "Error: " error_str = "Error: "
if isinstance(e, exception.PlatformioException): if isinstance(e, exception.PlatformioException):
error_str += str(e) error_str += str(e)

View File

@ -16,6 +16,7 @@ import json
import math import math
import os import os
import socket import socket
from urllib.parse import urljoin
import requests.adapters import requests.adapters
from requests.packages.urllib3.util.retry import Retry # pylint:disable=import-error from requests.packages.urllib3.util.retry import Retry # pylint:disable=import-error
@ -24,11 +25,6 @@ from platformio import __check_internet_hosts__, __default_requests_timeout__, a
from platformio.cache import ContentCache, cleanup_content_cache from platformio.cache import ContentCache, cleanup_content_cache
from platformio.exception import PlatformioException, UserSideException from platformio.exception import PlatformioException, UserSideException
try:
from urllib.parse import urljoin
except ImportError:
from urlparse import urljoin
class HTTPClientError(PlatformioException): class HTTPClientError(PlatformioException):
def __init__(self, message, response=None): def __init__(self, message, response=None):

View File

@ -14,10 +14,11 @@
from __future__ import absolute_import from __future__ import absolute_import
import io
import json import json
import os import os
import sys import sys
from io import StringIO import threading
import click import click
from ajsonrpc.core import JSONRPC20DispatchException from ajsonrpc.core import JSONRPC20DispatchException
@ -27,27 +28,22 @@ from platformio import __main__, __version__, fs, proc
from platformio.commands.home import helpers from platformio.commands.home import helpers
from platformio.compat import get_locale_encoding, is_bytes from platformio.compat import get_locale_encoding, is_bytes
try:
from thread import get_ident as thread_get_ident
except ImportError:
from threading import get_ident as thread_get_ident
class MultiThreadingStdStream(object): class MultiThreadingStdStream(object):
def __init__(self, parent_stream): def __init__(self, parent_stream):
self._buffers = {thread_get_ident(): parent_stream} self._buffers = {threading.get_ident(): parent_stream}
def __getattr__(self, name): def __getattr__(self, name):
thread_id = thread_get_ident() thread_id = threading.get_ident()
self._ensure_thread_buffer(thread_id) self._ensure_thread_buffer(thread_id)
return getattr(self._buffers[thread_id], name) return getattr(self._buffers[thread_id], name)
def _ensure_thread_buffer(self, thread_id): def _ensure_thread_buffer(self, thread_id):
if thread_id not in self._buffers: if thread_id not in self._buffers:
self._buffers[thread_id] = StringIO() self._buffers[thread_id] = io.StringIO()
def write(self, value): def write(self, value):
thread_id = thread_get_ident() thread_id = threading.get_ident()
self._ensure_thread_buffer(thread_id) self._ensure_thread_buffer(thread_id)
return self._buffers[thread_id].write( return self._buffers[thread_id].write(
value.decode() if is_bytes(value) else value value.decode() if is_bytes(value) else value

View File

@ -18,6 +18,7 @@ import json
import logging import logging
import os import os
import time import time
from urllib.parse import quote
import click import click
from tabulate import tabulate from tabulate import tabulate
@ -32,11 +33,6 @@ from platformio.proc import is_ci
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
try:
from urllib.parse import quote
except ImportError:
from urllib import quote
CTX_META_INPUT_DIRS_KEY = __name__ + ".input_dirs" CTX_META_INPUT_DIRS_KEY = __name__ + ".input_dirs"
CTX_META_PROJECT_ENVIRONMENTS_KEY = __name__ + ".project_environments" CTX_META_PROJECT_ENVIRONMENTS_KEY = __name__ + ".project_environments"
CTX_META_STORAGE_DIRS_KEY = __name__ + ".storage_dirs" CTX_META_STORAGE_DIRS_KEY = __name__ + ".storage_dirs"

View File

@ -20,16 +20,14 @@ import sys
from platformio.exception import UserSideException from platformio.exception import UserSideException
if sys.version_info >= (3,): if sys.version_info >= (3, 7):
if sys.version_info >= (3, 7): from asyncio import create_task as aio_create_task
from asyncio import create_task as aio_create_task from asyncio import get_running_loop as aio_get_running_loop
from asyncio import get_running_loop as aio_get_running_loop else:
else: from asyncio import ensure_future as aio_create_task
from asyncio import ensure_future as aio_create_task from asyncio import get_event_loop as aio_get_running_loop
from asyncio import get_event_loop as aio_get_running_loop
PY2 = sys.version_info[0] == 2
IS_CYGWIN = sys.platform.startswith("cygwin") IS_CYGWIN = sys.platform.startswith("cygwin")
IS_WINDOWS = WINDOWS = sys.platform.startswith("win") IS_WINDOWS = WINDOWS = sys.platform.startswith("win")
IS_MACOS = sys.platform.startswith("darwin") IS_MACOS = sys.platform.startswith("darwin")

View File

@ -13,6 +13,7 @@
# limitations under the License. # limitations under the License.
import time import time
from urllib.parse import urlparse
import click import click
@ -22,11 +23,6 @@ from platformio.package.exception import UnknownPackageError
from platformio.package.meta import PackageSpec from platformio.package.meta import PackageSpec
from platformio.package.version import cast_version_to_semver from platformio.package.version import cast_version_to_semver
try:
from urllib.parse import urlparse
except ImportError:
from urlparse import urlparse
class RegistryFileMirrorIterator(object): class RegistryFileMirrorIterator(object):

View File

@ -18,6 +18,7 @@ import json
import os import os
import re import re
import tarfile import tarfile
from urllib.parse import urlparse
from platformio import util from platformio import util
from platformio.clients.http import fetch_remote_content from platformio.clients.http import fetch_remote_content
@ -25,11 +26,6 @@ from platformio.compat import get_object_members, string_types
from platformio.package.exception import ManifestParserError, UnknownManifestError from platformio.package.exception import ManifestParserError, UnknownManifestError
from platformio.project.helpers import is_platformio_project from platformio.project.helpers import is_platformio_project
try:
from urllib.parse import urlparse
except ImportError:
from urlparse import urlparse
class ManifestFileType(object): class ManifestFileType(object):
PLATFORM_JSON = "platform.json" PLATFORM_JSON = "platform.json"

View File

@ -26,37 +26,21 @@ from platformio.clients.http import fetch_remote_content
from platformio.package.exception import ManifestValidationError from platformio.package.exception import ManifestValidationError
from platformio.util import memoized from platformio.util import memoized
MARSHMALLOW_2 = marshmallow.__version_info__ < (3,)
class BaseSchema(Schema):
class Meta(object): # pylint: disable=no-init
unknown = marshmallow.EXCLUDE # pylint: disable=no-member
if MARSHMALLOW_2:
class CompatSchema(Schema):
pass
else:
class CompatSchema(Schema):
class Meta(object): # pylint: disable=no-init
unknown = marshmallow.EXCLUDE # pylint: disable=no-member
def handle_error(self, error, data, **_): # pylint: disable=arguments-differ
raise ManifestValidationError(
error.messages,
data,
error.valid_data if hasattr(error, "valid_data") else error.data,
)
class BaseSchema(CompatSchema):
def load_manifest(self, data): def load_manifest(self, data):
if MARSHMALLOW_2:
data, errors = self.load(data)
if errors:
raise ManifestValidationError(errors, data, data)
return data
return self.load(data) return self.load(data)
def handle_error(self, error, data, **_): # pylint: disable=arguments-differ
raise ManifestValidationError(
error.messages,
data,
error.valid_data if hasattr(error, "valid_data") else error.data,
)
class StrictSchema(BaseSchema): class StrictSchema(BaseSchema):
def handle_error(self, error, data, **_): # pylint: disable=arguments-differ def handle_error(self, error, data, **_): # pylint: disable=arguments-differ
@ -67,8 +51,6 @@ class StrictSchema(BaseSchema):
] ]
else: else:
error.valid_data = None error.valid_data = None
if MARSHMALLOW_2:
error.data = error.valid_data
raise error raise error

View File

@ -16,6 +16,7 @@ import os
import re import re
import subprocess import subprocess
import sys import sys
from urllib.parse import urlparse
from platformio import proc from platformio import proc
from platformio.package.exception import ( from platformio.package.exception import (
@ -24,11 +25,6 @@ from platformio.package.exception import (
UserSideException, UserSideException,
) )
try:
from urllib.parse import urlparse
except ImportError:
from urlparse import urlparse
class VCSBaseException(PackageException): class VCSBaseException(PackageException):
pass pass

View File

@ -16,6 +16,7 @@ import base64
import os import os
import re import re
import sys import sys
from urllib.parse import quote
import click import click
@ -24,11 +25,6 @@ from platformio.compat import hashlib_encode_data, is_bytes
from platformio.package.manager.core import get_core_package_dir from platformio.package.manager.core import get_core_package_dir
from platformio.platform.exception import BuildScriptNotFound from platformio.platform.exception import BuildScriptNotFound
try:
from urllib.parse import quote
except ImportError:
from urllib import quote
class PlatformRunMixin(object): class PlatformRunMixin(object):

View File

@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import configparser
import glob import glob
import json import json
import os import os
@ -24,11 +25,6 @@ from platformio.compat import string_types
from platformio.project import exception from platformio.project import exception
from platformio.project.options import ProjectOptions from platformio.project.options import ProjectOptions
try:
import ConfigParser as ConfigParser
except ImportError:
import configparser as ConfigParser
CONFIG_HEADER = """ CONFIG_HEADER = """
; PlatformIO Project Configuration File ; PlatformIO Project Configuration File
; ;
@ -87,7 +83,7 @@ class ProjectConfigBase(object):
self.expand_interpolations = expand_interpolations self.expand_interpolations = expand_interpolations
self.warnings = [] self.warnings = []
self._parsed = [] self._parsed = []
self._parser = ConfigParser.ConfigParser(inline_comment_prefixes=("#", ";")) self._parser = configparser.ConfigParser(inline_comment_prefixes=("#", ";"))
if path and os.path.isfile(path): if path and os.path.isfile(path):
self.read(path, parse_extra) self.read(path, parse_extra)
@ -102,7 +98,7 @@ class ProjectConfigBase(object):
self._parsed.append(path) self._parsed.append(path)
try: try:
self._parser.read(path, "utf-8") self._parser.read(path, "utf-8")
except ConfigParser.Error as e: except configparser.Error as e:
raise exception.InvalidProjectConfError(path, str(e)) raise exception.InvalidProjectConfError(path, str(e))
if not parse_extra: if not parse_extra:
@ -310,7 +306,7 @@ class ProjectConfigBase(object):
value = None value = None
try: try:
value = self.getraw(section, option, default) value = self.getraw(section, option, default)
except ConfigParser.Error as e: except configparser.Error as e:
raise exception.InvalidProjectConfError(self.path, str(e)) raise exception.InvalidProjectConfError(self.path, str(e))
option_meta = ProjectOptions.get("%s.%s" % (section.split(":", 1)[0], option)) option_meta = ProjectOptions.get("%s.%s" % (section.split(":", 1)[0], option))
@ -398,7 +394,7 @@ class ProjectConfig(ProjectConfigBase, ProjectConfigDirsMixin):
def update(self, data, clear=False): def update(self, data, clear=False):
assert isinstance(data, list) assert isinstance(data, list)
if clear: if clear:
self._parser = ConfigParser.ConfigParser() self._parser = configparser.ConfigParser()
for section, options in data: for section, options in data:
if not self._parser.has_section(section): if not self._parser.has_section(section):
self._parser.add_section(section) self._parser.add_section(section)

View File

@ -16,6 +16,7 @@ import atexit
import hashlib import hashlib
import json import json
import os import os
import queue
import re import re
import shutil import shutil
import sys import sys
@ -32,11 +33,6 @@ from platformio.compat import hashlib_encode_data, string_types
from platformio.proc import is_ci, is_container from platformio.proc import is_ci, is_container
from platformio.project.helpers import is_platformio_project from platformio.project.helpers import is_platformio_project
try:
import queue
except ImportError:
import Queue as queue
class TelemetryBase(object): class TelemetryBase(object):
def __init__(self): def __init__(self):

View File

@ -24,24 +24,21 @@ from platformio import (
__url__, __url__,
__version__, __version__,
) )
from platformio.compat import PY2
minimal_requirements = [ minimal_requirements = [
"bottle==0.12.*", "bottle==0.12.*",
"click%s" % (">=8.0.3,<9" if sys.version_info >= (3, 7) else "==8.0.4"), "click%s" % (">=8.0.3,<9" if sys.version_info >= (3, 7) else "==8.0.4"),
"colorama", "colorama",
"marshmallow%s" % (">=2,<3" if PY2 else ">=2,<4"), "marshmallow==3.*",
"pyelftools>=0.27,<1", "pyelftools>=0.27,<1",
"pyserial==3.*", "pyserial==3.*",
"requests==2.*", "requests==2.*",
"semantic_version==2.9.*", "semantic_version==2.9.*",
"tabulate==0.8.*", "tabulate==0.8.*",
"zeroconf<1",
] ]
if not PY2:
minimal_requirements.append("zeroconf<1")
home_requirements = [ home_requirements = [
"aiofiles==0.8.*", "aiofiles==0.8.*",
"ajsonrpc==1.*", "ajsonrpc==1.*",
@ -59,7 +56,8 @@ setup(
author_email=__email__, author_email=__email__,
url=__url__, url=__url__,
license=__license__, license=__license__,
install_requires=minimal_requirements + ([] if PY2 else home_requirements), install_requires=minimal_requirements + home_requirements,
python_requires=">=3.6",
packages=find_packages(exclude=["tests.*", "tests"]) + ["scripts"], packages=find_packages(exclude=["tests.*", "tests"]) + ["scripts"],
package_data={ package_data={
"platformio": [ "platformio": [

View File

@ -14,13 +14,14 @@
# pylint: disable=redefined-outer-name # pylint: disable=redefined-outer-name
import configparser
import os import os
import sys import sys
import pytest import pytest
from platformio import fs from platformio import fs
from platformio.project.config import ConfigParser, ProjectConfig from platformio.project.config import ProjectConfig
from platformio.project.exception import InvalidProjectConfError, UnknownEnvNamesError from platformio.project.exception import InvalidProjectConfError, UnknownEnvNamesError
BASE_CONFIG = """ BASE_CONFIG = """
@ -154,7 +155,7 @@ def test_defaults(config):
def test_sections(config): def test_sections(config):
with pytest.raises(ConfigParser.NoSectionError): with pytest.raises(configparser.NoSectionError):
config.getraw("unknown_section", "unknown_option") config.getraw("unknown_section", "unknown_option")
assert config.sections() == [ assert config.sections() == [
@ -276,10 +277,10 @@ def test_sysenv_options(config):
def test_getraw_value(config): def test_getraw_value(config):
# unknown option # unknown option
with pytest.raises(ConfigParser.NoOptionError): with pytest.raises(configparser.NoOptionError):
config.getraw("custom", "unknown_option") config.getraw("custom", "unknown_option")
# unknown option even if exists in [env] # unknown option even if exists in [env]
with pytest.raises(ConfigParser.NoOptionError): with pytest.raises(configparser.NoOptionError):
config.getraw("platformio", "monitor_speed") config.getraw("platformio", "monitor_speed")
# default # default

View File

@ -19,7 +19,6 @@ from glob import glob
import pytest import pytest
from platformio import fs, proc from platformio import fs, proc
from platformio.compat import PY2
from platformio.package.manager.platform import PlatformPackageManager from platformio.package.manager.platform import PlatformPackageManager
from platformio.platform.factory import PlatformFactory from platformio.platform.factory import PlatformFactory
from platformio.project.config import ProjectConfig from platformio.project.config import ProjectConfig
@ -48,8 +47,6 @@ def pytest_generate_tests(metafunc):
for root, _, files in os.walk(examples_dir): for root, _, files in os.walk(examples_dir):
if "platformio.ini" not in files or ".skiptest" in files: if "platformio.ini" not in files or ".skiptest" in files:
continue continue
if "zephyr-" in root and PY2:
continue
group = os.path.basename(root) group = os.path.basename(root)
if "-" in group: if "-" in group:
group = group.split("-", 1)[0] group = group.split("-", 1)[0]