support setting keyfile on command line

This commit is contained in:
lilydjwg 2020-08-17 14:32:39 +08:00
parent 8520a62271
commit 1f7552bbf7
3 changed files with 23 additions and 13 deletions

1
NEW
View file

@ -1,5 +1,4 @@
TODO: TODO:
* update tests * update tests
* update README * update README
* set keyfile via command line?
* create source plugin documentation * create source plugin documentation

View file

@ -12,12 +12,15 @@ from typing import Coroutine
import structlog import structlog
from . import core from . import core
from .util import VersData, RawResult from .util import VersData, RawResult, KeyManager
logger = structlog.get_logger(logger_name=__name__) logger = structlog.get_logger(logger_name=__name__)
def main() -> None: def main() -> None:
parser = argparse.ArgumentParser(description='New version checker for software') parser = argparse.ArgumentParser(description='New version checker for software')
parser.add_argument('-k', '--keyfile',
metavar='FILE', type=str,
help='use specified keyfile')
parser.add_argument('-t', '--tries', default=1, type=int, metavar='N', parser.add_argument('-t', '--tries', default=1, type=int, metavar='N',
help='try N times when errors occur') help='try N times when errors occur')
core.add_common_arguments(parser) core.add_common_arguments(parser)
@ -33,13 +36,20 @@ def main() -> None:
else: else:
file = args.file file = args.file
entries, options = core.load_file(file) entries, options = core.load_file(
file, use_keymanager=bool(args.keyfile))
if args.keyfile:
keymanager = KeyManager(args.keyfile)
else:
keymanager = options.keymanager
token_q = core.token_queue(options.max_concurrency) token_q = core.token_queue(options.max_concurrency)
result_q: asyncio.Queue[RawResult] = asyncio.Queue() result_q: asyncio.Queue[RawResult] = asyncio.Queue()
try: try:
futures = core.dispatch( futures = core.dispatch(
entries, token_q, result_q, entries, token_q, result_q,
options.keymanager, args.tries, keymanager, args.tries,
) )
except ModuleNotFoundError as e: except ModuleNotFoundError as e:
sys.exit(f'Error: {e}') sys.exit(f'Error: {e}')

View file

@ -133,10 +133,12 @@ class Options(NamedTuple):
keymanager: KeyManager keymanager: KeyManager
def load_file( def load_file(
file: TextIO, file: TextIO, *,
use_keymanager: bool,
) -> Tuple[Entries, Options]: ) -> Tuple[Entries, Options]:
config = toml.load(file) config = toml.load(file)
ver_files: Optional[Tuple[Path, Path]] = None ver_files: Optional[Tuple[Path, Path]] = None
keymanager = KeyManager(None)
if '__config__' in config: if '__config__' in config:
c = config.pop('__config__') c = config.pop('__config__')
@ -151,19 +153,18 @@ def load_file(
newver = d / newver_s newver = d / newver_s
ver_files = oldver, newver ver_files = oldver, newver
keyfile = c.get('keyfile') if use_keymanager:
if keyfile: keyfile = c.get('keyfile')
keyfile_s = os.path.expandvars( if keyfile:
os.path.expanduser(c.get('keyfile'))) keyfile_s = os.path.expandvars(
keyfile = d / keyfile_s os.path.expanduser(c.get('keyfile')))
keyfile = d / keyfile_s
keymanager = KeyManager(keyfile)
max_concurrency = c.get( max_concurrency = c.get(
'max_concurrency', 20) 'max_concurrency', 20)
keymanager = KeyManager(keyfile)
else: else:
max_concurrency = 20 max_concurrency = 20
keymanager = KeyManager(None)
return cast(Entries, config), Options( return cast(Entries, config), Options(
ver_files, max_concurrency, keymanager) ver_files, max_concurrency, keymanager)