[GRASS-SVN] r61225 - grass/trunk/lib/python grass/trunk/lib/python/gunittest sandbox/wenzeslaus
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed Jul 9 17:59:53 PDT 2014
Author: wenzeslaus
Date: 2014-07-09 17:59:52 -0700 (Wed, 09 Jul 2014)
New Revision: 61225
Added:
grass/trunk/lib/python/gunittest/
sandbox/wenzeslaus/grass_py_static_check.py
Removed:
grass/trunk/lib/python/gunittest/grass_py_static_check.py
sandbox/wenzeslaus/gunittest/
Log:
gunittest: move package from sandbox to trunk (leave static check script in sandbox)
Deleted: grass/trunk/lib/python/gunittest/grass_py_static_check.py
===================================================================
--- sandbox/wenzeslaus/gunittest/grass_py_static_check.py 2014-07-09 22:20:12 UTC (rev 61224)
+++ grass/trunk/lib/python/gunittest/grass_py_static_check.py 2014-07-10 00:59:52 UTC (rev 61225)
@@ -1,221 +0,0 @@
-#!/usr/bin/env python
-#
-############################################################################
-#
-# MODULE: grass_py_static_check
-# AUTHOR(S): Vaclav Petras <wenzeslaus gmail com>
-# PURPOSE: Static source code analysis of Python code for GRASS GIS
-# COPYRIGHT: (C) 2014 by Vaclav Petras and the GRASS Development Team
-#
-# This program is free software under the GNU General Public
-# License (>=v2). Read the file COPYING that comes with GRASS
-# for details.
-#
-#############################################################################
-
-"""
-Can run only from the source code top level directory.
-"""
-
-import sys
-import os
-from subprocess import Popen, PIPE
-import re
-
-
-# also in gunittest.main
-def ensure_dir(directory):
- if not os.path.exists(directory):
- os.makedirs(directory)
-
-
-def pylint(target, output_dir):
- cmd = ['pylint', '--rcfile=tools/pylintrc.txt', '--output-format=html',
- '--ignore=.svn']
- cmd = cmd + [target]
- # graph options:
- # --import-graph=<file.dot>
- # --ext-import-graph=<file.dot>
- # --int-import-graph=<file.dot>
- # also we can call pylint directly as a package and create our own HTML
- # report with message ids and perhaps even symbolic message names
- # result
- ensure_dir(output_dir)
- output_file = open(output_dir + '/pylint_report.html', 'w')
- # Path to the directory where the persistent for the run will be stored.
- env = os.environ.copy()
- env['PYLINTHOME'] = output_dir
- proc = Popen(cmd, stdout=output_file, env=env)
- ret = proc.wait()
- if ret == 32:
- raise RuntimeError("pylint usage error")
- elif ret & 1:
- cmd = ['pylint', '--rcfile=tools/pylintrc.txt', '--ignore=.svn']
- cmd = cmd + [target]
- proc = Popen(cmd, stdout=PIPE, env=env)
- stdout, stderr = proc.communicate()
- pylint_status = "pylint fatal message was issued and prevented pytlint from working"
- msg = "{target}: {stat}\n{o}".format(stat=pylint_status, target=target, o=stdout)
- raise RuntimeError(msg)
- return get_num_of_messages_from_pylint_file(output_dir + '/pylint_report.html')
-
-
-def pylint_errors(target, output_dir):
- # this ignores rcfile?
- cmd = ['pylint', '--errors-only', '--rcfile=tools/pylintrc.txt', '--output-format=html',
- '--ignore=.svn']
- cmd = cmd + [target]
- # result
- ensure_dir(output_dir)
- output_file = open(output_dir + '/pylint_errors_report.html', 'w')
- # Path to the directory where the persistent for the run will be stored.
- env = os.environ.copy()
- env['PYLINTHOME'] = output_dir
- proc = Popen(cmd, stdout=output_file, env=env)
- ret = proc.wait()
- if ret == 32:
- raise RuntimeError("pylint usage error")
- elif ret & 1:
- cmd = ['pylint', '--rcfile=tools/pylintrc.txt', '--ignore=.svn']
- cmd = cmd + [target]
- proc = Popen(cmd, stdout=PIPE, env=env)
- stdout, stderr = proc.communicate()
- pylint_status = "pylint fatal message was issued and prevented pytlint from working"
- msg = "{target}: {stat}\n{o}".format(stat=pylint_status, target=target, o=stdout)
- raise RuntimeError(msg)
- return get_num_of_messages_from_pylint_file(output_dir + '/pylint_errors_report.html')
-
-
-def remove_absolute_path_from_pep8(txt_file):
- txt = open(txt_file, 'r')
- content = txt.read()
- txt.close()
-
- # this would need to be more sophisticated for being crossplatform
- # and to be a general function
- gisbase = os.environ['GISBASE']
- assert gisbase
- exp = re.compile('%s/?' % (gisbase))
- content = exp.sub('', content)
-
- txt = open(txt_file, 'w')
- txt.write(content)
- txt.close()
-
-
-def get_num_of_messages_from_pep8_file(txt_file):
- count = 0
- txt = open(txt_file, 'r')
- exp = re.compile(r'^.+.py:[0-9]+: \[[EW][0-9]{1,3}\] .+$')
- for line in txt.readlines():
- if exp.match(line):
- count += 1
- txt.close()
- return count
-
-
-def get_num_of_messages_from_pylint_file(html_file):
- count = 0
- txt = open(html_file, 'r')
- exp = re.compile(r'<td>(error|warning|refactor|convention)</td>')
- for line in txt.readlines():
- if exp.match(line):
- count += 1
- #print count, line, re.template
- txt.close()
- return count
-
-
-def pep8txt_to_html(txt_file, html_file):
- txt = open(txt_file, 'r')
- html = open(html_file, 'w')
- html.write('<html><body>')
- html.write('<pre>')
- html.write(txt.read())
- html.write('</pre>')
- html.write('</body></html>')
- txt.close()
- html.close()
-
-
-def pep8(target, output_dir):
- cmd = ['pep8', '--config=tools/pep8config.txt', '--format=pylint']
- cmd = cmd + [target]
- # result
- ensure_dir(output_dir)
- output_file = open(output_dir + '/pep8_report.txt', 'w')
- # Path to the directory where the persistent for the run will be stored.
- env = os.environ.copy()
- proc = Popen(cmd, stdout=output_file, env=env)
- proc.wait()
- # pep8 always returns 1 when some error occurred
- output_file.close()
- remove_absolute_path_from_pep8(output_dir + '/pep8_report.txt')
- pep8txt_to_html(output_dir + '/pep8_report.txt', output_dir + '/pep8_report.html')
- return get_num_of_messages_from_pep8_file(output_dir + '/pep8_report.txt')
-
-
-def main():
- gisbase = os.environ['GISBASE']
- ensure_dir('pylint_report')
-
- main_index = open('pylint_report/index.html', 'w')
-
- # a lot of special treatment is needed to get packages nicely shown
-
- grass_packages = ['script', 'pygrass', 'temporal']
- # not included: 'imaging', 'pydispatch', 'lib'
- ensure_dir('pylint_report/grass')
- index = open('pylint_report/grass/index.html', 'w')
- for package in grass_packages:
- num_pylint = pylint('grass.' + package, 'pylint_report/grass/' + package)
- num_errors = pylint_errors('grass.' + package, 'pylint_report/grass/' + package)
- num_pep8 = pep8(gisbase + '/etc/python/grass/' + package, 'pylint_report/grass/' + package)
- index.write('{pkg}'.format(pkg=package))
- index.write(' <a href="{pkg}/pylint_report.html">pylint</a> ({num})'.format(pkg=package, num=num_pylint))
- index.write(' <a href="{pkg}/pylint_errors_report.html">pylint errors only</a> ({num})'.format(pkg=package, num=num_errors))
- index.write(' <a href="{pkg}/pep8_report.html">pep8</a> ({num})<br>'.format(pkg=package, num=num_pep8))
- index.close()
- main_index.write('<a href="grass/index.html">grass</a><br>'.format(pkg=package))
-
- dirlist = os.listdir(gisbase + '/gui/wxpython')
- packages = []
- directories = []
- for f in dirlist:
- if os.path.isdir('gui/wxpython/' + f):
- if os.path.isfile('gui/wxpython/' + f + '/__init__.py'):
- packages.append(f)
- else:
- directories.append(f)
-
- # this is generated but not used
- modules = [f for f in dirlist if f.endswith('.py')]
- subdirs_with_modules = {}
- for d in directories:
- subdirlist = os.listdir(gisbase + '/gui/wxpython/' + d)
- subdir_modules = [f for f in dirlist if os.path.isfile(gisbase + '/gui/wxpython/' + d + '/' + f) and f.endswith('.py')]
- if subdir_modules:
- subdirs_with_modules[d] = subdir_modules
-
- grass_wxgui_package = ['gui']
- ensure_dir('pylint_report/gui/wxpython')
- gui_dir = gisbase + '/gui/wxpython/'
- index = open('pylint_report/gui/wxpython/index.html', 'w')
- for package in packages:
- num_pylint = pylint(gui_dir + package, 'pylint_report/gui/wxpython/' + package)
- num_errors = pylint_errors(gui_dir + package, 'pylint_report/gui/wxpython/' + package)
- num_pep8 = pep8(gisbase + '/gui/wxpython/' + package, 'pylint_report/gui/wxpython/' + package)
- index.write('{pkg}'.format(pkg=package))
- index.write(' <a href="{pkg}/pylint_report.html">pylint</a> ({num})'.format(pkg=package, num=num_pylint))
- index.write(' <a href="{pkg}/pylint_errors_report.html">pylint errors only</a> ({num})'.format(pkg=package, num=num_errors))
- index.write(' <a href="{pkg}/pep8_report.html">pep8</a> ({num})<br>'.format(pkg=package, num=num_pep8))
- index.close()
- main_index.write('<a href="gui/wxpython/index.html">GRASS wxGUI</a><br>'.format(pkg=package))
-
- #pylint(grass_wxgui_packages_path, 'pylint_report/gui/scripts')
-
- return 0
-
-
-if __name__ == '__main__':
- sys.exit(main())
Copied: sandbox/wenzeslaus/grass_py_static_check.py (from rev 61224, sandbox/wenzeslaus/gunittest/grass_py_static_check.py)
===================================================================
--- sandbox/wenzeslaus/grass_py_static_check.py (rev 0)
+++ sandbox/wenzeslaus/grass_py_static_check.py 2014-07-10 00:59:52 UTC (rev 61225)
@@ -0,0 +1,221 @@
+#!/usr/bin/env python
+#
+############################################################################
+#
+# MODULE: grass_py_static_check
+# AUTHOR(S): Vaclav Petras <wenzeslaus gmail com>
+# PURPOSE: Static source code analysis of Python code for GRASS GIS
+# COPYRIGHT: (C) 2014 by Vaclav Petras and the GRASS Development Team
+#
+# This program is free software under the GNU General Public
+# License (>=v2). Read the file COPYING that comes with GRASS
+# for details.
+#
+#############################################################################
+
+"""
+Can run only from the source code top level directory.
+"""
+
+import sys
+import os
+from subprocess import Popen, PIPE
+import re
+
+
+# also in gunittest.main
+def ensure_dir(directory):
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+
+def pylint(target, output_dir):
+ cmd = ['pylint', '--rcfile=tools/pylintrc.txt', '--output-format=html',
+ '--ignore=.svn']
+ cmd = cmd + [target]
+ # graph options:
+ # --import-graph=<file.dot>
+ # --ext-import-graph=<file.dot>
+ # --int-import-graph=<file.dot>
+ # also we can call pylint directly as a package and create our own HTML
+ # report with message ids and perhaps even symbolic message names
+ # result
+ ensure_dir(output_dir)
+ output_file = open(output_dir + '/pylint_report.html', 'w')
+ # Path to the directory where the persistent for the run will be stored.
+ env = os.environ.copy()
+ env['PYLINTHOME'] = output_dir
+ proc = Popen(cmd, stdout=output_file, env=env)
+ ret = proc.wait()
+ if ret == 32:
+ raise RuntimeError("pylint usage error")
+ elif ret & 1:
+ cmd = ['pylint', '--rcfile=tools/pylintrc.txt', '--ignore=.svn']
+ cmd = cmd + [target]
+ proc = Popen(cmd, stdout=PIPE, env=env)
+ stdout, stderr = proc.communicate()
+ pylint_status = "pylint fatal message was issued and prevented pytlint from working"
+ msg = "{target}: {stat}\n{o}".format(stat=pylint_status, target=target, o=stdout)
+ raise RuntimeError(msg)
+ return get_num_of_messages_from_pylint_file(output_dir + '/pylint_report.html')
+
+
+def pylint_errors(target, output_dir):
+ # this ignores rcfile?
+ cmd = ['pylint', '--errors-only', '--rcfile=tools/pylintrc.txt', '--output-format=html',
+ '--ignore=.svn']
+ cmd = cmd + [target]
+ # result
+ ensure_dir(output_dir)
+ output_file = open(output_dir + '/pylint_errors_report.html', 'w')
+ # Path to the directory where the persistent for the run will be stored.
+ env = os.environ.copy()
+ env['PYLINTHOME'] = output_dir
+ proc = Popen(cmd, stdout=output_file, env=env)
+ ret = proc.wait()
+ if ret == 32:
+ raise RuntimeError("pylint usage error")
+ elif ret & 1:
+ cmd = ['pylint', '--rcfile=tools/pylintrc.txt', '--ignore=.svn']
+ cmd = cmd + [target]
+ proc = Popen(cmd, stdout=PIPE, env=env)
+ stdout, stderr = proc.communicate()
+ pylint_status = "pylint fatal message was issued and prevented pytlint from working"
+ msg = "{target}: {stat}\n{o}".format(stat=pylint_status, target=target, o=stdout)
+ raise RuntimeError(msg)
+ return get_num_of_messages_from_pylint_file(output_dir + '/pylint_errors_report.html')
+
+
+def remove_absolute_path_from_pep8(txt_file):
+ txt = open(txt_file, 'r')
+ content = txt.read()
+ txt.close()
+
+ # this would need to be more sophisticated for being crossplatform
+ # and to be a general function
+ gisbase = os.environ['GISBASE']
+ assert gisbase
+ exp = re.compile('%s/?' % (gisbase))
+ content = exp.sub('', content)
+
+ txt = open(txt_file, 'w')
+ txt.write(content)
+ txt.close()
+
+
+def get_num_of_messages_from_pep8_file(txt_file):
+ count = 0
+ txt = open(txt_file, 'r')
+ exp = re.compile(r'^.+.py:[0-9]+: \[[EW][0-9]{1,3}\] .+$')
+ for line in txt.readlines():
+ if exp.match(line):
+ count += 1
+ txt.close()
+ return count
+
+
+def get_num_of_messages_from_pylint_file(html_file):
+ count = 0
+ txt = open(html_file, 'r')
+ exp = re.compile(r'<td>(error|warning|refactor|convention)</td>')
+ for line in txt.readlines():
+ if exp.match(line):
+ count += 1
+ #print count, line, re.template
+ txt.close()
+ return count
+
+
+def pep8txt_to_html(txt_file, html_file):
+ txt = open(txt_file, 'r')
+ html = open(html_file, 'w')
+ html.write('<html><body>')
+ html.write('<pre>')
+ html.write(txt.read())
+ html.write('</pre>')
+ html.write('</body></html>')
+ txt.close()
+ html.close()
+
+
+def pep8(target, output_dir):
+ cmd = ['pep8', '--config=tools/pep8config.txt', '--format=pylint']
+ cmd = cmd + [target]
+ # result
+ ensure_dir(output_dir)
+ output_file = open(output_dir + '/pep8_report.txt', 'w')
+ # Path to the directory where the persistent for the run will be stored.
+ env = os.environ.copy()
+ proc = Popen(cmd, stdout=output_file, env=env)
+ proc.wait()
+ # pep8 always returns 1 when some error occurred
+ output_file.close()
+ remove_absolute_path_from_pep8(output_dir + '/pep8_report.txt')
+ pep8txt_to_html(output_dir + '/pep8_report.txt', output_dir + '/pep8_report.html')
+ return get_num_of_messages_from_pep8_file(output_dir + '/pep8_report.txt')
+
+
+def main():
+ gisbase = os.environ['GISBASE']
+ ensure_dir('pylint_report')
+
+ main_index = open('pylint_report/index.html', 'w')
+
+ # a lot of special treatment is needed to get packages nicely shown
+
+ grass_packages = ['script', 'pygrass', 'temporal']
+ # not included: 'imaging', 'pydispatch', 'lib'
+ ensure_dir('pylint_report/grass')
+ index = open('pylint_report/grass/index.html', 'w')
+ for package in grass_packages:
+ num_pylint = pylint('grass.' + package, 'pylint_report/grass/' + package)
+ num_errors = pylint_errors('grass.' + package, 'pylint_report/grass/' + package)
+ num_pep8 = pep8(gisbase + '/etc/python/grass/' + package, 'pylint_report/grass/' + package)
+ index.write('{pkg}'.format(pkg=package))
+ index.write(' <a href="{pkg}/pylint_report.html">pylint</a> ({num})'.format(pkg=package, num=num_pylint))
+ index.write(' <a href="{pkg}/pylint_errors_report.html">pylint errors only</a> ({num})'.format(pkg=package, num=num_errors))
+ index.write(' <a href="{pkg}/pep8_report.html">pep8</a> ({num})<br>'.format(pkg=package, num=num_pep8))
+ index.close()
+ main_index.write('<a href="grass/index.html">grass</a><br>'.format(pkg=package))
+
+ dirlist = os.listdir(gisbase + '/gui/wxpython')
+ packages = []
+ directories = []
+ for f in dirlist:
+ if os.path.isdir('gui/wxpython/' + f):
+ if os.path.isfile('gui/wxpython/' + f + '/__init__.py'):
+ packages.append(f)
+ else:
+ directories.append(f)
+
+ # this is generated but not used
+ modules = [f for f in dirlist if f.endswith('.py')]
+ subdirs_with_modules = {}
+ for d in directories:
+ subdirlist = os.listdir(gisbase + '/gui/wxpython/' + d)
+ subdir_modules = [f for f in dirlist if os.path.isfile(gisbase + '/gui/wxpython/' + d + '/' + f) and f.endswith('.py')]
+ if subdir_modules:
+ subdirs_with_modules[d] = subdir_modules
+
+ grass_wxgui_package = ['gui']
+ ensure_dir('pylint_report/gui/wxpython')
+ gui_dir = gisbase + '/gui/wxpython/'
+ index = open('pylint_report/gui/wxpython/index.html', 'w')
+ for package in packages:
+ num_pylint = pylint(gui_dir + package, 'pylint_report/gui/wxpython/' + package)
+ num_errors = pylint_errors(gui_dir + package, 'pylint_report/gui/wxpython/' + package)
+ num_pep8 = pep8(gisbase + '/gui/wxpython/' + package, 'pylint_report/gui/wxpython/' + package)
+ index.write('{pkg}'.format(pkg=package))
+ index.write(' <a href="{pkg}/pylint_report.html">pylint</a> ({num})'.format(pkg=package, num=num_pylint))
+ index.write(' <a href="{pkg}/pylint_errors_report.html">pylint errors only</a> ({num})'.format(pkg=package, num=num_errors))
+ index.write(' <a href="{pkg}/pep8_report.html">pep8</a> ({num})<br>'.format(pkg=package, num=num_pep8))
+ index.close()
+ main_index.write('<a href="gui/wxpython/index.html">GRASS wxGUI</a><br>'.format(pkg=package))
+
+ #pylint(grass_wxgui_packages_path, 'pylint_report/gui/scripts')
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
More information about the grass-commit
mailing list