diff --git a/dosagelib/cmd.py b/dosagelib/cmd.py index 118d211cd..b59606c7d 100644 --- a/dosagelib/cmd.py +++ b/dosagelib/cmd.py @@ -3,12 +3,10 @@ # Copyright (C) 2012-2014 Bastian Kleineidam # Copyright (C) 2015-2022 Tobias Gruetzmacher import argparse -import contextlib import os import platform -from pathlib import Path -import appdirs +from platformdirs import PlatformDirs from . import events, configuration, singleton, director from . import AppName, __version__ @@ -26,7 +24,12 @@ class ArgumentParser(argparse.ArgumentParser): out.info(self.format_help()) -Examples = """\ +# Making our config roaming seems sensible +platformdirs = PlatformDirs(appname=AppName, appauthor=False, roaming=True, opinion=True) +user_plugin_path = platformdirs.user_data_path / 'plugins' + + +ExtraHelp = f"""\ EXAMPLES List available comics: dosage -l @@ -38,13 +41,11 @@ directory: If you already have downloaded several comics and want to get the latest strips of all of them: dosage --continue @ + +User plugin directory: {user_plugin_path} """ -# Making our config roaming seems sensible -userdirs = appdirs.AppDirs(appname=AppName, appauthor=False, roaming=True) - - def setup_options(): """Construct option parser. @return: new option parser @@ -52,7 +53,7 @@ def setup_options(): """ parser = ArgumentParser( description="A comic downloader and archiver.", - epilog=Examples, + epilog=ExtraHelp, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('-v', '--verbose', action='count', default=0, @@ -227,6 +228,7 @@ def vote_comic(scraperobj): def run(options): """Execute comic commands.""" set_output_info(options) + allscrapers.adddir(user_plugin_path) # ensure only one instance of dosage is running if not options.allow_multiple: singleton.SingleInstance() @@ -241,7 +243,6 @@ def run(options): if not options.comic: out.warn(u'No comics specified, bailing out!') return 1 - add_user_scrapers() if options.modulehelp: return display_help(options) if options.vote: @@ -249,37 +250,8 @@ def run(options): return director.getComics(options) -def add_user_scrapers(): - """Add extra comic modules from the user data directory. This uses two - different locations: The "system-native" location and paths matching the - XDG basedir spec. While XDG isn't a thing on macOS and Windows, some users - (and developers) like to use these paths cross-plattform, therefore we - support both.""" - dirs = set() - dirs.add(userdirs.user_data_dir) - with xdg_system(): - dirs.add(userdirs.user_data_dir) - dirs = (Path(x) / 'plugins' for x in dirs) - for d in dirs: - allscrapers.adddir(d) - - -@contextlib.contextmanager -def xdg_system(): - """context manager to do something with appdirs while forcing the system to - be "linux2", which implements the XDG base dir spec. - """ - oldsys = appdirs.system - appdirs.system = 'linux2' - try: - yield - finally: - appdirs.system = oldsys - - def do_list(column_list=True, verbose=False, listall=False): """List available comics.""" - add_user_scrapers() with out.pager(): out.info(u'Available comic scrapers:') out.info(u'Comics tagged with [{}] require age confirmation' diff --git a/setup.cfg b/setup.cfg index 7d6570c3a..d85a78921 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,10 +32,10 @@ project_urls = [options] packages = find: install_requires = - appdirs colorama imagesize lxml>=4.0.0 + platformdirs requests>=2.0 cached_property;python_version<'3.8' importlib_metadata;python_version<'3.8' diff --git a/tests/conftest.py b/tests/conftest.py index 3a9a3ef20..09ca58393 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MIT -# Copyright (C) 2019-2020 Tobias Gruetzmacher +# Copyright (C) 2019-2022 Tobias Gruetzmacher import time from pathlib import Path @@ -15,12 +15,6 @@ def _nosleep(monkeypatch): monkeypatch.setattr(time, 'sleep', sleep) -class FakeAppdirs: - @property - def user_data_dir(self): - return str(Path(__file__).parent / 'mocks') - - @pytest.fixture() def _noappdirs(monkeypatch): - monkeypatch.setattr('dosagelib.cmd.userdirs', FakeAppdirs()) + monkeypatch.setattr('dosagelib.cmd.user_plugin_path', Path(__file__).parent / 'mocks' / 'plugins')