155 lines
4.7 KiB
Python
155 lines
4.7 KiB
Python
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from urllib.parse import quote
|
|
|
|
import click
|
|
from tabulate import tabulate
|
|
|
|
from platformio import fs, util
|
|
from platformio.exception import UserSideException
|
|
from platformio.package.manager._registry import PackageManagerRegistryMixin
|
|
from platformio.package.meta import PackageSpec, PackageType
|
|
from platformio.registry.client import RegistryClient
|
|
|
|
|
|
@click.command("show", short_help="Show package information")
|
|
@click.argument("spec", metavar="[<owner>/]<pkg>[@<version>]")
|
|
@click.option(
|
|
"-t",
|
|
"--type",
|
|
"pkg_type",
|
|
type=click.Choice(list(PackageType.items().values())),
|
|
help="Package type",
|
|
)
|
|
def package_show_cmd(spec, pkg_type):
|
|
spec = PackageSpec(spec)
|
|
data = fetch_package_data(spec, pkg_type)
|
|
if not data:
|
|
raise UserSideException(
|
|
"Could not find '%s' package in the PlatormIO Registry" % spec.humanize()
|
|
)
|
|
|
|
click.echo()
|
|
click.echo(
|
|
"%s/%s"
|
|
% (
|
|
click.style(data["owner"]["username"], fg="cyan"),
|
|
click.style(data["name"], fg="cyan", bold=True),
|
|
)
|
|
)
|
|
click.echo(
|
|
"%s • %s • %s • Published on %s"
|
|
% (
|
|
data["type"].capitalize(),
|
|
data["version"]["name"],
|
|
"Private" if data.get("private") else "Public",
|
|
util.parse_datetime(data["version"]["released_at"]).strftime("%c"),
|
|
)
|
|
)
|
|
|
|
# Description
|
|
click.echo()
|
|
click.echo(data["description"])
|
|
|
|
# Extra info
|
|
click.echo()
|
|
fields = [
|
|
("homepage", "Homepage"),
|
|
("repository_url", "Repository"),
|
|
("license", "License"),
|
|
("popularity_rank", "Popularity"),
|
|
("stars_count", "Stars"),
|
|
("examples_count", "Examples"),
|
|
("version.unpacked_size", "Installed Size"),
|
|
("dependents_count", "Used By"),
|
|
("dependencies_count", "Dependencies"),
|
|
("platforms", "Compatible Platforms"),
|
|
("frameworks", "Compatible Frameworks"),
|
|
("keywords", "Keywords"),
|
|
]
|
|
type_plural = "libraries" if data["type"] == "library" else (data["type"] + "s")
|
|
extra = [
|
|
(
|
|
"Registry",
|
|
click.style(
|
|
"https://registry.platformio.org/%s/%s/%s"
|
|
% (type_plural, data["owner"]["username"], quote(data["name"])),
|
|
fg="blue",
|
|
),
|
|
)
|
|
]
|
|
for key, title in fields:
|
|
if "." in key:
|
|
k1, k2 = key.split(".")
|
|
value = data.get(k1, {}).get(k2)
|
|
else:
|
|
value = data.get(key)
|
|
if not value:
|
|
continue
|
|
if isinstance(value, list):
|
|
value = ", ".join(value)
|
|
elif key.endswith("_size"):
|
|
value = fs.humanize_file_size(value)
|
|
extra.append((title, value))
|
|
click.echo(tabulate(extra))
|
|
|
|
# Versions
|
|
click.echo("")
|
|
table = tabulate(
|
|
[
|
|
(
|
|
version["name"],
|
|
fs.humanize_file_size(max(f["size"] for f in version["files"])),
|
|
util.parse_datetime(version["released_at"]),
|
|
)
|
|
for version in data["versions"]
|
|
],
|
|
headers=["Version", "Size", "Published"],
|
|
)
|
|
click.echo(table)
|
|
click.echo("")
|
|
|
|
|
|
def fetch_package_data(spec, pkg_type=None):
|
|
assert isinstance(spec, PackageSpec)
|
|
client = RegistryClient()
|
|
if pkg_type and spec.owner and spec.name:
|
|
return client.get_package(
|
|
pkg_type, spec.owner, spec.name, version=spec.requirements
|
|
)
|
|
qualifiers = {}
|
|
if spec.id:
|
|
qualifiers["ids"] = str(spec.id)
|
|
if spec.name:
|
|
qualifiers["names"] = spec.name.lower()
|
|
if pkg_type:
|
|
qualifiers["types"] = pkg_type
|
|
if spec.owner:
|
|
qualifiers["owners"] = spec.owner.lower()
|
|
packages = client.list_packages(qualifiers=qualifiers)["items"]
|
|
if not packages:
|
|
return None
|
|
if len(packages) > 1:
|
|
PackageManagerRegistryMixin.print_multi_package_issue(
|
|
click.echo, packages, spec
|
|
)
|
|
return None
|
|
return client.get_package(
|
|
packages[0]["type"],
|
|
packages[0]["owner"]["username"],
|
|
packages[0]["name"],
|
|
version=spec.requirements,
|
|
)
|