From 8d69b73c9e57cb772156c19770c22ca196704e44 Mon Sep 17 00:00:00 2001 From: Hugo Osvaldo Barrera Date: Tue, 22 Jun 2021 00:50:40 +0200 Subject: [PATCH] Fetch displaynames asynchronously --- vdirsyncer/cli/__init__.py | 4 +--- vdirsyncer/cli/config.py | 4 +++- vdirsyncer/cli/discover.py | 46 +++++++++++++++++++++----------------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/vdirsyncer/cli/__init__.py b/vdirsyncer/cli/__init__.py index 2d914d3..c1db199 100644 --- a/vdirsyncer/cli/__init__.py +++ b/vdirsyncer/cli/__init__.py @@ -211,11 +211,9 @@ def discover(ctx, pairs, list): conn = aiohttp.TCPConnector(limit_per_host=16) for pair_name in pairs or config.pairs: - pair = config.get_pair(pair_name) - await discover_collections( status_path=config.general["status_path"], - pair=pair, + pair=config.get_pair(pair_name), from_cache=False, list_collections=list, connector=conn, diff --git a/vdirsyncer/cli/config.py b/vdirsyncer/cli/config.py index 40833c4..59e7c45 100644 --- a/vdirsyncer/cli/config.py +++ b/vdirsyncer/cli/config.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import os import string @@ -206,7 +208,7 @@ class Config: else: return expand_fetch_params(args) - def get_pair(self, pair_name): + def get_pair(self, pair_name: str) -> PairConfig: try: return self.pairs[pair_name] except KeyError as e: diff --git a/vdirsyncer/cli/discover.py b/vdirsyncer/cli/discover.py index 877a10c..970bbb9 100644 --- a/vdirsyncer/cli/discover.py +++ b/vdirsyncer/cli/discover.py @@ -81,6 +81,7 @@ async def collections_for_pair( b_discovered = _DiscoverResult(pair.config_b, connector=connector) if list_collections: + # TODO: We should gather data and THEN print, so it can be async. await _print_collections( pair.config_a["instance_name"], a_discovered.get_self, @@ -275,27 +276,32 @@ async def _print_collections( ) return logger.info(f"{instance_name}:") + tasks = [] for args in discovered.values(): - collection = args["collection"] - if collection is None: - continue + tasks.append(_print_single_collection(args, instance_name, connector)) - args["instance_name"] = instance_name - try: - storage = await storage_instance_from_config( - args, - create=False, - connector=connector, - ) - displayname = await storage.get_meta("displayname") - except Exception: - displayname = "" + await asyncio.gather(*tasks) - logger.info( - " - {}{}".format( - json.dumps(collection), - f' ("{displayname}")' - if displayname and displayname != collection - else "", - ) + +async def _print_single_collection(args, instance_name, connector): + collection = args["collection"] + if collection is None: + return + + args["instance_name"] = instance_name + try: + storage = await storage_instance_from_config( + args, + create=False, + connector=connector, ) + displayname = await storage.get_meta("displayname") + except Exception: + displayname = "" + + logger.info( + " - {}{}".format( + json.dumps(collection), + f' ("{displayname}")' if displayname and displayname != collection else "", + ) + )