From a10625a0529d57c3fc385898e362b4239669b2d6 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 13 Feb 2020 15:53:42 +0200 Subject: [PATCH] Automatically rebuild contrib-pysite package when import fails // Issue #3313 --- docs | 2 +- platformio/commands/home/command.py | 14 +++++- platformio/managers/core.py | 78 ++++++++++++++++++++++++++++- 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/docs b/docs index 6dd2fec1..3a399f12 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 6dd2fec1141b104dc4867b746d9335263cdf209e +Subproject commit 3a399f127b6e16c75e47ff06d90f2aace7a5f94b diff --git a/platformio/commands/home/command.py b/platformio/commands/home/command.py index c5d5dc14..82844b7a 100644 --- a/platformio/commands/home/command.py +++ b/platformio/commands/home/command.py @@ -22,7 +22,11 @@ import click from platformio import exception from platformio.compat import WINDOWS -from platformio.managers.core import get_core_package_dir, inject_contrib_pysite +from platformio.managers.core import ( + build_contrib_pysite_deps, + get_core_package_dir, + inject_contrib_pysite, +) @click.command("home", short_help="PIO Home") @@ -50,7 +54,13 @@ def cli(port, host, no_open, shutdown_timeout): # import contrib modules inject_contrib_pysite() - from autobahn.twisted.resource import WebSocketResource + + try: + from autobahn.twisted.resource import WebSocketResource + except (ImportError, ModuleNotFoundError): + build_contrib_pysite_deps(get_core_package_dir("contrib-pysite")) + from autobahn.twisted.resource import WebSocketResource + from twisted.internet import reactor from twisted.web import server diff --git a/platformio/managers/core.py b/platformio/managers/core.py index c7203eca..55a0ece4 100644 --- a/platformio/managers/core.py +++ b/platformio/managers/core.py @@ -12,12 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import os import subprocess import sys from os.path import dirname, join -from platformio import __version__, exception, fs +from platformio import __version__, exception, fs, util from platformio.compat import PY2, WINDOWS from platformio.managers.package import PackageManager from platformio.proc import copy_pythonpath_to_osenv, get_pythonexe_path @@ -25,7 +26,7 @@ from platformio.project.config import ProjectConfig CORE_PACKAGES = { "contrib-piohome": "~3.1.0", - "contrib-pysite": "~2.%d%d.0" % (sys.version_info[0], sys.version_info[1]), + "contrib-pysite": "~2.%d%d.0" % (sys.version_info.major, sys.version_info.minor), "tool-pioplus": "^2.6.1", "tool-unity": "~1.20500.0", "tool-scons": "~2.20501.7" if PY2 else "~3.30102.0", @@ -113,6 +114,79 @@ def inject_contrib_pysite(): sys.path.insert(0, contrib_pysite_dir) +def build_contrib_pysite_deps(target_dir): + if os.path.isdir(target_dir): + util.rmtree_(target_dir) + os.makedirs(target_dir) + with open(os.path.join(target_dir, "package.json"), "w") as fp: + json.dump( + dict( + name="contrib-pysite", + version="2.%d%d.0" % (sys.version_info.major, sys.version_info.minor), + system=util.get_systype(), + ), + fp, + ) + + pythonexe = get_pythonexe_path() + for dep in get_contrib_pysite_deps(): + subprocess.call( + [ + pythonexe, + "-m", + "pip", + "install", + "--no-cache-dir", + "--no-compile", + "-t", + target_dir, + dep, + ] + ) + return True + + +def get_contrib_pysite_deps(): + sys_type = util.get_systype() + py_version = "%d%d" % (sys.version_info.major, sys.version_info.minor) + + twisted_version = "19.7.0" + result = [ + "twisted == %s" % twisted_version, + "autobahn == 19.10.1", + "json-rpc == 1.12.1", + ] + + # twisted[tls], see setup.py for %twisted_version% + result.extend( + ["pyopenssl >= 16.0.0", "service_identity >= 18.1.0", "idna >= 0.6, != 2.3"] + ) + + # zeroconf + if sys.version_info.major < 3: + result.append( + "https://github.com/ivankravets/python-zeroconf/" "archive/pio-py27.zip" + ) + else: + result.append("zeroconf == 0.23.0") + + if "windows" in sys_type: + result.append("pypiwin32 == 223") + # workaround for twisted wheels + twisted_wheel = ( + "https://download.lfd.uci.edu/pythonlibs/g5apjq5m/Twisted-" + "%s-cp%s-cp%sm-win%s.whl" + % ( + twisted_version, + py_version, + py_version, + "_amd64" if "amd64" in sys_type else "32", + ) + ) + result[0] = twisted_wheel + return result + + def pioplus_call(args, **kwargs): if WINDOWS and sys.version_info < (2, 7, 6): raise exception.PlatformioException(