[Kimchi-devel] [PATCH V4] add a make check-local command to verify the i18n string formatting
Sheldon
shaohef at linux.vnet.ibm.com
Tue Apr 8 13:07:44 UTC 2014
On 04/08/2014 05:50 PM, Zhou Zheng Sheng wrote:
> Nice patch! See comments below.
>
> on 2014/04/08 09:38, shaohef at linux.vnet.ibm.com wrote:
>> From: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
>>
>> When I do i18n translation, I find some string formattings are wrong.
>> So I add a check-local command to help the developer to check their
>> string formatting.
>>
>> Every developers please run this command before submit your patch.
>>
>> After you run this command, it may report some invalid string
>> formattings as follow.
>> $ make check-local
>> Checking for invalid i18n string...
>> bad i18n string formatting:
>> KCHAPI0005E: Create is not allowed for %(resource).
>> make: *** [check-local] Error 1
>>
>> You should check %(resource) is what you want.
>>
>> Ref:
>> https://docs.python.org/2/library/stdtypes.html#string-formatting-operations
>>
>> Signed-off-by: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
>> Signed-off-by: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
>> Signed-off-by: Christy Perez <christy at linux.vnet.ibm.com>
>> ---
>> Makefile.am | 5 +++++
>> contrib/check_i18n.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 66 insertions(+)
>> create mode 100755 contrib/check_i18n.py
>>
>> diff --git a/Makefile.am b/Makefile.am
>> index c68f050..401ff37 100644
>> --- a/Makefile.am
>> +++ b/Makefile.am
>> @@ -73,7 +73,12 @@ PEP8_WHITELIST = \
>>
>> SKIP_PYFLAKES_ERR = "\./src/kimchi/websocket\.py"
>>
>> +I18N_FILES = plugins/*/i18n.py \
>> + src/kimchi/i18n.py \
>> + $(NULL)
>> +
>> check-local:
>> + contrib/check_i18n.py $(I18N_FILES)
>> find . -path './.git' -prune -type f -o \
>> -name '*.py' -o -name '*.py.in' | xargs $(PYFLAKES) | \
>> grep -w -v $(SKIP_PYFLAKES_ERR) | \
>> diff --git a/contrib/check_i18n.py b/contrib/check_i18n.py
>> new file mode 100755
>> index 0000000..e3c2b8c
>> --- /dev/null
>> +++ b/contrib/check_i18n.py
>> @@ -0,0 +1,61 @@
>> +#!/usr/bin/python
>> +#
>> +# Project Kimchi
>> +#
>> +# Copyright IBM, Corp. 2014
>> +#
>> +# This library is free software; you can redistribute it and/or
>> +# modify it under the terms of the GNU Lesser General Public
>> +# License as published by the Free Software Foundation; either
>> +# version 2.1 of the License, or (at your option) any later version.
>> +#
>> +# This library is distributed in the hope that it will be useful,
>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>> +# Lesser General Public License for more details.
>> +#
>> +# You should have received a copy of the GNU Lesser General Public
>> +# License along with this library; if not, write to the Free Software
>> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>> +
>> +import glob
>> +import imp
>> +import os
>> +import re
>> +import sys
>> +
>> +
>> +PATTERN = re.compile("%\([^\)]*\)[#0\-\+\s]?(\d+|\*)?(\.(\d+|\*)?)?"
>> + "[lLh]?[cdeEfFgGioursxX%]")
> It seems the PATTERN does not fully follow the Python specification. In
> "5.6.2. String Formatting Operations", there is a "Flag" table. It shows
> that "#" "0" "-" " "(a space) and "+" are valid flags. It implies the
> following
> '%(a) d' % {'a': 100} produces ' 100'
> '%(a) d' % {'a': -100} produces '-100'
> So the a space should be added to "[#0\-\+\s]" part of the pattern.
yes. Will remove "\s" add " ". check "\s" include " " and "\t".
>
> According to the description of the "5. Precision", it seem that
> "(\.(\d+|\*)?)?" should be changed to "(\.(\d+|\*))?".
yes. it should be "(\.(\d+|\*))?"
>
>> +BAD_PATTERN = re.compile("%\([^\)]*\)")
>> +
>> +
>> +def load_i18n_module(i18nfile):
>> + path = os.path.dirname(i18nfile)
>> + mname = i18nfile.replace("/", "_").rstrip(".py")
>> + mobj = imp.find_module("i18n", [path])
>> + return imp.load_module(mname, *mobj)
>> +
>> +
>> +def check_string_formatting(messages):
>> + for k, v in messages.iteritems():
>> + if BAD_PATTERN.findall(PATTERN.sub(" ", v)):
>> + print "bad i18n string formatting:"
>> + print " %s: %s" % (k, v)
>> + exit(1)
>> +
>> +
>> +def main():
>> + files = []
>> + for v in sys.argv[1:]:
>> + files.extend(glob.glob(v))
>> +
> It seems that you don't have to do path pattern matching here. The shell
> shall perform the path expansion automatically. When in Makefile it runs
> the following,
> contrib/check_i18n.py $(I18N_FILES)
> Then make expands I18N_FILES into
> plugins/*/i18n.py src/kimchi/i18n.py
> Then it runs
> contrib/check_i18n.py plugins/*/i18n.py src/kimchi/i18n.py
> Then shell expands plugins/*/i18n.py properly. So we don't have to call
> gloab ourselves.
yes. Thanks.
>> + print "Checking for invalid i18n string..."
>> + for f in files:
>> + messages = load_i18n_module(f).messages
>> + check_string_formatting(messages)
>> + print "Checking for invalid i18n string successfully"
>> +
>> +
>> +if __name__ == '__main__':
>> + main()
>>
>
--
Thanks and best regards!
Sheldon Feng(冯少合)<shaohef at linux.vnet.ibm.com>
IBM Linux Technology Center
More information about the Kimchi-devel
mailing list