Add some workarounds for powerline-lint

This commit is contained in:
ZyX 2014-10-12 16:33:34 +04:00
parent 8551e51b6d
commit b8a4d9b054
4 changed files with 58 additions and 1 deletions

View File

@ -29,6 +29,24 @@ object it should receive the following arguments:
And also any other argument(s) specified by user in :ref:`args key And also any other argument(s) specified by user in :ref:`args key
<config-themes-seg-args>` (no additional arguments by default). <config-themes-seg-args>` (no additional arguments by default).
.. note::
For powerline-lint to work properly the following things may be needed:
#. If your segment is a :py:class:`powerline.segments.Segment` and used
arguments are scattered over multiple methods
:py:meth:`powerline.segments.Segment.argspecobjs` should be overridden in
subclass to tell powerline-lint which objects should be inspected for
arguments.
#. If your segment takes some arguments that are never listed, but accessed
via ``kwargs.get()`` or you cannot use previous function for whatever
reason :py:meth:`powerline.segments.Segment.additional_args` should be
overridden in subclass.
#. If you are expecting user to use one :ref:`name <config-themes-seg-name>`
for multiple segments which cannot be linked to the segment function
automatically by powerline-lint (e.g. because there are no instances of
the segments in question in the default configuration) you should use
:py:func:`powerline.lint.checks.register_common_name`.
Object representing segment may have the following attributes used by Object representing segment may have the following attributes used by
powerline: powerline:

View File

@ -19,7 +19,7 @@ from powerline.lint.checks import (check_matcher_func, check_ext, check_config,
check_segment_module, check_exinclude_function, type_keys, check_segment_module, check_exinclude_function, type_keys,
check_segment_function, check_args, get_one_segment_function, check_segment_function, check_args, get_one_segment_function,
check_highlight_groups, check_highlight_group, check_full_segment_data, check_highlight_groups, check_highlight_group, check_full_segment_data,
get_all_possible_functions, check_segment_data_key) get_all_possible_functions, check_segment_data_key, register_common_name)
from powerline.lint.spec import Spec from powerline.lint.spec import Spec
from powerline.lint.context import Context from powerline.lint.context import Context
@ -289,6 +289,10 @@ theme_spec = common_theme_spec().update(
) )
def register_common_names():
register_common_name('player', 'powerline.segments.common.players', '_player')
def check(paths=None, debug=False, echoerr=echoerr, require_ext=None): def check(paths=None, debug=False, echoerr=echoerr, require_ext=None):
'''Check configuration sanity '''Check configuration sanity
@ -308,6 +312,7 @@ def check(paths=None, debug=False, echoerr=echoerr, require_ext=None):
``False`` if user configuration seems to be completely sane and ``True`` ``False`` if user configuration seems to be completely sane and ``True``
if some problems were found. if some problems were found.
''' '''
register_common_names()
search_paths = paths or get_config_paths() search_paths = paths or get_config_paths()
find_config_files = generate_config_finder(lambda: search_paths) find_config_files = generate_config_finder(lambda: search_paths)

View File

@ -5,6 +5,8 @@ import os
import re import re
import logging import logging
from collections import defaultdict
from powerline.lib.threaded import ThreadedSegment from powerline.lib.threaded import ThreadedSegment
from powerline.lib.unicode import unicode from powerline.lib.unicode import unicode
from powerline.lint.markedjson.markedvalue import MarkedUnicode from powerline.lint.markedjson.markedvalue import MarkedUnicode
@ -673,6 +675,16 @@ def get_one_segment_function(data, context, echoerr):
yield func yield func
common_names = defaultdict(set)
def register_common_name(name, cmodule, cname):
s = cmodule + '.' + cname
cmodule_mark = Mark('<common name definition>', 1, 1, s, 1)
cname_mark = Mark('<common name definition>', 1, len(cmodule) + 1, s, len(cmodule) + 1)
common_names[name].add((MarkedUnicode(cmodule, cmodule_mark), MarkedUnicode(cname, cname_mark)))
def get_all_possible_functions(data, context, echoerr): def get_all_possible_functions(data, context, echoerr):
name = context[-2][0] name = context[-2][0]
module, name = name.rpartition('.')[::2] module, name = name.rpartition('.')[::2]
@ -681,6 +693,11 @@ def get_all_possible_functions(data, context, echoerr):
if func: if func:
yield func yield func
else: else:
if name in common_names:
for cmodule, cname in common_names[name]:
cfunc = import_segment(cname, data, context, echoerr, module=MarkedUnicode(cmodule, None))
if cfunc:
yield cfunc
for ext, theme_config in list_themes(data, context): for ext, theme_config in list_themes(data, context):
for segments in theme_config.get('segments', {}).values(): for segments in theme_config.get('segments', {}).values():
for segment in segments: for segment in segments:

View File

@ -53,6 +53,9 @@ class PlayerSegment(Segment):
'highlight_group': ['now_playing', 'player_' + (stats['state'] or 'fallback'), 'player'], 'highlight_group': ['now_playing', 'player_' + (stats['state'] or 'fallback'), 'player'],
}] }]
def get_player_status(self, pl):
pass
def argspecobjs(self): def argspecobjs(self):
for ret in super(PlayerSegment, self).argspecobjs(): for ret in super(PlayerSegment, self).argspecobjs():
yield ret yield ret
@ -112,6 +115,9 @@ Highlight groups used: ``player_fallback`` or ``player``, ``player_play`` or ``p
''' '''
_player = with_docstring(PlayerSegment(), _common_args.format('_player'))
class CmusPlayerSegment(PlayerSegment): class CmusPlayerSegment(PlayerSegment):
def get_player_status(self, pl): def get_player_status(self, pl):
'''Return cmus player information. '''Return cmus player information.
@ -459,5 +465,16 @@ class NowPlayingSegment(Segment):
assert(isinstance(player_segment, PlayerSegment)) assert(isinstance(player_segment, PlayerSegment))
return player_segment(**kwargs) return player_segment(**kwargs)
def argspecobjs(self):
for ret in super(NowPlayingSegment, self).argspecobjs():
yield ret
yield '__call__', PlayerSegment.__call__
for k, v in globals().items():
if isinstance(v, type) and issubclass(v, PlayerSegment) and v is not DbusPlayerSegment:
yield 'get_player_status', v.get_player_status
def omitted_args(self, name, method):
return (0,)
now_playing = NowPlayingSegment() now_playing = NowPlayingSegment()