odoo/addons/base_module_quality/terp_test/terp_test.py

148 lines
7.5 KiB
Python

# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import os
import re
import tools
from tools.translate import _
from base_module_quality import base_module_quality
class quality_test(base_module_quality.abstract_quality_check):
def __init__(self):
super(quality_test, self).__init__()
self.name = _("Terp Test")
self.note = _("This test checks if the module satisfies the current coding standard used by OpenERP.")
self.bool_installed_only = False
self.no_terp = False
self.ponderation = 2
return None
def run_test_terp(self, cr, uid, module_path):
list_files = os.listdir(module_path)
current_module = module_path.split('/')[-1]
for i in list_files:
path = os.path.join(module_path, i)
if os.path.isdir(path):
for j in os.listdir(path):
list_files.append(os.path.join(i, j))
score = 1.0
feel_good_factor = 0
feel_bad_factor = 0
if '__openerp__.py' not in list_files:
self.no_terp = True
self.result += _("The module does not contain the __openerp__.py file")
return None
result_dict = {}
result_dict1 = {}
terp_file = os.path.join(module_path,'__openerp__.py')
res = eval(tools.file_open(terp_file).read())
terp_keys = ['category', 'name', 'description', 'author', 'website', 'update_xml', 'init_xml', 'depends', 'version', 'active', 'installable', 'demo_xml']
for key in terp_keys:
if key in res:
feel_good_factor += 1 # each tag should appear
if isinstance(res[key], (str, unicode, list)):
if not res[key]:
if key in ['description', 'author', 'website', 'category', 'version']:
data = "Module's terp file has no information about " + key + " tag"
result_dict1[key] = [key, data]
elif key in ['name', 'depends']:
data = "Module's terp file has no information about " + key + " tag"
result_dict1[key] = [key, data]
elif key == 'update_xml':
data = " Module update_xml tag is empty it shows that you do not have any views,wizard,workflow"
result_dict1[key] = [key, data]
elif key == 'demo_xml':
data = 'Module demo_xml tag is empty it shows that you do not have any demo data '
result_dict1[key] = [key, data]
feel_bad_factor += 1
else:
flag = False
if key == 'description' and len(str(res[key])) >= 150: # no. of chars should be >=150
feel_good_factor += 1
flag = True
if res['description'].count('\n') >= 4:# description contains minimum 5 lines
feel_good_factor += 1
flag = True
if not flag and key == 'description':
result_dict[key] = [key, 'Description of the module in terp is not enough, you must describe your module enough because good description is the beginning of a good documentation. And a good documentation limits the support requests.']
if key == 'website':
ptrn = re.compile('[https?://]?[\w\.:]+[\w /:]+$') # reg ex matching on temporary basis.Website is correctly formatted
result = ptrn.search(str(res[key]))
if result:
feel_good_factor += 1
else:
result_dict[key] = [key, 'Website tag of terp file should be in valid format or it should be lead to valid page']
feel_bad_factor += 1
if isinstance(res[key], bool):
if key == 'active':
if current_module != 'base':
if res[key]:
feel_bad_factor += 1
result_dict[key] = [key, 'Active tag of terp file should not be set to True!']
else:
if not res[key]:
result_dict[key] = [key, 'Active tag of terp file of base module should be set to True!']
feel_bad_factor += 1
if key == 'installable' and not res[key]: # installable tag is provided and False
result_dict[key] = [key, 'Installable tag of terp file of module should be set to True so that it can install on client!']
feel_bad_factor += 1
else:
feel_bad_factor += 1
result_dict1[key] = [key, "Tag is missing!"]
if result_dict1 or result_dict1:
score = round((feel_good_factor) / float(feel_good_factor + feel_bad_factor), 2)
self.result_details += self.get_result_details(result_dict)
self.result_details += self.get_result_details(result_dict1)
return [_('__openerp__.py file'), score]
def run_test(self, cr, uid, module_path):
terp_score = self.run_test_terp(cr, uid, module_path)
self.score = terp_score and terp_score[1] or 0.0
if self.score*100 < self.min_score:
self.message = 'Score is below than minimal score(%s%%)' % self.min_score
if terp_score:
self.result = self.get_result({'__openerp__.py': terp_score})
return None
def get_result(self, dict_terp):
header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-10s \n', [_('Object Name'), _('Result (/1)')])
if not self.error:
return self.format_table(header, data_list=dict_terp)
return ""
def get_result_details(self, dict_terp):
if dict_terp:
str_html = '''<html><head>%s</head><body><table class="tablestyle">'''%(self.get_style())
header = ('<tr><th class="tdatastyle">%s</th><th class="tdatastyle">%s</th></tr>', [_('Tag Name'), _('Feed back About terp file of Module')])
if not self.error:
res = str_html + self.format_html_table(header, data_list=dict_terp) + '</table><newline/></body></html>'
res = res.replace('''<td''', '''<td class="tdatastyle" ''')
return res
return ""
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: