From 4362c649b266c5211eb594b4710d48a514b23b81 Mon Sep 17 00:00:00 2001 From: Bill Flynn Date: Wed, 20 Dec 2017 09:13:22 -0500 Subject: [PATCH 1/2] Added alias description functionality to conf #98 Changed Alias constructor, added tests for this behavior, and added a few lines in the default conf describing how to define alias descriptions. --- pubs/config/spec.py | 7 +++++++ pubs/plugs/alias/alias.py | 28 ++++++++++++++++++------- tests/test_plug_alias.py | 44 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/pubs/config/spec.py b/pubs/config/spec.py index 3d56117..d881898 100644 --- a/pubs/config/spec.py +++ b/pubs/config/spec.py @@ -88,6 +88,13 @@ active = force_list(default=list('alias')) # shell commands can also be defined, by prefixing them with a bang `!`, e.g: # count = !pubs list -k | wc -l +# aliases can also be defined with descriptions using the following configobj +# subsectioning. NOTE: any aliases defined this way should come after all other +# aliases, otherwise simple aliases will be ignored. +# [[[count]]] +# command = !pubs list -k | wc -l +# description = lists number of pubs in repo + [internal] # The version of this configuration file. Do not edit. version = string(min=5, default='{}') diff --git a/pubs/plugs/alias/alias.py b/pubs/plugs/alias/alias.py index c13c9be..5aea3d3 100644 --- a/pubs/plugs/alias/alias.py +++ b/pubs/plugs/alias/alias.py @@ -8,26 +8,30 @@ from ...pubs_cmd import execute class Alias(object): - def __init__(self, name, definition): + def __init__(self, name, definition, description=None): self.name = name self.definition = definition + if not description: + self.description = "user alias for `%s`"%definition + else: + self.description = description def parser(self, parser): self.parser = parser - p = parser.add_parser(self.name, help='user defined command') + p = parser.add_parser(self.name, help=self.description) p.add_argument('arguments', nargs='*', - help="arguments to be passed to the user defined command") + help="arguments to be passed to %s"%self.name) return p def command(self, conf, args): raise NotImplementedError @classmethod - def create_alias(cls, name, definition): + def create_alias(cls, name, definition, description=None): if len(definition) > 0 and definition[0] == '!': - return ShellAlias(name, definition[1:]) + return ShellAlias(name, definition[1:], description) else: - return CommandAlias(name, definition) + return CommandAlias(name, definition, description) class CommandAlias(Alias): @@ -64,8 +68,16 @@ class AliasPlugin(PapersPlugin): def __init__(self, conf): self.aliases = [] if 'alias' in conf['plugins']: - for name, definition in conf['plugins']['alias'].items(): - self.aliases.append(Alias.create_alias(name, definition)) + for name, entry in conf['plugins']['alias'].items(): + if isinstance(entry, dict): + definition = entry.get('command') + description = entry.get('description', None) + else: + definition = entry + description = None + + alias = Alias.create_alias(name, definition, description) + self.aliases.append(alias) def update_parser(self, subparsers, conf): """Add subcommand to the provided subparser""" diff --git a/tests/test_plug_alias.py b/tests/test_plug_alias.py index 82b9215..dcd2de7 100644 --- a/tests/test_plug_alias.py +++ b/tests/test_plug_alias.py @@ -93,3 +93,47 @@ class AliasPluginTestCase(unittest.TestCase): 'count': '!pubs list -k | wc -l'} self.plugin = AliasPlugin(self.conf) self.assertEqual(len(self.plugin.aliases), 2) + + def testAliasPluginNestedDefinitionType(self): + self.conf['plugins']['alias'] = {'print': {'description': 'print this', + 'command': 'open -w lpppp'}} + self.plugin = AliasPlugin(self.conf) + self.assertEqual(len(self.plugin.aliases), 1) + self.assertEqual(type(self.plugin.aliases[0]), CommandAlias) + self.assertEqual(self.plugin.aliases[0].name, 'print') + self.assertEqual(self.plugin.aliases[0].description, 'print this') + self.assertEqual(self.plugin.aliases[0].definition, 'open -w lpppp') + + def testAliasPluginMixedDefinitionTypes(self): + self.conf['plugins']['alias'] = {'print': {'description': 'print this', + 'command': 'open -w lpppp'}, + 'count': '!pubs list -k | wc -l'} + self.plugin = AliasPlugin(self.conf) + self.plugin.aliases = sorted(self.plugin.aliases, key=lambda a: a.name) + + self.assertEqual(len(self.plugin.aliases), 2) + self.assertEqual(type(self.plugin.aliases[1]), CommandAlias) + self.assertEqual(type(self.plugin.aliases[0]), ShellAlias) + + self.assertEqual(self.plugin.aliases[0].name, 'count') + self.assertEqual(self.plugin.aliases[0].description, + 'user alias for `pubs list -k | wc -l`') + self.assertEqual(self.plugin.aliases[0].definition, + 'pubs list -k | wc -l') + + self.assertEqual(self.plugin.aliases[1].name, 'print') + self.assertEqual(self.plugin.aliases[1].description, 'print this') + self.assertEqual(self.plugin.aliases[1].definition, 'open -w lpppp') + + def testAliasPluginWrongDefinitionOrder(self): + self.conf['plugins']['alias'] = {'print': {'description': 'print this', + 'command': 'open -w lpppp', + 'count': '!pubs list -k | wc -l'}} + self.plugin = AliasPlugin(self.conf) + + self.assertEqual(len(self.plugin.aliases), 1) + self.assertEqual(type(self.plugin.aliases[0]), CommandAlias) + + self.assertEqual(self.plugin.aliases[0].name, 'print') + self.assertEqual(self.plugin.aliases[0].description, 'print this') + self.assertEqual(self.plugin.aliases[0].definition, 'open -w lpppp') From ebbd2d4f1950033a8e3979b32d79216cb86c45e7 Mon Sep 17 00:00:00 2001 From: Bill Flynn Date: Wed, 20 Dec 2017 09:23:10 -0500 Subject: [PATCH 2/2] added another test for #98 --- tests/test_plug_alias.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_plug_alias.py b/tests/test_plug_alias.py index dcd2de7..46fff0e 100644 --- a/tests/test_plug_alias.py +++ b/tests/test_plug_alias.py @@ -104,6 +104,16 @@ class AliasPluginTestCase(unittest.TestCase): self.assertEqual(self.plugin.aliases[0].description, 'print this') self.assertEqual(self.plugin.aliases[0].definition, 'open -w lpppp') + def testAliasPluginNestedDefinitionNoDescription(self): + self.conf['plugins']['alias'] = {'print': {'command': 'open -w lpppp'}} + self.plugin = AliasPlugin(self.conf) + self.assertEqual(len(self.plugin.aliases), 1) + self.assertEqual(type(self.plugin.aliases[0]), CommandAlias) + self.assertEqual(self.plugin.aliases[0].name, 'print') + self.assertEqual(self.plugin.aliases[0].description, + 'user alias for `open -w lpppp`') + self.assertEqual(self.plugin.aliases[0].definition, 'open -w lpppp') + def testAliasPluginMixedDefinitionTypes(self): self.conf['plugins']['alias'] = {'print': {'description': 'print this', 'command': 'open -w lpppp'},