forked from platformio/platformio-core
Added support for the latest Python "Click" package (CLI Builder) // Resolve #349
This commit is contained in:
@ -14,6 +14,8 @@ PlatformIO 4.0
|
|||||||
* Include external configuration files with `extra_configs <http://docs.platformio.org/page/projectconf/section_platformio.html#extra-configs>`__ option
|
* Include external configuration files with `extra_configs <http://docs.platformio.org/page/projectconf/section_platformio.html#extra-configs>`__ option
|
||||||
(`issue #1590 <https://github.com/platformio/platformio-core/issues/1590>`_)
|
(`issue #1590 <https://github.com/platformio/platformio-core/issues/1590>`_)
|
||||||
* Override default source and include directories for a library via `library.json <http://docs.platformio.org/page/librarymanager/config.html>`__ manifest using ``includeDir`` and ``srcDir`` fields
|
* Override default source and include directories for a library via `library.json <http://docs.platformio.org/page/librarymanager/config.html>`__ manifest using ``includeDir`` and ``srcDir`` fields
|
||||||
|
* Added support for the latest Python "Click" package (CLI Builder)
|
||||||
|
(`issue #349 <https://github.com/platformio/platformio-core/issues/349>`_)
|
||||||
|
|
||||||
PlatformIO 3.0
|
PlatformIO 3.0
|
||||||
--------------
|
--------------
|
||||||
|
@ -14,49 +14,13 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from os.path import join
|
|
||||||
from platform import system
|
from platform import system
|
||||||
from traceback import format_exc
|
from traceback import format_exc
|
||||||
|
|
||||||
import click
|
import click
|
||||||
|
|
||||||
from platformio import __version__, exception, maintenance
|
from platformio import __version__, exception, maintenance
|
||||||
from platformio.util import get_source_dir
|
from platformio.commands import PlatformioCLI
|
||||||
|
|
||||||
|
|
||||||
class PlatformioCLI(click.MultiCommand): # pylint: disable=R0904
|
|
||||||
|
|
||||||
def list_commands(self, ctx):
|
|
||||||
cmds = []
|
|
||||||
for filename in os.listdir(join(get_source_dir(), "commands")):
|
|
||||||
if filename.startswith("__init__"):
|
|
||||||
continue
|
|
||||||
if filename.endswith(".py"):
|
|
||||||
cmds.append(filename[:-3])
|
|
||||||
cmds.sort()
|
|
||||||
return cmds
|
|
||||||
|
|
||||||
def get_command(self, ctx, cmd_name):
|
|
||||||
mod = None
|
|
||||||
try:
|
|
||||||
mod = __import__("platformio.commands." + cmd_name, None, None,
|
|
||||||
["cli"])
|
|
||||||
except ImportError:
|
|
||||||
try:
|
|
||||||
return self._handle_obsolate_command(cmd_name)
|
|
||||||
except AttributeError:
|
|
||||||
raise click.UsageError('No such command "%s"' % cmd_name, ctx)
|
|
||||||
return mod.cli
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _handle_obsolate_command(name):
|
|
||||||
if name == "platforms":
|
|
||||||
from platformio.commands import platform
|
|
||||||
return platform.cli
|
|
||||||
if name == "serialports":
|
|
||||||
from platformio.commands import device
|
|
||||||
return device.cli
|
|
||||||
raise AttributeError()
|
|
||||||
|
|
||||||
|
|
||||||
@click.command(
|
@click.command(
|
||||||
|
@ -11,3 +11,51 @@
|
|||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
# 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 os
|
||||||
|
from os.path import dirname, join
|
||||||
|
|
||||||
|
import click
|
||||||
|
|
||||||
|
|
||||||
|
class PlatformioCLI(click.MultiCommand):
|
||||||
|
|
||||||
|
leftover_args = []
|
||||||
|
|
||||||
|
def invoke(self, ctx):
|
||||||
|
PlatformioCLI.leftover_args = ctx.args
|
||||||
|
if hasattr(ctx, "protected_args"):
|
||||||
|
PlatformioCLI.leftover_args = ctx.protected_args + ctx.args
|
||||||
|
return super(PlatformioCLI, self).invoke(ctx)
|
||||||
|
|
||||||
|
def list_commands(self, ctx):
|
||||||
|
cmds = []
|
||||||
|
for filename in os.listdir(join(dirname(__file__), "commands")):
|
||||||
|
if filename.startswith("__init__"):
|
||||||
|
continue
|
||||||
|
if filename.endswith(".py"):
|
||||||
|
cmds.append(filename[:-3])
|
||||||
|
cmds.sort()
|
||||||
|
return cmds
|
||||||
|
|
||||||
|
def get_command(self, ctx, cmd_name):
|
||||||
|
mod = None
|
||||||
|
try:
|
||||||
|
mod = __import__("platformio.commands." + cmd_name, None, None,
|
||||||
|
["cli"])
|
||||||
|
except ImportError:
|
||||||
|
try:
|
||||||
|
return self._handle_obsolate_command(cmd_name)
|
||||||
|
except AttributeError:
|
||||||
|
raise click.UsageError('No such command "%s"' % cmd_name, ctx)
|
||||||
|
return mod.cli
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _handle_obsolate_command(name):
|
||||||
|
if name == "platforms":
|
||||||
|
from platformio.commands import platform
|
||||||
|
return platform.cli
|
||||||
|
if name == "serialports":
|
||||||
|
from platformio.commands import device
|
||||||
|
return device.cli
|
||||||
|
raise AttributeError()
|
||||||
|
@ -21,6 +21,7 @@ from os.path import isdir, join
|
|||||||
import click
|
import click
|
||||||
|
|
||||||
from platformio import exception, util
|
from platformio import exception, util
|
||||||
|
from platformio.commands import PlatformioCLI
|
||||||
from platformio.managers.lib import LibraryManager, get_builtin_libs
|
from platformio.managers.lib import LibraryManager, get_builtin_libs
|
||||||
from platformio.project.helpers import (
|
from platformio.project.helpers import (
|
||||||
get_project_dir, get_projectlibdeps_dir, is_platformio_project)
|
get_project_dir, get_projectlibdeps_dir, is_platformio_project)
|
||||||
@ -78,7 +79,7 @@ def cli(ctx, **options):
|
|||||||
ctx.invoked_subcommand)
|
ctx.invoked_subcommand)
|
||||||
|
|
||||||
ctx.obj = LibraryManager(storage_dir)
|
ctx.obj = LibraryManager(storage_dir)
|
||||||
if "--json-output" not in ctx.args:
|
if "--json-output" not in PlatformioCLI.leftover_args:
|
||||||
click.echo("Library Storage: " + storage_dir)
|
click.echo("Library Storage: " + storage_dir)
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import click
|
|||||||
import semantic_version
|
import semantic_version
|
||||||
|
|
||||||
from platformio import __version__, app, exception, telemetry, util
|
from platformio import __version__, app, exception, telemetry, util
|
||||||
|
from platformio.commands import PlatformioCLI
|
||||||
from platformio.commands.lib import lib_update as cmd_lib_update
|
from platformio.commands.lib import lib_update as cmd_lib_update
|
||||||
from platformio.commands.platform import \
|
from platformio.commands.platform import \
|
||||||
platform_install as cmd_platform_install
|
platform_install as cmd_platform_install
|
||||||
@ -40,12 +41,12 @@ def on_platformio_start(ctx, force, caller):
|
|||||||
set_caller(caller)
|
set_caller(caller)
|
||||||
telemetry.on_command()
|
telemetry.on_command()
|
||||||
|
|
||||||
if not in_silence(ctx):
|
if not in_silence():
|
||||||
after_upgrade(ctx)
|
after_upgrade(ctx)
|
||||||
|
|
||||||
|
|
||||||
def on_platformio_end(ctx, result): # pylint: disable=W0613
|
def on_platformio_end(ctx, result): # pylint: disable=unused-argument
|
||||||
if in_silence(ctx):
|
if in_silence():
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -64,14 +65,11 @@ def on_platformio_exception(e):
|
|||||||
telemetry.on_exception(e)
|
telemetry.on_exception(e)
|
||||||
|
|
||||||
|
|
||||||
def in_silence(ctx=None):
|
def in_silence():
|
||||||
ctx = ctx or app.get_session_var("command_ctx")
|
args = PlatformioCLI.leftover_args
|
||||||
if not ctx:
|
return args and any([
|
||||||
return True
|
args[0] == "debug" and "--interpreter" in " ".join(args),
|
||||||
return ctx.args and any([
|
args[0] == "upgrade", "--json-output" in args, "--version" in args
|
||||||
ctx.args[0] == "debug" and "--interpreter" in " ".join(ctx.args),
|
|
||||||
ctx.args[0] == "upgrade", "--json-output" in ctx.args,
|
|
||||||
"--version" in ctx.args
|
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ CORE_PACKAGES = {
|
|||||||
"contrib-piohome": "^2.0.1",
|
"contrib-piohome": "^2.0.1",
|
||||||
"contrib-pysite":
|
"contrib-pysite":
|
||||||
"~2.%d%d.190418" % (sys.version_info[0], sys.version_info[1]),
|
"~2.%d%d.190418" % (sys.version_info[0], sys.version_info[1]),
|
||||||
"tool-pioplus": "^2.1.4",
|
"tool-pioplus": "^2.1.5",
|
||||||
"tool-unity": "~1.20403.0",
|
"tool-unity": "~1.20403.0",
|
||||||
"tool-scons": "~2.20501.7" if util.PY2 else "~3.30005.0"
|
"tool-scons": "~2.20501.7" if util.PY2 else "~3.30005.0"
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ import click
|
|||||||
import requests
|
import requests
|
||||||
|
|
||||||
from platformio import __version__, app, exception, util
|
from platformio import __version__, app, exception, util
|
||||||
|
from platformio.commands import PlatformioCLI
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import queue
|
import queue
|
||||||
@ -133,10 +134,10 @@ class MeasurementProtocol(TelemetryBase):
|
|||||||
return _arg
|
return _arg
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if not app.get_session_var("command_ctx"):
|
args = [
|
||||||
return
|
str(arg).lower() for arg in PlatformioCLI.leftover_args
|
||||||
ctx_args = app.get_session_var("command_ctx").args
|
if not str(arg).startswith("-")
|
||||||
args = [str(s).lower() for s in ctx_args if not str(s).startswith("-")]
|
]
|
||||||
if not args:
|
if not args:
|
||||||
return
|
return
|
||||||
cmd_path = args[:1]
|
cmd_path = args[:1]
|
||||||
|
2
setup.py
2
setup.py
@ -19,7 +19,7 @@ from platformio import (__author__, __description__, __email__, __license__,
|
|||||||
|
|
||||||
install_requires = [
|
install_requires = [
|
||||||
"bottle<0.13",
|
"bottle<0.13",
|
||||||
"click>=5,<6",
|
"click>=5,<8",
|
||||||
"colorama",
|
"colorama",
|
||||||
"pyserial>=3,<4,!=3.3",
|
"pyserial>=3,<4,!=3.3",
|
||||||
"requests>=2.4.0,<3",
|
"requests>=2.4.0,<3",
|
||||||
|
@ -57,7 +57,7 @@ def test_init_duplicated_boards(clirunner, validate_cliresult, tmpdir):
|
|||||||
def test_init_ide_without_board(clirunner, tmpdir):
|
def test_init_ide_without_board(clirunner, tmpdir):
|
||||||
with tmpdir.as_cwd():
|
with tmpdir.as_cwd():
|
||||||
result = clirunner.invoke(cmd_init, ["--ide", "atom"])
|
result = clirunner.invoke(cmd_init, ["--ide", "atom"])
|
||||||
assert result.exit_code == -1
|
assert result.exit_code != 0
|
||||||
assert isinstance(result.exception, exception.ProjectEnvsNotAvailable)
|
assert isinstance(result.exception, exception.ProjectEnvsNotAvailable)
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,8 +16,11 @@ import json
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from platformio import exception
|
from platformio import exception
|
||||||
|
from platformio.commands import PlatformioCLI
|
||||||
from platformio.commands.lib import cli as cmd_lib
|
from platformio.commands.lib import cli as cmd_lib
|
||||||
|
|
||||||
|
PlatformioCLI.leftover_args = ["--json-output"] # hook for click
|
||||||
|
|
||||||
|
|
||||||
def test_search(clirunner, validate_cliresult):
|
def test_search(clirunner, validate_cliresult):
|
||||||
result = clirunner.invoke(cmd_lib, ["search", "DHT22"])
|
result = clirunner.invoke(cmd_lib, ["search", "DHT22"])
|
||||||
|
@ -38,14 +38,14 @@ def test_search_raw_output(clirunner, validate_cliresult):
|
|||||||
def test_install_unknown_version(clirunner):
|
def test_install_unknown_version(clirunner):
|
||||||
result = clirunner.invoke(cli_platform.platform_install,
|
result = clirunner.invoke(cli_platform.platform_install,
|
||||||
["atmelavr@99.99.99"])
|
["atmelavr@99.99.99"])
|
||||||
assert result.exit_code == -1
|
assert result.exit_code != 0
|
||||||
assert isinstance(result.exception, exception.UndefinedPackageVersion)
|
assert isinstance(result.exception, exception.UndefinedPackageVersion)
|
||||||
|
|
||||||
|
|
||||||
def test_install_unknown_from_registry(clirunner):
|
def test_install_unknown_from_registry(clirunner):
|
||||||
result = clirunner.invoke(cli_platform.platform_install,
|
result = clirunner.invoke(cli_platform.platform_install,
|
||||||
["unknown-platform"])
|
["unknown-platform"])
|
||||||
assert result.exit_code == -1
|
assert result.exit_code != 0
|
||||||
assert isinstance(result.exception, exception.UnknownPackage)
|
assert isinstance(result.exception, exception.UnknownPackage)
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user