Merge pull request #104 from wflynny/alias-desc

Allows aliases with descriptions.

Alias can be defined as currently supported and as subsections of the `[[alias]]` section of `conf.py` of the form:
```
[[[alias-name]]]
command = alias-command-definition
description = alias-description
```

Note that aliases defined this way must be placed at the end of the [[alias]] section or they will gobble up aliases defined in the current format. This is a limitation of `ConfigObj` sectioning.
main
Olivier Mangin 7 years ago committed by GitHub
commit f8362911d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -88,6 +88,13 @@ active = force_list(default=list('alias'))
# shell commands can also be defined, by prefixing them with a bang `!`, e.g: # shell commands can also be defined, by prefixing them with a bang `!`, e.g:
# count = !pubs list -k | wc -l # 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] [internal]
# The version of this configuration file. Do not edit. # The version of this configuration file. Do not edit.
version = string(min=5, default='{}') version = string(min=5, default='{}')

@ -8,26 +8,30 @@ from ...pubs_cmd import execute
class Alias(object): class Alias(object):
def __init__(self, name, definition): def __init__(self, name, definition, description=None):
self.name = name self.name = name
self.definition = definition self.definition = definition
if not description:
self.description = "user alias for `%s`"%definition
else:
self.description = description
def parser(self, parser): def parser(self, parser):
self.parser = 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='*', 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 return p
def command(self, conf, args): def command(self, conf, args):
raise NotImplementedError raise NotImplementedError
@classmethod @classmethod
def create_alias(cls, name, definition): def create_alias(cls, name, definition, description=None):
if len(definition) > 0 and definition[0] == '!': if len(definition) > 0 and definition[0] == '!':
return ShellAlias(name, definition[1:]) return ShellAlias(name, definition[1:], description)
else: else:
return CommandAlias(name, definition) return CommandAlias(name, definition, description)
class CommandAlias(Alias): class CommandAlias(Alias):
@ -64,8 +68,16 @@ class AliasPlugin(PapersPlugin):
def __init__(self, conf): def __init__(self, conf):
self.aliases = [] self.aliases = []
if 'alias' in conf['plugins']: if 'alias' in conf['plugins']:
for name, definition in conf['plugins']['alias'].items(): for name, entry in conf['plugins']['alias'].items():
self.aliases.append(Alias.create_alias(name, definition)) 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): def update_parser(self, subparsers, conf):
"""Add subcommand to the provided subparser""" """Add subcommand to the provided subparser"""

@ -93,3 +93,57 @@ class AliasPluginTestCase(unittest.TestCase):
'count': '!pubs list -k | wc -l'} 'count': '!pubs list -k | wc -l'}
self.plugin = AliasPlugin(self.conf) self.plugin = AliasPlugin(self.conf)
self.assertEqual(len(self.plugin.aliases), 2) 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 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'},
'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')

Loading…
Cancel
Save