##// END OF EJS Templates
release 8.12.1
release 8.12.1

File last commit:

r25227:390d0400
r28265:f4df70be
Show More
alias.py
258 lines | 9.8 KiB | text/x-python | PythonLexer
Brian Granger
More work on componentizing everything....
r2243 # encoding: utf-8
"""
Brian Granger
First draft of refactored Component->Configurable.
r2731 System command aliases.
Brian Granger
More work on componentizing everything....
r2243
Authors:
Brian Granger
First draft of refactored Component->Configurable.
r2731 * Fernando Perez
Brian Granger
More work on componentizing everything....
r2243 * Brian Granger
"""
#-----------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2008-2011 The IPython Development Team
Brian Granger
More work on componentizing everything....
r2243 #
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 # Distributed under the terms of the BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
Brian Granger
More work on componentizing everything....
r2243 #-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import os
Brian Granger
More work on refactoring things into components....
r2244 import re
Brian Granger
More work on componentizing everything....
r2243 import sys
Min RK
update dependency imports...
r21253 from traitlets.config.configurable import Configurable
Srinivas Reddy Thatiparthy
Change absolute imports to relative imports to facilitate processes embedding kernel or debugger
r25227 from .error import UsageError
Brian Granger
More work on componentizing everything....
r2243
Min RK
update dependency imports...
r21253 from traitlets import List, Instance
Pierre Gerold
Replace all import of IPython.utils.warn module
r22092 from logging import error
Brian Granger
More work on componentizing everything....
r2243
#-----------------------------------------------------------------------------
Brian Granger
More work on refactoring things into components....
r2244 # Utilities
Brian Granger
More work on componentizing everything....
r2243 #-----------------------------------------------------------------------------
Brian Granger
More work on refactoring things into components....
r2244 # This is used as the pattern for calls to split_user_input.
Thomas Kluyver
Improvements in the code that breaks up user input.
r4744 shell_line_split = re.compile(r'^(\s*)()(\S+)(.*$)')
Brian Granger
More work on refactoring things into components....
r2244
Brian Granger
More work on componentizing everything....
r2243 def default_aliases():
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 """Return list of shell aliases to auto-define.
"""
# Note: the aliases defined here should be safe to use on a kernel
# regardless of what frontend it is attached to. Frontends that use a
# kernel in-process can define additional aliases that will only work in
# their case. For example, things like 'less' or 'clear' that manipulate
# the terminal should NOT be declared here, as they will only work if the
# kernel is running inside a true terminal, and not over the network.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
More work on componentizing everything....
r2243 if os.name == 'posix':
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 default_aliases = [('mkdir', 'mkdir'), ('rmdir', 'rmdir'),
Steve Chan
Remove -i options from mv, rm and cp aliases...
r16641 ('mv', 'mv'), ('rm', 'rm'), ('cp', 'cp'),
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 ('cat', 'cat'),
]
# Useful set of ls aliases. The GNU and BSD options are a little
# different, so we make aliases that provide as similar as possible
# behavior in ipython, by passing the right flags for each platform
if sys.platform.startswith('linux'):
ls_aliases = [('ls', 'ls -F --color'),
# long ls
('ll', 'ls -F -o --color'),
# ls normal files only
('lf', 'ls -F -o --color %l | grep ^-'),
# ls symbolic links
('lk', 'ls -F -o --color %l | grep ^l'),
# directories or links to directories,
('ldir', 'ls -F -o --color %l | grep /$'),
# things which are executable
('lx', 'ls -F -o --color %l | grep ^-..x'),
]
bsvh
fix ls_alias for NetBSD as well
r18141 elif sys.platform.startswith('openbsd') or sys.platform.startswith('netbsd'):
bsvh
added comment on reason for seperate ls_alias for OpenBSD/NetBSD
r18156 # OpenBSD, NetBSD. The ls implementation on these platforms do not support
# the -G switch and lack the ability to use colorized output.
bsvh
fixed ls_alias for OpenBSD as it lacks the -G switch
r18140 ls_aliases = [('ls', 'ls -F'),
# long ls
('ll', 'ls -F -l'),
# ls normal files only
('lf', 'ls -F -l %l | grep ^-'),
# ls symbolic links
('lk', 'ls -F -l %l | grep ^l'),
# directories or links to directories,
('ldir', 'ls -F -l %l | grep /$'),
# things which are executable
('lx', 'ls -F -l %l | grep ^-..x'),
]
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 else:
# BSD, OSX, etc.
Anders Hovmöller
Default color output for ls on OSX...
r10161 ls_aliases = [('ls', 'ls -F -G'),
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 # long ls
Anders Hovmöller
Default color output for ls on OSX...
r10161 ('ll', 'ls -F -l -G'),
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 # ls normal files only
Anders Hovmöller
Default color output for ls on OSX...
r10161 ('lf', 'ls -F -l -G %l | grep ^-'),
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 # ls symbolic links
Anders Hovmöller
Default color output for ls on OSX...
r10161 ('lk', 'ls -F -l -G %l | grep ^l'),
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 # directories or links to directories,
Anders Hovmöller
Default color output for ls on OSX...
r10161 ('ldir', 'ls -F -G -l %l | grep /$'),
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 # things which are executable
Anders Hovmöller
Default color output for ls on OSX...
r10161 ('lx', 'ls -F -l -G %l | grep ^-..x'),
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 ]
default_aliases = default_aliases + ls_aliases
elif os.name in ['nt', 'dos']:
default_aliases = [('ls', 'dir /on'),
('ddir', 'dir /ad /on'), ('ldir', 'dir /ad /on'),
('mkdir', 'mkdir'), ('rmdir', 'rmdir'),
('echo', 'echo'), ('ren', 'ren'), ('copy', 'copy'),
]
Brian Granger
More work on componentizing everything....
r2243 else:
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 default_aliases = []
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 return default_aliases
Brian Granger
More work on componentizing everything....
r2243
class AliasError(Exception):
pass
class InvalidAliasError(AliasError):
pass
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 class Alias(object):
"""Callable object storing the details of one alias.
Instances are registered as magic functions to allow use of aliases.
"""
# Prepare blacklist
blacklist = {'cd','popd','pushd','dhist','alias','unalias'}
Thomas Kluyver
AliasCaller knows its own name
r12599 def __init__(self, shell, name, cmd):
Thomas Kluyver
Initial changes to make alias system use magics
r12595 self.shell = shell
Thomas Kluyver
AliasCaller knows its own name
r12599 self.name = name
Thomas Kluyver
Initial changes to make alias system use magics
r12595 self.cmd = cmd
Min RK
set `__doc__` for aliases...
r21709 self.__doc__ = "Alias for `!{}`".format(cmd)
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 self.nargs = self.validate()
def validate(self):
"""Validate the alias, and return the number of arguments."""
if self.name in self.blacklist:
raise InvalidAliasError("The name %s can't be aliased "
"because it is a keyword or builtin." % self.name)
try:
caller = self.shell.magics_manager.magics['line'][self.name]
except KeyError:
pass
else:
if not isinstance(caller, Alias):
raise InvalidAliasError("The name %s can't be aliased "
"because it is another magic command." % self.name)
Srinivas Reddy Thatiparthy
convert string_types to str
r23037 if not (isinstance(self.cmd, str)):
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 raise InvalidAliasError("An alias command must be a string, "
"got: %r" % self.cmd)
Thomas Adriaan Hellinger
Included a way to 'comment out' an %s for a non-arg
r20886 nargs = self.cmd.count('%s') - self.cmd.count('%%s')
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 if (nargs > 0) and (self.cmd.find('%l') >= 0):
Thomas Kluyver
Initial changes to make alias system use magics
r12595 raise InvalidAliasError('The %s and %l specifiers are mutually '
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 'exclusive in alias definitions.')
return nargs
Thomas Kluyver
AliasCaller knows its own name
r12599 def __repr__(self):
return "<alias {} for {!r}>".format(self.name, self.cmd)
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627
Thomas Kluyver
Initial changes to make alias system use magics
r12595 def __call__(self, rest=''):
cmd = self.cmd
nargs = self.nargs
# Expand the %l special to be the user's input line
if cmd.find('%l') >= 0:
cmd = cmd.replace('%l', rest)
rest = ''
Thomas Adriaan Hellinger
Replaced tabs with 4 spaces each
r20901
Thomas Kluyver
Initial changes to make alias system use magics
r12595 if nargs==0:
Thomas Adriaan Hellinger
Replaced tabs with 4 spaces each
r20901 if cmd.find('%%s') >= 1:
cmd = cmd.replace('%%s', '%s')
# Simple, argument-less aliases
cmd = '%s %s' % (cmd, rest)
Thomas Kluyver
Initial changes to make alias system use magics
r12595 else:
# Handle aliases with positional arguments
args = rest.split(None, nargs)
if len(args) < nargs:
Thomas Kluyver
AliasCaller knows its own name
r12599 raise UsageError('Alias <%s> requires %s arguments, %s given.' %
(self.name, nargs, len(args)))
Thomas Kluyver
Initial changes to make alias system use magics
r12595 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627
Thomas Kluyver
Initial changes to make alias system use magics
r12595 self.shell.system(cmd)
Brian Granger
More work on refactoring things into components....
r2244 #-----------------------------------------------------------------------------
# Main AliasManager class
#-----------------------------------------------------------------------------
Brian Granger
First draft of refactored Component->Configurable.
r2731 class AliasManager(Configurable):
Brian Granger
More work on componentizing everything....
r2243
Min RK
adopt traitlets 4.2 API...
r22340 default_aliases = List(default_aliases()).tag(config=True)
user_aliases = List(default_value=[]).tag(config=True)
Sylvain Corlay
allow_none=False by default for Type and Instance
r20940 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', allow_none=True)
Brian Granger
More work on componentizing everything....
r2243
MinRK
use `parent=self` throughout IPython...
r11064 def __init__(self, shell=None, **kwargs):
super(AliasManager, self).__init__(shell=shell, **kwargs)
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 # For convenient access
self.linemagics = self.shell.magics_manager.magics['line']
Brian Granger
More work on componentizing everything....
r2243 self.init_aliases()
Brian Granger
More work on refactoring things into components....
r2244
Brian Granger
More work on componentizing everything....
r2243 def init_aliases(self):
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 # Load default & user aliases
for name, cmd in self.default_aliases + self.user_aliases:
Sha Liu
set ls aliases according to colors configuration
r24765 if cmd.startswith('ls ') and self.shell.colors == 'NoColor':
cmd = cmd.replace(' --color', '')
Brian Granger
More work on componentizing everything....
r2243 self.soft_define_alias(name, cmd)
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 @property
def aliases(self):
return [(n, func.cmd) for (n, func) in self.linemagics.items()
if isinstance(func, Alias)]
Brian Granger
Massive refactoring of of the core....
r2245
Brian Granger
More work on componentizing everything....
r2243 def soft_define_alias(self, name, cmd):
"""Define an alias, but don't raise on an AliasError."""
try:
self.define_alias(name, cmd)
Matthias BUSSONNIER
conform to pep 3110...
r7787 except AliasError as e:
Brian Granger
More work on componentizing everything....
r2243 error("Invalid alias: %s" % e)
def define_alias(self, name, cmd):
"""Define a new alias after validating it.
This will raise an :exc:`AliasError` if there are validation
problems.
"""
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 caller = Alias(shell=self.shell, name=name, cmd=cmd)
Thomas Kluyver
Initial changes to make alias system use magics
r12595 self.shell.magics_manager.register_function(caller, magic_kind='line',
magic_name=name)
Brian Granger
More work on componentizing everything....
r2243
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 def get_alias(self, name):
"""Return an alias, or None if no alias by that name exists."""
aname = self.linemagics.get(name, None)
return aname if isinstance(aname, Alias) else None
def is_alias(self, name):
"""Return whether or not a given name has been defined as an alias"""
return self.get_alias(name) is not None
Brian Granger
Massive refactoring of of the core....
r2245 def undefine_alias(self, name):
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 if self.is_alias(name):
del self.linemagics[name]
Thomas Kluyver
Initial changes to make alias system use magics
r12595 else:
raise ValueError('%s is not an alias' % name)
Brian Granger
Massive refactoring of of the core....
r2245
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 def clear_aliases(self):
for name, cmd in self.aliases:
self.undefine_alias(name)
Thomas Kluyver
Allow new style aliases to be stored
r12596 def retrieve_alias(self, name):
"""Retrieve the command to which an alias expands."""
Thomas Kluyver
Changes to Alias API after discussion with Fernando
r12627 caller = self.get_alias(name)
if caller:
Thomas Kluyver
Allow new style aliases to be stored
r12596 return caller.cmd
else:
raise ValueError('%s is not an alias' % name)