fix: allow passing just key to ImportCommandHandler

so config can override designated handler, and command still work
This commit is contained in:
Lance Edgar 2025-12-20 16:33:06 -06:00
parent 19574ea4a0
commit 7e3e892002
4 changed files with 31 additions and 12 deletions

View file

@ -50,19 +50,35 @@ class ImportCommandHandler(GenericHandler):
create this handler and call its :meth:`run()` method. create this handler and call its :meth:`run()` method.
This handler does not know how to import/export data, but it knows This handler does not know how to import/export data, but it knows
how to make its :attr:`import_handler` do it. how to make its :attr:`import_handler` do it. Likewise, the
import handler is not "CLI-aware" - so this provides the glue.
:param import_handler: During construction, caller can specify the :param import_handler: During construction, caller can specify the
:attr:`import_handler` as any of: :attr:`import_handler` as any of:
* import handler instance * import handler instance
* import handler factory (e.g. class) * import handler factory (e.g. class)
* import handler spec (cf. :func:`~wuttjamaican:wuttjamaican.util.load_object()`) * import handler :term:`spec`
For example:: :param key: Optional :term:`import/export key` to use for handler
lookup. Only used if ``import_handler`` param is not set.
Typical usage for custom commands will be to provide the spec::
handler = ImportCommandHandler( handler = ImportCommandHandler(
config, import_handler='wuttasync.importing.csv:FromCsvToWutta') config, "poser.importing.foo:FromFooToPoser"
)
Library authors may prefer to use the import/export key; this lets
the command work with any designated handler::
handler = ImportCommandHandler(
config, key="import.to_poser.from_foo"
)
See also
:meth:`~wuttasync.app.WuttaSyncAppProvider.get_import_handler()`
which does the lookup by key.
""" """
import_handler = None import_handler = None
@ -71,7 +87,7 @@ class ImportCommandHandler(GenericHandler):
invoked when command runs. See also :meth:`run()`. invoked when command runs. See also :meth:`run()`.
""" """
def __init__(self, config, import_handler=None): def __init__(self, config, import_handler=None, key=None):
super().__init__(config) super().__init__(config)
if import_handler: if import_handler:
@ -83,6 +99,9 @@ class ImportCommandHandler(GenericHandler):
factory = self.app.load_object(import_handler) factory = self.app.load_object(import_handler)
self.import_handler = factory(self.config) self.import_handler = factory(self.config)
elif key:
self.import_handler = self.app.get_import_handler(key, require=True)
def run(self, params, progress=None): # pylint: disable=unused-argument def run(self, params, progress=None): # pylint: disable=unused-argument
""" """
Run the import/export job(s) based on command line params. Run the import/export job(s) based on command line params.

View file

@ -38,7 +38,5 @@ def import_csv(ctx: typer.Context, **kwargs): # pylint: disable=unused-argument
Import data from CSV file(s) to Wutta DB Import data from CSV file(s) to Wutta DB
""" """
config = ctx.parent.wutta_config config = ctx.parent.wutta_config
handler = ImportCommandHandler( handler = ImportCommandHandler(config, key="import.to_wutta.from_csv")
config, import_handler="wuttasync.importing.csv:FromCsvToWutta"
)
handler.run(ctx.params) handler.run(ctx.params)

View file

@ -69,7 +69,5 @@ def import_versions( # pylint: disable=unused-argument
) )
sys.exit(1) sys.exit(1)
handler = ImportCommandHandler( handler = ImportCommandHandler(config, key="import.to_versions.from_wutta")
config, import_handler="wuttasync.importing.versions:FromWuttaToVersions"
)
handler.run(ctx.params) handler.run(ctx.params)

View file

@ -34,6 +34,10 @@ class TestImportCommandHandler(DataTestCase):
handler = self.make_handler(import_handler=myhandler) handler = self.make_handler(import_handler=myhandler)
self.assertIs(handler.import_handler, myhandler) self.assertIs(handler.import_handler, myhandler)
# as key
handler = self.make_handler(key="import.to_wutta.from_csv")
self.assertIsInstance(handler.import_handler, FromCsvToWutta)
def test_run(self): def test_run(self):
handler = self.make_handler( handler = self.make_handler(
import_handler="wuttasync.importing.csv:FromCsvToWutta" import_handler="wuttasync.importing.csv:FromCsvToWutta"