1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-12 14:14:48 +02:00

doc: drop Python 2 support in script docgen.py

The script now requires Python 3.6+.
This commit is contained in:
Sébastien Helleu
2020-05-02 17:23:31 +02:00
parent 2c76343bda
commit 15735b6cba
+143 -147
View File
@@ -1,4 +1,4 @@
# -*- coding: utf-8 -*-
#!/usr/bin/env python3
#
# Copyright (C) 2008-2020 Sébastien Helleu <flashcode@flashtux.org>
#
@@ -31,6 +31,8 @@ Documentation generator for WeeChat: build include files with:
- URL options
- plugins priority.
This script requires Python 3.6+.
Instructions to build config files yourself in WeeChat directories
(replace "path" with the path to the docgen.py script in WeeChat repository):
@@ -39,11 +41,9 @@ Instructions to build config files yourself in WeeChat directories
Output files are in /path/xx/autogen/ (where xx is language).
"""
from __future__ import print_function
SCRIPT_NAME = 'docgen'
SCRIPT_AUTHOR = 'Sébastien Helleu <flashcode@flashtux.org>'
SCRIPT_VERSION = '0.2'
SCRIPT_VERSION = '0.3'
SCRIPT_LICENSE = 'GPL3'
SCRIPT_DESC = 'Documentation generator for WeeChat'
@@ -59,8 +59,8 @@ try:
import re
from collections import defaultdict
from operator import itemgetter
except ImportError as message:
print('Missing package(s) for {0}: {1}'.format(SCRIPT_NAME, message))
except ImportError as exc:
print(f'Missing package(s) for {SCRIPT_NAME}: {exc}')
IMPORT_OK = False
try:
@@ -156,16 +156,20 @@ class AutogenDoc(object):
def __init__(self, directory, doc, name):
"""Initialize auto-generated doc file."""
self.filename = os.path.join(directory, doc, name + '.adoc')
self.filename_tmp = self.filename + '.tmp'
self.filename_tmp = f'{self.filename}.tmp'
self._file = open(self.filename_tmp, 'w')
self.write('//\n')
self.write('// This file is auto-generated by script docgen.py.\n')
self.write('// DO NOT EDIT BY HAND!\n')
self.write('//\n')
self.write('//')
self.write('// This file is auto-generated by script docgen.py.')
self.write('// DO NOT EDIT BY HAND!')
self.write('//')
def write(self, string):
def write(self, string=None, *args):
"""Write a line in auto-generated doc file."""
self._file.write(string)
if string:
if args:
string %= args
self._file.write(string)
self._file.write('\n')
def update(self, obj_name, num_files, num_files_updated):
"""Update doc file if needed (if content has changed)."""
@@ -301,7 +305,7 @@ def get_hdata():
hdata[plugin][hdata_name]['description'] = \
weechat.infolist_string(infolist, 'description')
variables = ''
variables_update = ''
vars_update = ''
lists = ''
ptr_hdata = weechat.hdata_get(hdata_name)
if ptr_hdata:
@@ -316,33 +320,33 @@ def get_hdata():
key)
if var_array_size:
var_array_size = \
', array_size: "{0}"'.format(var_array_size)
f', array_size: "{var_array_size}"'
var_hdata = weechat.hdata_get_var_hdata(ptr_hdata, key)
if var_hdata:
var_hdata = ', hdata: "{0}"'.format(var_hdata)
var_hdata = f', hdata: "{var_hdata}"'
type_string = weechat.hdata_get_var_type_string(ptr_hdata,
key)
hdata2.append({
'offset': var_offset,
'text': '_{0}_ ({1})'.format(key, type_string),
'textlong': '_{0}_   ({1}{2}{3})'.format(
key, type_string, var_array_size, var_hdata),
'text': f'_{key}_ ({type_string})',
'textlong': (f'_{key}_   ({type_string}'
f'{var_array_size}{var_hdata})'),
'update': weechat.hdata_update(
ptr_hdata, '', {'__update_allowed': key}),
})
hdata2 = sorted(hdata2, key=itemgetter('offset'))
for item in hdata2:
variables += '{0} +\n'.format(item['textlong'])
variables += f'{item["textlong"]} +\n'
if item['update']:
variables_update += '    {0} +\n'.format(item['text'])
vars_update += f'    {item["text"]} +\n'
if weechat.hdata_update(ptr_hdata, '',
{'__create_allowed': ''}):
variables_update += '    _{hdata_update_create}_ +\n'
vars_update += '    _{hdata_update_create}_ +\n'
if weechat.hdata_update(ptr_hdata, '',
{'__delete_allowed': ''}):
variables_update += '    _{hdata_update_delete}_ +\n'
vars_update += '    _{hdata_update_delete}_ +\n'
hdata[plugin][hdata_name]['vars'] = variables
hdata[plugin][hdata_name]['vars_update'] = variables_update
hdata[plugin][hdata_name]['vars_update'] = vars_update.rstrip()
string = weechat.hdata_get_string(ptr_hdata, 'list_keys')
if string:
@@ -352,7 +356,7 @@ def get_hdata():
lists_last = [l for l in list_lists
if l.startswith('last_')]
for item in sorted(lists_std) + sorted(lists_last):
lists += '_{0}_ +\n'.format(item)
lists += f'_{item}_ +\n'
hdata[plugin][hdata_name]['lists'] = lists
weechat.infolist_free(infolist)
return hdata
@@ -446,10 +450,10 @@ def get_plugins_priority():
def print_counters(label, files, updated):
"""Print a line with counters."""
color = weechat.color('*lightred') if updated > 0 else ''
color_reset = weechat.color('reset')
weechat.prnt('',
'docgen: {0}: {1} files, {2}{3}{4} updated'
''.format(label, files, color, updated,
weechat.color('reset')))
f'docgen: {label}: {files} files, '
f'{color}{updated}{color_reset} updated')
# pylint: disable=too-many-locals, too-many-branches, too-many-statements
@@ -489,52 +493,52 @@ def docgen_cmd_cb(data, buf, args):
num_files_updated[key] = 0
trans = gettext.translation('weechat',
weechat.info_get('weechat_localedir', ''),
languages=[locale + '.UTF-8'],
languages=[f'{locale}.UTF-8'],
fallback=True)
trans.install()
directory = os.path.join(os.path.dirname(data),
locale[0:2],
'autogen')
if not os.path.isdir(directory):
error = weechat.prefix('error')
weechat.prnt('',
'{0}docgen error: directory "{1}" does not exist'
''.format(weechat.prefix('error'), directory))
f'{error}docgen error: directory "{directory}" '
f'does not exist')
continue
# write commands
for plugin in commands:
doc = AutogenDoc(directory, 'user', plugin + '_commands')
doc = AutogenDoc(directory, 'user', f'{plugin}_commands')
for i, command in enumerate(sorted(commands[plugin])):
if i > 0:
doc.write('\n')
doc.write()
_cmd = commands[plugin][command]
args = translate(_cmd['args'])
args_formats = args.split(' || ')
desc = translate(_cmd['description'])
args_desc = translate(_cmd['args_description'])
doc.write('[[command_{0}_{1}]]\n'.format(plugin, command))
doc.write('* `+{0}+`: {1}\n\n'.format(command, desc))
doc.write('----\n')
doc.write(f'[[command_{plugin}_{command}]]')
doc.write(f'* `+{command}+`: {desc}\n')
doc.write('----')
prefix = '/' + command + ' '
if args_formats != ['']:
for fmt in args_formats:
doc.write(prefix + fmt + '\n')
doc.write(prefix + fmt)
prefix = ' ' * len(prefix)
if args_desc:
doc.write('\n')
for line in args_desc.split('\n'):
doc.write(line + '\n')
doc.write('----\n')
doc.write()
doc.write(args_desc)
doc.write('----')
doc.update('commands', num_files, num_files_updated)
# write config options
for config in options:
doc = AutogenDoc(directory, 'user', config + '_options')
doc = AutogenDoc(directory, 'user', f'{config}_options')
i = 0
for section in sorted(options[config]):
for option in sorted(options[config][section]):
if i > 0:
doc.write('\n')
doc.write()
i += 1
_opt = options[config][section][option]
opt_type = _opt['type']
@@ -552,20 +556,20 @@ def docgen_cmd_cb(data, buf, args):
if string_values:
values = string_values.replace('|', ', ')
else:
values = '{0} .. {1}'.format(opt_min, opt_max)
values = f'{opt_min} .. {opt_max}'
elif opt_type == 'string':
if opt_max <= 0:
values = _('any string')
elif opt_max == 1:
values = _('any char')
elif opt_max > 1:
values = '{0} ({1}: {2})'.format(_('any string'),
_('max chars'),
opt_max)
values = (_('any string')
+ '(' + _('max chars') + ': '
+ opt_max + ')')
else:
values = _('any string')
default_value = '"{0}"'.format(
default_value.replace('"', '\\"'))
default_value = ('"%s"' %
default_value.replace('"', '\\"'))
elif opt_type == 'color':
values = _('a WeeChat color name (default, black, '
'(dark)gray, white, (light)red, '
@@ -576,176 +580,168 @@ def docgen_cmd_cb(data, buf, args):
'only, not background): \"*\" for bold, '
'\"!\" for reverse, \"/\" for italic, '
'\"_\" for underline')
doc.write('* [[option_{0}.{1}.{2}]] *{3}.{4}.{5}*\n'
''.format(config, section, option, config,
section, option))
doc.write('** {0}: pass:none[{1}]\n'.format(
_('description'), desc.replace(']', '\\]')))
doc.write('** {0}: {1}\n'.format(_('type'), type_nls))
doc.write('** {0}: {1}\n'.format(_('values'), values))
doc.write('** {0}: `+{1}+`\n'
''.format(_('default value'), default_value))
doc.write(f'* [[option_{config}.{section}.{option}]] '
f'*{config}.{section}.{option}*')
doc.write('** %s: pass:none[%s]',
_('description'), desc.replace(']', '\\]'))
doc.write('** %s: %s', _('type'), type_nls)
doc.write('** %s: %s', _('values'), values)
doc.write('** %s: `+%s+`',
_('default value'), default_value)
if null_value_allowed:
doc.write('** {0}\n'.format(
_('undefined value allowed (null)')))
doc.write('** %s',
_('undefined value allowed (null)'))
doc.update('options', num_files, num_files_updated)
# write default aliases
doc = AutogenDoc(directory, 'user', 'alias_default_aliases')
doc.write('[width="100%",cols="2m,5m,5",options="header"]\n')
doc.write('|===\n')
doc.write('| {0} | {1} | {2}\n\n'
''.format(_('Alias'), _('Command'), _('Completion')))
doc.write('[width="100%",cols="2m,5m,5",options="header"]')
doc.write('|===')
doc.write('| %s | %s | %s\n',
_('Alias'), _('Command'), _('Completion'))
for alias in default_aliases:
doc.write('| {0} | {1} | {2}\n'
''.format(escape(alias['name']),
escape(alias['command']),
escape(alias['completion'] or '-')))
doc.write('|===\n')
doc.write('| %s | %s | %s',
escape(alias['name']),
escape(alias['command']),
escape(alias['completion'] or '-'))
doc.write('|===')
doc.update('alias_default_aliases', num_files, num_files_updated)
# write IRC colors
doc = AutogenDoc(directory, 'user', 'irc_colors')
doc.write('[width="50%",cols="^2m,3",options="header"]\n')
doc.write('|===\n')
doc.write('| {0} | {1}\n\n'
''.format(_('IRC color'), _('WeeChat color')))
doc.write('[width="50%",cols="^2m,3",options="header"]')
doc.write('|===')
doc.write('| %s | %s\n', _('IRC color'), _('WeeChat color'))
for color in irc_colors:
doc.write('| {0} | {1}\n'
''.format(escape(color['color_irc']),
escape(color['color_weechat'])))
doc.write('|===\n')
doc.write('| %s | %s',
escape(color['color_irc']),
escape(color['color_weechat']))
doc.write('|===')
doc.update('irc_colors', num_files, num_files_updated)
# write infos hooked
doc = AutogenDoc(directory, 'plugin_api', 'infos')
doc.write('[width="100%",cols="^1,^2,6,6",options="header"]\n')
doc.write('|===\n')
doc.write('| {0} | {1} | {2} | {3}\n\n'
''.format(_('Plugin'), _('Name'), _('Description'),
_('Arguments')))
doc.write('[width="100%",cols="^1,^2,6,6",options="header"]')
doc.write('|===')
doc.write('| %s | %s | %s | %s\n',
_('Plugin'), _('Name'), _('Description'), _('Arguments'))
for plugin in sorted(infos):
for info in sorted(infos[plugin]):
_inf = infos[plugin][info]
desc = translate(_inf['description'])
args_desc = translate(_inf['args_description'] or '-')
doc.write('| {0} | {1} | {2} | {3}\n\n'
''.format(escape(plugin), escape(info),
escape(desc), escape(args_desc)))
doc.write('|===\n')
doc.write('| %s | %s | %s | %s\n',
escape(plugin), escape(info), escape(desc),
escape(args_desc))
doc.write('|===')
doc.update('infos', num_files, num_files_updated)
# write infos (hashtable) hooked
doc = AutogenDoc(directory, 'plugin_api', 'infos_hashtable')
doc.write('[width="100%",cols="^1,^2,6,6,8",options="header"]\n')
doc.write('|===\n')
doc.write('| {0} | {1} | {2} | {3} | {4}\n\n'
''.format(_('Plugin'), _('Name'), _('Description'),
_('Hashtable (input)'), _('Hashtable (output)')))
doc.write('[width="100%",cols="^1,^2,6,6,8",options="header"]')
doc.write('|===')
doc.write('| %s | %s | %s | %s | %s\n',
_('Plugin'), _('Name'), _('Description'),
_('Hashtable (input)'), _('Hashtable (output)'))
for plugin in sorted(infos_hashtable):
for info in sorted(infos_hashtable[plugin]):
_inh = infos_hashtable[plugin][info]
desc = translate(_inh['description'])
args_desc = translate(_inh['args_description'])
output_desc = translate(_inh['output_description']) or '-'
doc.write('| {0} | {1} | {2} | {3} | {4}\n\n'
''.format(escape(plugin), escape(info),
escape(desc), escape(args_desc),
escape(output_desc)))
doc.write('|===\n')
doc.write('| %s | %s | %s | %s | %s\n',
escape(plugin), escape(info), escape(desc),
escape(args_desc), escape(output_desc))
doc.write('|===')
doc.update('infos_hashtable', num_files, num_files_updated)
# write infolists hooked
doc = AutogenDoc(directory, 'plugin_api', 'infolists')
doc.write('[width="100%",cols="^1,^2,5,5,5",options="header"]\n')
doc.write('|===\n')
doc.write('| {0} | {1} | {2} | {3} | {4}\n\n'
''.format(_('Plugin'), _('Name'), _('Description'),
_('Pointer'), _('Arguments')))
doc.write('[width="100%",cols="^1,^2,5,5,5",options="header"]')
doc.write('|===')
doc.write('| %s | %s | %s | %s | %s\n',
_('Plugin'), _('Name'), _('Description'), _('Pointer'),
_('Arguments'))
for plugin in sorted(infolists):
for infolist in sorted(infolists[plugin]):
_inl = infolists[plugin][infolist]
desc = translate(_inl['description'])
pointer_desc = translate(_inl['pointer_description']) or '-'
args_desc = translate(_inl['args_description']) or '-'
doc.write('| {0} | {1} | {2} | {3} | {4}\n\n'
''.format(escape(plugin), escape(infolist),
escape(desc), escape(pointer_desc),
escape(args_desc)))
doc.write('|===\n')
doc.write('| %s | %s | %s | %s | %s\n',
escape(plugin), escape(infolist), escape(desc),
escape(pointer_desc), escape(args_desc))
doc.write('|===')
doc.update('infolists', num_files, num_files_updated)
# write hdata hooked
doc = AutogenDoc(directory, 'plugin_api', 'hdata')
doc.write(':hdata_update_create: __create\n')
doc.write(':hdata_update_delete: __delete\n')
doc.write('[width="100%",cols="^1,^2,2,2,5",options="header"]\n')
doc.write('|===\n')
doc.write('| {0} | {1} | {2} | {3} | {4}\n\n'
''.format(_('Plugin'), _('Name'), _('Description'),
_('Lists'), _('Variables')))
doc.write(':hdata_update_create: __create')
doc.write(':hdata_update_delete: __delete')
doc.write('[width="100%",cols="^1,^2,2,2,5",options="header"]')
doc.write('|===')
doc.write('| %s | %s | %s | %s | %s\n',
_('Plugin'), _('Name'), _('Description'), _('Lists'),
_('Variables'))
for plugin in sorted(hdata):
for hdata_name in sorted(hdata[plugin]):
_hda = hdata[plugin][hdata_name]
anchor = 'hdata_{0}'.format(hdata_name)
anchor = f'hdata_{hdata_name}'
desc = translate(_hda['description'])
variables = _hda['vars']
variables_update = _hda['vars_update']
vars_update = _hda['vars_update']
lists = _hda['lists']
doc.write('| {0}\n'.format(escape(plugin)))
doc.write('| [[{0}]]<<{0},{1}>>\n'
''.format(escape(anchor), escape(hdata_name)))
doc.write('| {0}\n'.format(escape(desc)))
doc.write('| {0}\n'.format(escape(lists) if lists else '-'))
doc.write('| {0}\n'.format(escape(variables)))
if variables_update:
doc.write('*{0}* +\n{1}'.format(
_('Update allowed:'),
escape(variables_update)))
doc.write('\n')
doc.write('|===\n')
doc.write(f'| {escape(plugin)}')
doc.write(f'| [[{escape(anchor)}]]<<{escape(anchor)},'
f'{escape(hdata_name)}>>')
doc.write(f'| {escape(desc)}')
str_lists = escape(lists) if lists else '-'
doc.write(f'| {str_lists}')
doc.write(f'| {escape(variables)}')
if vars_update:
doc.write('*%s* +\n%s',
_('Update allowed:'), escape(vars_update))
doc.write()
doc.write('|===')
doc.update('hdata', num_files, num_files_updated)
# write completions hooked
doc = AutogenDoc(directory, 'plugin_api', 'completions')
doc.write('[width="100%",cols="^1,^2,7",options="header"]\n')
doc.write('|===\n')
doc.write('| {0} | {1} | {2}\n\n'
''.format(_('Plugin'), _('Name'), _('Description')))
doc.write('[width="100%",cols="^1,^2,7",options="header"]')
doc.write('|===')
doc.write('| %s | %s | %s\n',
_('Plugin'), _('Name'), _('Description'))
for plugin in sorted(completions):
for completion_item in sorted(completions[plugin]):
_cmp = completions[plugin][completion_item]
desc = translate(_cmp['description'])
doc.write('| {0} | {1} | {2}\n\n'
''.format(escape(plugin), escape(completion_item),
escape(desc)))
doc.write('|===\n')
doc.write('| %s | %s | %s\n',
escape(plugin), escape(completion_item),
escape(desc))
doc.write('|===')
doc.update('completions', num_files, num_files_updated)
# write URL options
doc = AutogenDoc(directory, 'plugin_api', 'url_options')
doc.write('[width="100%",cols="2,^1,7",options="header"]\n')
doc.write('|===\n')
doc.write('| {0} | {1} | {2}\n\n'
''.format(_('Option'),
_('Type') + ' ^(1)^',
_('Constants') + ' ^(2)^'))
doc.write('[width="100%",cols="2,^1,7",options="header"]')
doc.write('|===')
doc.write('| %s | %s ^(1)^ | %s ^(2)^\n',
_('Option'), _('Type'), _('Constants'))
for option in url_options:
constants = option['constants']
if constants:
constants = ' ' + constants
doc.write('| {0} | {1} |{2}\n\n'
''.format(escape(option['name']),
escape(option['type']),
escape(constants)))
doc.write('|===\n')
doc.write('| %s | %s |%s\n',
escape(option['name']), escape(option['type']),
escape(constants))
doc.write('|===')
doc.update('url_options', num_files, num_files_updated)
# write plugins priority
doc = AutogenDoc(directory, 'plugin_api', 'plugins_priority')
for priority in sorted(plugins_priority, reverse=True):
plugins = ', '.join(sorted(plugins_priority[priority]))
doc.write('. {0} ({1})\n'.format(escape(plugins), priority))
doc.write('. %s (%s)', escape(plugins), priority)
doc.update('plugins_priority', num_files, num_files_updated)
# write counters