Skip to content

Commit

Permalink
Merge remote-tracking branch 'zyx-i/pl-argument' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
Lokaltog committed Mar 24, 2013
2 parents 5caeac2 + 14d957b commit 5cebad9
Show file tree
Hide file tree
Showing 22 changed files with 707 additions and 389 deletions.
11 changes: 11 additions & 0 deletions docs/source/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,17 @@ Common configuration is a subdictionary that is a value of ``common`` key in
:ref:`module segment option <config-themes-seg-module>`. Paths defined here
have priority when searching for modules.

``log_file``
Defines path which will hold powerline logs. If not present, logging will be
done to stderr.

``log_level``
String, determines logging level. Defaults to ``WARNING``.

``log_format``
String, determines format of the log messages. Defaults to
``'%(asctime)s:%(level)s:%(message)s'``.

Extension-specific configuration
--------------------------------

Expand Down
6 changes: 5 additions & 1 deletion docs/source/powerline_autodoc.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ def format_args(self):
if isinstance(self.object, ThreadedSegment):
args = ['interval']
defaults = [getattr(self.object, 'interval', 1)]
if self.object.update_first:
args.append('update_first')
defaults.append(True)
methods = ['render', 'set_state']
if isinstance(self.object, KwThreadedSegment):
methods += ['key', 'render_one']
Expand All @@ -41,7 +44,8 @@ def format_args(self):
if (arg == 'self' or
(arg == 'segment_info' and
getattr(self.object, 'powerline_requires_segment_info', None)) or
(method == 'render_one' and -i == len(argspec.args))):
(method == 'render_one' and -i == len(argspec.args)) or
arg in args):
continue
if argspec.defaults and len(argspec.defaults) >= -i:
default = argspec.defaults[i]
Expand Down
2 changes: 1 addition & 1 deletion packages/gentoo/app-misc/powerline/Manifest
Original file line number Diff line number Diff line change
@@ -1 +1 @@
EBUILD powerline-9999.ebuild 3916 SHA256 754f8750aa5c6a455871d44c9478b81278b71318e591a13ef30f763ddb1fbda5 SHA512 48dd9d3ac737417b6a072397a4a50fefc04c0cb4a3c6249b5bf11ee201986f7b25a94b83e6901e8099ae3ea733dc0e650f5ce2234b5143bdbafd906af56916e7 WHIRLPOOL 803298b97adaeb2e3a6cd31c4bd12897373d7ce0722df22a991c684ecd5146fcd87addfc6e428374d924d6cb950dee6bbcf2ea0a262904cc4d04e3eac0b2dcb8
EBUILD powerline-9999.ebuild 4091 SHA256 d1d13b09e3ebefdaa1b90c50ccceb563bb444ca0f484e6448a993d2612dfbb78 SHA512 47f211249bb85608cb9c5b8e72daba5c36971e294e27843396cbf517bc792db64a4f80e843f5c883f8411ed4c9cef5618f9d617b305303a31a4590636879dcd3 WHIRLPOOL 2fc50e1da46d56d160140d3a87a4d9421bf63d67c792bfd88486e0dc72d379045ed79d152aa060a014e7f6bf4eb232642463014de9523909946bd8b2cbf83371
4 changes: 4 additions & 0 deletions packages/gentoo/app-misc/powerline/powerline-9999.ebuild
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@ src_install() {
fi
rm powerline/bindings/bash/powerline.sh
elog ""
insinto /etc/xdg/powerline
doins -r powerline/config_files/*
rm -r powerline/config_files
sed -i -e "/DEFAULT_SYSTEM_CONFIG_DIR/ s@None@'/etc/xdg'@" powerline/__init__.py
distutils-r1_src_install
use doc && dohtml -r docs_output/*
}
99 changes: 96 additions & 3 deletions powerline/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@
import json
import os
import sys
import logging

from powerline.colorscheme import Colorscheme


DEFAULT_SYSTEM_CONFIG_DIR = None


def open_file(path):
return open(path, 'r')

Expand All @@ -22,6 +26,42 @@ def load_json_config(search_paths, config_file, load=json.load, open_file=open_f
raise IOError('Config file not found in search path: {0}'.format(config_file))


class PowerlineState(object):
def __init__(self, logger, environ, getcwd, home):
self.environ = environ
self.getcwd = getcwd
self.home = home or environ.get('HOME', None)
self.logger = logger
self.prefix = None
self.last_msgs = {}

def _log(self, attr, msg, *args, **kwargs):
prefix = kwargs.get('prefix') or self.prefix
msg = ((prefix + ':') if prefix else '') + msg.format(*args, **kwargs)
key = attr+':'+prefix
if msg != self.last_msgs.get(key):
getattr(self.logger, attr)(msg)
self.last_msgs[key] = msg

def critical(self, msg, *args, **kwargs):
self._log('critical', msg, *args, **kwargs)

def exception(self, msg, *args, **kwargs):
self._log('exception', msg, *args, **kwargs)

def info(self, msg, *args, **kwargs):
self._log('info', msg, *args, **kwargs)

def error(self, msg, *args, **kwargs):
self._log('error', msg, *args, **kwargs)

def warn(self, msg, *args, **kwargs):
self._log('warning', msg, *args, **kwargs)

def debug(self, msg, *args, **kwargs):
self._log('debug', msg, *args, **kwargs)


class Powerline(object):
'''Main powerline class, entrance point for all powerline uses. Sets
powerline up and loads the configuration.
Expand All @@ -34,9 +74,29 @@ class Powerline(object):
:param str renderer_module:
Overrides renderer module (defaults to ``ext``). Should be the name of
the package imported like this: ``powerline.renders.{render_module}``.
:param bool run_once:
Determines whether .renderer.render() method will be run only once
during python session.
:param Logger logger:
If present, no new logger will be created and this logger will be used.
:param dict environ:
Object with ``.__getitem__`` and ``.get`` methods used to obtain
environment variables. Defaults to ``os.environ``.
:param func getcwd:
Function used to get current working directory. Defaults to
``os.getcwdu`` or ``os.getcwd``.
:param str home:
Home directory. Defaults to ``environ.get('HOME')``.
'''

def __init__(self, ext, renderer_module=None, run_once=False):
def __init__(self,
ext,
renderer_module=None,
run_once=False,
logger=None,
environ=os.environ,
getcwd=getattr(os, 'getcwdu', os.getcwd),
home=None):
self.config_paths = self.get_config_paths()

# Load main config file
Expand Down Expand Up @@ -75,7 +135,40 @@ def __init__(self, ext, renderer_module=None, run_once=False):
'tmux_escape': common_config.get('additional_escapes') == 'tmux',
'screen_escape': common_config.get('additional_escapes') == 'screen',
}
self.renderer = Renderer(theme_config, local_themes, theme_kwargs, colorscheme, **options)

# Create logger
if not logger:
log_format = common_config.get('format', '%(asctime)s:%(level)s:%(message)s')
formatter = logging.Formatter(log_format)

level = getattr(logging, common_config.get('log_level', 'WARNING'))
handler = self.get_log_handler(common_config)
handler.setLevel(level)

logger = logging.getLogger('powerline')
logger.setLevel(level)
logger.addHandler(handler)

pl = PowerlineState(logger=logger, environ=environ, getcwd=getcwd, home=home)

self.renderer = Renderer(theme_config, local_themes, theme_kwargs, colorscheme, pl, **options)

def get_log_handler(self, common_config):
'''Get log handler.
:param dict common_config:
Common configuration.
:return: logging.Handler subclass.
'''
log_file = common_config.get('file', None)
if log_file:
log_dir = os.path.dirname(log_file)
if not os.path.isdir(log_dir):
os.mkdir(log_dir)
return logging.FileHandler(log_file)
else:
return logging.StreamHandler()

@staticmethod
def get_config_paths():
Expand All @@ -86,7 +179,7 @@ def get_config_paths():
config_home = os.environ.get('XDG_CONFIG_HOME', os.path.join(os.path.expanduser('~'), '.config'))
config_path = os.path.join(config_home, 'powerline')
config_paths = [config_path]
config_dirs = os.environ.get('XDG_CONFIG_DIRS', None)
config_dirs = os.environ.get('XDG_CONFIG_DIRS', DEFAULT_SYSTEM_CONFIG_DIR)
if config_dirs is not None:
config_paths.extend([os.path.join(d, 'powerline') for d in config_dirs.split(':')])
plugin_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'config_files')
Expand Down
54 changes: 26 additions & 28 deletions powerline/bindings/vim/plugin/powerline.vim
Original file line number Diff line number Diff line change
Expand Up @@ -21,27 +21,24 @@ let s:powerline_pyeval = get(g:, 'powerline_pyeval', s:powerline_pycmd.'eval')

let s:import_cmd = 'from powerline.vim import VimPowerline'
try
exec s:powerline_pycmd s:import_cmd
catch
" An error occurred while importing the module, it could be installed
" outside of Python's module search paths. Update sys.path and try again.
exec s:powerline_pycmd 'import sys, vim'
exec s:powerline_pycmd 'sys.path.append(vim.eval(''expand("<sfile>:h:h:h:h:h")''))'
try
exec s:powerline_pycmd s:import_cmd
let s:launched = 1
finally
if !exists('s:launched')
call s:CriticalError('An error occurred while importing the Powerline package.
\ This could be caused by an invalid sys.path setting, or by an incompatible
\ Python version (Powerline requires Python 2.6+ or 3.2+ to work). Please consult
\ the troubleshooting section in the documentation for possible solutions.')
finish
endif
endtry
exec s:powerline_pycmd "try:\n"
\ ." ".s:import_cmd."\n"
\ ."except ImportError:\n"
\ ." import sys, vim\n"
\ ." sys.path.append(vim.eval('expand(\"<sfile>:h:h:h:h:h\")'))\n"
\ ." ".s:import_cmd
let s:launched = 1
finally
if !exists('s:launched')
call s:CriticalError('An error occurred while importing the Powerline package.
\ This could be caused by an invalid sys.path setting, or by an incompatible
\ Python version (Powerline requires Python 2.6+ or 3.2+ to work). Please consult
\ the troubleshooting section in the documentation for possible solutions.')
finish
else
unlet s:launched
endif
endtry
exec s:powerline_pycmd 'powerline = VimPowerline()'
exec s:powerline_pycmd 'del VimPowerline'

if !get(g:, 'powerline_debugging_pyeval') && exists('*'. s:powerline_pyeval)
let s:pyeval = function(s:powerline_pyeval)
Expand Down Expand Up @@ -80,18 +77,19 @@ endfunction
function! PowerlineRegisterCachePurgerEvent(event)
exec s:powerline_pycmd 'from powerline.segments.vim import launchevent as powerline_launchevent'
augroup Powerline
exec 'autocmd!' a:event '*' s:powerline_pycmd.' powerline_launchevent("'.a:event.'")'
exec 'autocmd' a:event '*' s:powerline_pycmd.' powerline_launchevent("'.a:event.'")'
augroup END
endfunction

augroup Powerline
autocmd! ColorScheme * :exec s:powerline_pycmd 'powerline.renderer.reset_highlight()'
autocmd! VimEnter * :redrawstatus!
autocmd! VimLeave * :exec s:powerline_pycmd 'powerline.renderer.shutdown()'
augroup END

exec s:powerline_pycmd 'powerline = VimPowerline()'
exec s:powerline_pycmd 'del VimPowerline'
" Is immediately changed when PowerlineNew() function is run. Good for global
" value.
set statusline=%!PowerlineNew()
call PowerlineNew()

augroup Powerline
autocmd!
autocmd ColorScheme * :exec s:powerline_pycmd 'powerline.renderer.reset_highlight()'
autocmd VimEnter * :redrawstatus!
autocmd VimLeave * :exec s:powerline_pycmd 'powerline.renderer.shutdown()'
augroup END
37 changes: 34 additions & 3 deletions powerline/bindings/zsh/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,47 @@ def config_path(self):
return None


def string(s):
if type(s) is bytes:
return s.decode('utf-8', errors='replace')
else:
return str(s)


class Environment(object):
@staticmethod
def __getitem__(key):
try:
return string(zsh.getvalue(key))
except IndexError as e:
raise KeyError(*e.args)

@staticmethod
def get(key, default=None):
try:
return string(zsh.getvalue(key))
except IndexError:
return default


class Prompt(object):
__slots__ = ('render', 'side', 'savedpsvar', 'savedps')
__slots__ = ('render', 'side', 'savedpsvar', 'savedps', 'args')

def __init__(self, powerline, side, savedpsvar=None, savedps=None):
self.render = powerline.renderer.render
self.side = side
self.savedpsvar = savedpsvar
self.savedps = savedps
self.args = powerline.args

def __str__(self):
return self.render(width=zsh.columns(), side=self.side).encode('utf-8')
r = self.render(width=zsh.columns(), side=self.side, segment_info=self.args)
if type(r) is not str:
if type(r) is bytes:
return r.decode('utf-8')
else:
return r.encode('utf-8')
return r

def __del__(self):
if self.savedps:
Expand All @@ -71,6 +101,7 @@ def set_prompt(powerline, psvar, side):


def setup():
powerline = ShellPowerline(Args())
environ = Environment()
powerline = ShellPowerline(Args(), environ=environ, getcwd=lambda: environ['PWD'])
set_prompt(powerline, 'PS1', 'left')
set_prompt(powerline, 'RPS1', 'right')
Loading

0 comments on commit 5cebad9

Please sign in to comment.