def search_for_library( # pylint: disable=too-many-branches filters, silent=False, interactive=False): assert isinstance(filters, dict) assert "name" in filters if not silent: click.echo("Looking for %s library in registry" % click.style(filters['name'], fg="cyan")) query = [] for key in filters: if key not in ("name", "authors", "frameworks", "platforms"): continue values = filters[key] if not isinstance(values, list): values = [v.strip() for v in values.split(",") if v] for value in values: query.append('%s:"%s"' % (key[:-1] if key.endswith("s") else key, value)) lib_info = None result = util.get_api_result("/v2/lib/search", dict(query=" ".join(query)), cache_valid="1h") if result['total'] == 1: lib_info = result['items'][0] elif result['total'] > 1: if silent and not interactive: lib_info = result['items'][0] else: click.secho("Conflict: More than one library has been found " "by request %s:" % json.dumps(filters), fg="yellow", err=True) for item in result['items']: commands.lib.print_lib_item(item) if not interactive: click.secho( "Automatically chose the first available library " "(use `--interactive` option to make a choice)", fg="yellow", err=True) lib_info = result['items'][0] else: deplib_id = click.prompt("Please choose library ID", type=click.Choice([ str(i['id']) for i in result['items'] ])) for item in result['items']: if item['id'] == int(deplib_id): lib_info = item break if not lib_info: if filters.keys() == ["name"]: raise exception.LibNotFound(filters['name']) else: raise exception.LibNotFound(str(filters)) if not silent: click.echo("Found: %s" % click.style( "http://platformio.org/lib/show/{id}/{name}".format( **lib_info), fg="blue")) return lib_info
def search_lib_id( # pylint: disable=too-many-branches self, filters, silent=False, interactive=False): assert isinstance(filters, dict) assert "name" in filters # try to find ID within installed packages lib_id = self._get_lib_id_from_installed(filters) if lib_id: return lib_id # looking in PIO Library Registry if not silent: click.echo("Looking for %s library in registry" % click.style(filters["name"], fg="cyan")) query = [] for key in filters: if key not in ("name", "authors", "frameworks", "platforms"): continue values = filters[key] if not isinstance(values, list): values = [v.strip() for v in values.split(",") if v] for value in values: query.append('%s:"%s"' % (key[:-1] if key.endswith("s") else key, value)) lib_info = None result = util.get_api_result("/v2/lib/search", dict(query=" ".join(query)), cache_valid="1h") if result["total"] == 1: lib_info = result["items"][0] elif result["total"] > 1: if silent and not interactive: lib_info = result["items"][0] else: click.secho( "Conflict: More than one library has been found " "by request %s:" % json.dumps(filters), fg="yellow", err=True, ) # pylint: disable=import-outside-toplevel from platformio.commands.lib import print_lib_item for item in result["items"]: print_lib_item(item) if not interactive: click.secho( "Automatically chose the first available library " "(use `--interactive` option to make a choice)", fg="yellow", err=True, ) lib_info = result["items"][0] else: deplib_id = click.prompt( "Please choose library ID", type=click.Choice( [str(i["id"]) for i in result["items"]]), ) for item in result["items"]: if item["id"] == int(deplib_id): lib_info = item break if not lib_info: if list(filters) == ["name"]: raise exception.LibNotFound(filters["name"]) raise exception.LibNotFound(str(filters)) if not silent: click.echo("Found: %s" % click.style( "https://platformio.org/lib/show/{id}/{name}".format( **lib_info), fg="blue", )) return int(lib_info["id"])