adapt linter

This commit is contained in:
Philip Wellnitz 2021-03-16 05:43:57 +09:00
parent a0aef34642
commit e04be6f5c9
2 changed files with 73 additions and 40 deletions

View File

@ -66,7 +66,7 @@ main_spec = (Spec(
default_top_theme=top_theme_spec().optional(), default_top_theme=top_theme_spec().optional(),
term_truecolor=Spec().type(bool).optional(), term_truecolor=Spec().type(bool).optional(),
term_escape_style=Spec().type(unicode).oneof(set(('auto', 'xterm', 'fbterm'))).optional(), term_escape_style=Spec().type(unicode).oneof(set(('auto', 'xterm', 'fbterm'))).optional(),
# Python is capable of loading from zip archives. Thus checking path # Python is capable of loading from zip archives. Thus checking path
# only for existence of the path, not for it being a directory # only for existence of the path, not for it being a directory
paths=Spec().list( paths=Spec().list(
(lambda value, *args: (True, True, not os.path.exists(os.path.expanduser(value.value)))), (lambda value, *args: (True, True, not os.path.exists(os.path.expanduser(value.value)))),
@ -144,19 +144,33 @@ true_color_spec = Spec().re(
'^[0-9a-fA-F]{6}$', '^[0-9a-fA-F]{6}$',
(lambda value: '"{0}" is not a six-digit hexadecimal unsigned integer written as a string'.format(value)) (lambda value: '"{0}" is not a six-digit hexadecimal unsigned integer written as a string'.format(value))
).copy ).copy
hex_color_spec = Spec().re(
'0x[0-9a-fA-F]{6}$',
(lambda value: '"{0}" is not a six-digit hexadecimal unsigned integer written as a string'.format(value))
).copy
hex_color_spec_long = Spec().re(
'0x[0-9a-fA-F]{8}$',
(lambda value: '"{0}" is not a eight-digit hexadecimal unsigned integer written as a string'.format(value))
).copy
colors_spec = (Spec( colors_spec = (Spec(
colors=Spec().unknown_spec( colors=Spec().unknown_spec(
Spec().ident(), Spec().ident(),
Spec().either( Spec().either(
Spec().tuple(term_color_spec(), true_color_spec()), Spec().tuple(term_color_spec(), true_color_spec()),
term_color_spec() term_color_spec(),
hex_color_spec(),
hex_color_spec_long()
) )
).context_message('Error while checking colors (key {key})'), ).context_message('Error while checking colors (key {key})'),
gradients=Spec().unknown_spec( gradients=Spec().unknown_spec(
Spec().ident(), Spec().ident(),
Spec().tuple( Spec().either(
Spec().len('gt', 1).list(term_color_spec()), Spec().tuple(
Spec().len('gt', 1).list(true_color_spec()).optional(), Spec().len('gt', 1).list(term_color_spec()),
Spec().len('gt', 1).list(true_color_spec()).optional(),
),
Spec().len('gt', 1).list(hex_color_spec())
) )
).context_message('Error while checking gradients (key {key})'), ).context_message('Error while checking gradients (key {key})'),
).context_message('Error while loading colors configuration')) ).context_message('Error while loading colors configuration'))
@ -168,7 +182,8 @@ group_name_spec = Spec().ident().copy
group_spec = Spec().either(Spec( group_spec = Spec().either(Spec(
fg=color_spec(), fg=color_spec(),
bg=color_spec(), bg=color_spec(),
attrs=Spec().list(Spec().type(unicode).oneof(set(('bold', 'italic', 'underline')))), attrs=Spec().list(Spec().type(unicode).oneof(set(('bold', 'italic', 'underline', 'overline')))).optional(),
click=Spec().optional(),
), group_name_spec().func(check_group)).copy ), group_name_spec().func(check_group)).copy
groups_spec = Spec().unknown_spec( groups_spec = Spec().unknown_spec(
group_name_spec(), group_name_spec(),
@ -214,19 +229,37 @@ shell_colorscheme_spec = (Spec(
mode_translations_value_spec(), mode_translations_value_spec(),
).optional().context_message('Error while loading mode translations (key {key})'), ).optional().context_message('Error while loading mode translations (key {key})'),
).context_message('Error while loading shell colorscheme')) ).context_message('Error while loading shell colorscheme'))
ipython_mode_spec = Spec().oneof(set(['vi-navigation', 'vi-insert', 'vi-insert-multiple',
'vi-replace'])).copy
ipython_colorscheme_spec = (Spec(
name=name_spec(),
groups=groups_spec(),
mode_translations=Spec().unknown_spec(
ipython_mode_spec(),
mode_translations_value_spec(),
).optional().context_message('Error while loading mode translations (key {key})'),
).context_message('Error while loading vim colorscheme'))
args_spec = Spec( args_spec = Spec(
pl=Spec().error('pl object must be set by powerline').optional(), pl=Spec().error('pl object must be set by powerline').optional(),
segment_info=Spec().error('Segment info dictionary must be set by powerline').optional(), segment_info=Spec().error('Segment info dictionary must be set by powerline').optional(),
).unknown_spec(Spec(), Spec()).optional().copy ).unknown_spec(Spec(), Spec()).optional().copy
segment_module_spec = Spec().type(unicode).func(check_segment_module).optional().copy segment_module_spec = Spec().type(unicode).func(check_segment_module).optional().copy
exinclude_spec = Spec().re(function_name_re).func(check_exinclude_function).copy exinclude_spec = Spec().either(
Spec(
function=Spec().re(function_name_re).func(check_segment_function),
args=Spec().unknown_spec(Spec(), Spec()).func(
lambda *args, **kwargs: check_args(get_one_segment_function, *args, **kwargs)
)
).func(lambda *args, **kwargs: (True, True, False)),
Spec().re(function_name_re).func(check_exinclude_function)
).copy
segment_spec_base = Spec( segment_spec_base = Spec(
name=Spec().re('^[a-zA-Z_]\w*$').optional(), name=Spec().re('^[a-zA-Z_]\w*$').optional(),
function=Spec().re(function_name_re).func(check_segment_function).optional(), function=Spec().re(function_name_re).func(check_segment_function).optional(),
exclude_modes=Spec().list(vim_mode_spec()).optional(), exclude_modes=Spec().optional(),
include_modes=Spec().list(vim_mode_spec()).optional(), include_modes=Spec().optional(),
exclude_function=exinclude_spec().optional(), exclude_function=exinclude_spec().optional(),
include_function=exinclude_spec().optional(), include_function=exinclude_spec().optional(),
draw_hard_divider=Spec().type(bool).optional(), draw_hard_divider=Spec().type(bool).optional(),
@ -263,9 +296,10 @@ segments_spec = Spec().optional().list(segment_spec).copy
segdict_spec = Spec( segdict_spec = Spec(
left=segments_spec().context_message('Error while loading segments from left side (key {key})'), left=segments_spec().context_message('Error while loading segments from left side (key {key})'),
right=segments_spec().context_message('Error while loading segments from right side (key {key})'), right=segments_spec().context_message('Error while loading segments from right side (key {key})'),
center=segments_spec().context_message('Error while loading segments from center side (key {key})'),
).func( ).func(
(lambda value, *args: (True, True, not (('left' in value) or ('right' in value)))), (lambda value, *args: (True, True, not (('left' in value) or ('right' in value) or ('center' in value)))),
(lambda value: 'segments dictionary must contain either left, right or both keys') (lambda value: 'segments dictionary must contain either left, right, center or all keys')
).context_message('Error while loading segments (key {key})').copy ).context_message('Error while loading segments (key {key})').copy
divside_spec = Spec( divside_spec = Spec(
hard=divider_spec(), hard=divider_spec(),
@ -281,6 +315,7 @@ segment_data_value_spec = Spec(
dividers_spec = Spec( dividers_spec = Spec(
left=divside_spec(), left=divside_spec(),
right=divside_spec(), right=divside_spec(),
center=divside_spec(),
).copy ).copy
spaces_spec = Spec().unsigned().cmp( spaces_spec = Spec().unsigned().cmp(
'le', 2, (lambda value: 'Are you sure you need such a big ({0}) number of spaces?'.format(value)) 'le', 2, (lambda value: 'Are you sure you need such a big ({0}) number of spaces?'.format(value))
@ -396,17 +431,17 @@ def check(paths=None, debug=False, echoerr=echoerr, require_ext=None):
:param list paths: :param list paths:
Paths from which configuration should be loaded. Paths from which configuration should be loaded.
:param bool debug: :param bool debug:
Determines whether some information useful for debugging linter should Determines whether some information useful for debugging linter should
be output. be output.
:param function echoerr: :param function echoerr:
Function that will be used to echo the error(s). Should accept four Function that will be used to echo the error(s). Should accept four
optional keyword parameters: ``problem`` and ``problem_mark``, and optional keyword parameters: ``problem`` and ``problem_mark``, and
``context`` and ``context_mark``. ``context`` and ``context_mark``.
:param str require_ext: :param str require_ext:
Require configuration for some extension to be present. Require configuration for some extension to be present.
:return: :return:
``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.
''' '''
hadproblem = False hadproblem = False
@ -556,8 +591,10 @@ def check(paths=None, debug=False, echoerr=echoerr, require_ext=None):
spec = vim_colorscheme_spec spec = vim_colorscheme_spec
elif ext == 'shell': elif ext == 'shell':
spec = shell_colorscheme_spec spec = shell_colorscheme_spec
elif ext == 'ipython':
spec = ipython_colorscheme_spec
else: else:
spec = colorscheme_spec spec = top_colorscheme_spec
if spec.match(config, context=Context(config), data=data, echoerr=ee)[1]: if spec.match(config, context=Context(config), data=data, echoerr=ee)[1]:
hadproblem = True hadproblem = True

View File

@ -16,7 +16,7 @@ from powerline.lint.context import JStr, list_themes
from powerline.lint.imp import WithPath, import_function, import_segment from powerline.lint.imp import WithPath, import_function, import_segment
from powerline.lint.spec import Spec from powerline.lint.spec import Spec
from powerline.lint.inspect import getconfigargspec from powerline.lint.inspect import getconfigargspec
from powerline.colorscheme import hex_to_cterm
list_sep = JStr(', ') list_sep = JStr(', ')
@ -152,13 +152,18 @@ def check_top_theme(theme, data, context, echoerr):
def check_color(color, data, context, echoerr): def check_color(color, data, context, echoerr):
havemarks(color) havemarks(color)
if (color not in data['colors_config'].get('colors', {}) if (color not in data['colors_config'].get('colors', {})
and color not in data['colors_config'].get('gradients', {})): and color not in data['colors_config'].get('gradients', {})):
try:
if hex_to_cterm(color) != -1:
return True, False, False
except Exception:
pass
echoerr( echoerr(
context='Error while checking highlight group in colorscheme (key {key})'.format( context='Error while checking highlight group in colorscheme (key {key})'.format(
key=context.key), key=context.key),
problem='found unexistent color or gradient {0}'.format(color), problem='found unexistent color or gradient {0}'.format(color),
problem_mark=color.mark problem_mark=color.mark
) )
return True, False, True return True, False, True
return True, False, False return True, False, False
@ -256,7 +261,7 @@ def check_key_compatibility(segment, data, context, echoerr):
hadproblem = False hadproblem = False
keys = set(segment) keys = set(segment)
if not ((keys - generic_keys) < type_keys[segment_type]): if not ((keys - generic_keys) <= type_keys[segment_type]):
unknown_keys = keys - generic_keys - type_keys[segment_type] unknown_keys = keys - generic_keys - type_keys[segment_type]
echoerr( echoerr(
context='Error while checking segments (key {key})'.format(key=context.key), context='Error while checking segments (key {key})'.format(key=context.key),
@ -542,7 +547,7 @@ def hl_group_in_colorscheme(hl_group, cconfig, allow_gradients, data, context, e
try: try:
group_config = cconfig['groups'][group_config] group_config = cconfig['groups'][group_config]
except KeyError: except KeyError:
# No such group. Error was already reported when checking # No such group. Error was already reported when checking
# colorschemes. # colorschemes.
return True return True
havemarks(group_config) havemarks(group_config)
@ -550,12 +555,12 @@ def hl_group_in_colorscheme(hl_group, cconfig, allow_gradients, data, context, e
for ckey in ('fg', 'bg'): for ckey in ('fg', 'bg'):
color = group_config.get(ckey) color = group_config.get(ckey)
if not color: if not color:
# No color. Error was already reported when checking # No color. Error was already reported when checking
# colorschemes. # colorschemes.
return True return True
havemarks(color) havemarks(color)
# Gradients are only allowed for function segments. Note that # Gradients are only allowed for function segments. Note that
# whether *either* color or gradient exists should have been # whether *either* color or gradient exists should have been
# already checked # already checked
hascolor = color in data['colors_config'].get('colors', {}) hascolor = color in data['colors_config'].get('colors', {})
hasgradient = color in data['colors_config'].get('gradients', {}) hasgradient = color in data['colors_config'].get('gradients', {})
@ -570,15 +575,6 @@ def hl_group_in_colorscheme(hl_group, cconfig, allow_gradients, data, context, e
problem_mark=color.mark problem_mark=color.mark
) )
return False return False
if allow_gradients == 'force' and not hadgradient:
echoerr(
context='Error while checking highlight group in theme (key {key})'.format(
key=context.key),
context_mark=hl_group.mark,
problem='group {0} should have at least one gradient color, but it has no'.format(hl_group),
problem_mark=group_config.mark
)
return False
return True return True
@ -586,7 +582,7 @@ def hl_exists(hl_group, data, context, echoerr, allow_gradients=False):
havemarks(hl_group) havemarks(hl_group)
ext = data['ext'] ext = data['ext']
if ext not in data['colorscheme_configs']: if ext not in data['colorscheme_configs']:
# No colorschemes. Error was already reported, no need to report it # No colorschemes. Error was already reported, no need to report it
# twice # twice
return [] return []
r = [] r = []
@ -805,7 +801,7 @@ def check_exinclude_function(name, data, context, echoerr):
def check_log_file_level(this_level, data, context, echoerr): def check_log_file_level(this_level, data, context, echoerr):
'''Check handler level specified in :ref:`log_file key <config-common-log>` '''Check handler level specified in :ref:`log_file key <config-common-log>`
This level must be greater or equal to the level in :ref:`log_level key This level must be greater or equal to the level in :ref:`log_level key
<config-common-log_level>`. <config-common-log_level>`.
''' '''
havemarks(this_level) havemarks(this_level)