mirror of
https://github.com/platformio/platformio-core.git
synced 2025-07-29 17:47:14 +02:00
Speedup PIO Home via internal calling of PIO Core CLI
This commit is contained in:
@ -119,8 +119,7 @@ An unexpected error occurred. Further steps:
|
||||
|
||||
|
||||
def debug_gdb_main():
|
||||
sys.argv = [sys.argv[0], "debug", "--interface", "gdb"] + sys.argv[1:]
|
||||
return main()
|
||||
return main([sys.argv[0], "debug", "--interface", "gdb"] + sys.argv[1:])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@ -123,7 +123,7 @@ def cli(ctx, project_dir, project_conf, environment, verbose, interface,
|
||||
if helpers.is_mi_mode(__unprocessed):
|
||||
click.echo('~"Preparing firmware for debugging...\\n"')
|
||||
output = helpers.GDBBytesIO()
|
||||
with helpers.capture_std_streams(output):
|
||||
with util.capture_std_streams(output):
|
||||
helpers.predebug_project(ctx, project_dir, env_name, preload,
|
||||
verbose)
|
||||
output.close()
|
||||
|
@ -14,7 +14,6 @@
|
||||
|
||||
import sys
|
||||
import time
|
||||
from contextlib import contextmanager
|
||||
from fnmatch import fnmatch
|
||||
from hashlib import sha1
|
||||
from io import BytesIO
|
||||
@ -41,17 +40,6 @@ class GDBBytesIO(BytesIO): # pylint: disable=too-few-public-methods
|
||||
self.STDOUT.flush()
|
||||
|
||||
|
||||
@contextmanager
|
||||
def capture_std_streams(stdout, stderr=None):
|
||||
_stdout = sys.stdout
|
||||
_stderr = sys.stderr
|
||||
sys.stdout = stdout
|
||||
sys.stderr = stderr or stdout
|
||||
yield
|
||||
sys.stdout = _stdout
|
||||
sys.stderr = _stderr
|
||||
|
||||
|
||||
def is_mi_mode(args):
|
||||
return "--interpreter" in " ".join(args)
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import codecs
|
||||
import glob
|
||||
import os
|
||||
import shutil
|
||||
@ -67,10 +68,10 @@ class OSRPC(object):
|
||||
def request_content(self, uri, data=None, headers=None, cache_valid=None):
|
||||
if uri.startswith('http'):
|
||||
return self.fetch_content(uri, data, headers, cache_valid)
|
||||
if isfile(uri):
|
||||
with open(uri) as fp:
|
||||
return fp.read()
|
||||
return None
|
||||
if not isfile(uri):
|
||||
return None
|
||||
with codecs.open(uri, encoding="utf-8") as fp:
|
||||
return fp.read()
|
||||
|
||||
@staticmethod
|
||||
def open_url(url):
|
||||
|
@ -17,12 +17,12 @@ from __future__ import absolute_import
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
from io import BytesIO
|
||||
|
||||
import jsonrpc # pylint: disable=import-error
|
||||
from twisted.internet import utils # pylint: disable=import-error
|
||||
from twisted.internet import threads # pylint: disable=import-error
|
||||
|
||||
from platformio import __version__
|
||||
from platformio.commands.home import helpers
|
||||
from platformio import __main__, __version__, util
|
||||
from platformio.compat import string_types
|
||||
|
||||
|
||||
@ -30,7 +30,6 @@ class PIOCoreRPC(object):
|
||||
|
||||
@staticmethod
|
||||
def call(args, options=None):
|
||||
json_output = "--json-output" in args
|
||||
try:
|
||||
args = [
|
||||
str(arg) if not isinstance(arg, string_types) else arg
|
||||
@ -39,13 +38,20 @@ class PIOCoreRPC(object):
|
||||
except UnicodeError:
|
||||
raise jsonrpc.exceptions.JSONRPCDispatchException(
|
||||
code=4002, message="PIO Core: non-ASCII chars in arguments")
|
||||
d = utils.getProcessOutputAndValue(
|
||||
helpers.get_core_fullpath(),
|
||||
args,
|
||||
path=(options or {}).get("cwd"),
|
||||
env={k: v
|
||||
for k, v in os.environ.items() if "%" not in k})
|
||||
d.addCallback(PIOCoreRPC._call_callback, json_output)
|
||||
|
||||
def _call_cli():
|
||||
outbuff = BytesIO()
|
||||
errbuff = BytesIO()
|
||||
with util.capture_std_streams(outbuff, errbuff):
|
||||
with util.cd((options or {}).get("cwd") or os.getcwd()):
|
||||
exit_code = __main__.main(["-c"] + args)
|
||||
result = (outbuff.getvalue(), errbuff.getvalue(), exit_code)
|
||||
outbuff.close()
|
||||
errbuff.close()
|
||||
return result
|
||||
|
||||
d = threads.deferToThread(_call_cli)
|
||||
d.addCallback(PIOCoreRPC._call_callback, "--json-output" in args)
|
||||
d.addErrback(PIOCoreRPC._call_errback)
|
||||
return d
|
||||
|
||||
|
@ -182,7 +182,7 @@ def platform_frameworks(query, json_output):
|
||||
for framework in util.get_api_result("/frameworks", cache_valid="7d"):
|
||||
if query == "all":
|
||||
query = ""
|
||||
search_data = dump_json_to_unicode(framework)
|
||||
search_data = framework
|
||||
if query and query.lower() not in search_data.lower():
|
||||
continue
|
||||
framework['homepage'] = ("https://platformio.org/frameworks/" +
|
||||
|
@ -54,6 +54,8 @@ if PY2:
|
||||
return data
|
||||
|
||||
def dump_json_to_unicode(obj):
|
||||
if isinstance(obj, unicode):
|
||||
return obj
|
||||
return json.dumps(obj,
|
||||
encoding=get_filesystem_encoding(),
|
||||
ensure_ascii=False).encode("utf8")
|
||||
@ -100,4 +102,6 @@ else:
|
||||
return data.encode()
|
||||
|
||||
def dump_json_to_unicode(obj):
|
||||
if isinstance(obj, string_types):
|
||||
return obj
|
||||
return json.dumps(obj, ensure_ascii=False)
|
||||
|
@ -20,6 +20,7 @@ import socket
|
||||
import stat
|
||||
import sys
|
||||
import time
|
||||
from contextlib import contextmanager
|
||||
from functools import wraps
|
||||
from glob import glob
|
||||
from os.path import abspath, basename, dirname, isfile, join
|
||||
@ -107,6 +108,17 @@ def singleton(cls):
|
||||
return get_instance
|
||||
|
||||
|
||||
@contextmanager
|
||||
def capture_std_streams(stdout, stderr=None):
|
||||
_stdout = sys.stdout
|
||||
_stderr = sys.stderr
|
||||
sys.stdout = stdout
|
||||
sys.stderr = stderr or stdout
|
||||
yield
|
||||
sys.stdout = _stdout
|
||||
sys.stderr = _stderr
|
||||
|
||||
|
||||
def load_json(file_path):
|
||||
try:
|
||||
with open(file_path, "r") as f:
|
||||
|
Reference in New Issue
Block a user