diff -r 7685cec9fd3c -r f2ddfa555b0f doc/api/python/integration.quality-pysrc.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/python/integration.quality-pysrc.html Fri Sep 11 11:54:49 2009 +0100 @@ -0,0 +1,888 @@ + + + + + integration.quality + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Package integration :: + Module quality + + + + + + +
[hide private]
[frames] | no frames]
+
+

Source Code for Module integration.quality

+
+  1  #============================================================================  
+  2  #Name        : quality.py  
+  3  #Part of     : Helium  
+  4   
+  5  #Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+  6  #All rights reserved. 
+  7  #This component and the accompanying materials are made available 
+  8  #under the terms of the License "Eclipse Public License v1.0" 
+  9  #which accompanies this distribution, and is available 
+ 10  #at the URL "http://www.eclipse.org/legal/epl-v10.html". 
+ 11  # 
+ 12  #Initial Contributors: 
+ 13  #Nokia Corporation - initial contribution. 
+ 14  # 
+ 15  #Contributors: 
+ 16  # 
+ 17  #Description: 
+ 18  #=============================================================================== 
+ 19   
+ 20  """ 
+ 21  Symbian log based analyser. 
+ 22   
+ 23   * Internal export parser 
+ 24   * Duplicate generation parser (relying on abld -what) 
+ 25   
+ 26  Policy validation. 
+ 27  """ 
+ 28   
+ 29  import symbian.log 
+ 30  import re 
+ 31  import os 
+ 32  import sys 
+ 33  import csv 
+ 34  import fileutils 
+ 35  import pathaddition.match 
+ 36  import logging 
+ 37   
+ 38  #logging.basicConfig(level=logging.DEBUG) 
+ 39  _logger = logging.getLogger("integration.quality") 
+ 40   
+
41 -class InternalExportParser(symbian.log.Parser): +
42 """ This class extends the Symbian log parser class and implement + 43 an "abld -what" analyser which detects file generated/exported inside + 44 the source tree. + 45 """ +
46 - def __init__(self, _file): +
47 """The constructor """ + 48 symbian.log.Parser.__init__(self, _file) + 49 self.__match_what = re.compile("abld(\.bat)?(\s+.*)*\s+-w(hat)?", re.I) + 50 self.internalexports = {} +
51 +
52 - def task(self, name, _cmd, _dir, content): +
53 """ Analyse task log. """ + 54 if self.__match_what.match(_cmd) != None: + 55 for line in content.splitlines(): + 56 if line.startswith(os.path.sep) \ + 57 and not os.path.normpath(line.strip().lower()).startswith(os.path.sep+"epoc32"+os.path.sep) \ + 58 and os.path.splitext(line.strip().lower())[1] != '': + 59 if name not in self.internalexports: + 60 self.internalexports[name] = [] + 61 self.internalexports[name].append(line) +
62 + 63 +
64 -class AbldWhatParser(symbian.log.Parser): +
65 """ This class extends the Symbian log parser class and implement + 66 an "abld -what" analyser which sort the generated files by component. + 67 """ +
68 - def __init__(self, _file): +
69 """The constructor """ + 70 symbian.log.Parser.__init__(self, _file) + 71 self.__match_what = re.compile(r"abld(\.bat)?(\s+.*)*\s+-w(hat)?", re.I) + 72 self.__match_cmaker_what = re.compile(r"cmaker(\.cmd)?(\s+.*)*\s+ACTION=what", re.I) + 73 self.files_per_component = {} + 74 self.components_per_file = {} +
75 +
76 - def task(self, name, _cmd, _dir, content): +
77 """ Analyse task log. """ + 78 if _cmd != None and self.__match_what.match(_cmd) != None: + 79 for line in content.splitlines(): + 80 line = line.strip() + 81 if not os.path.normpath(line).startswith(os.path.sep): + 82 continue + 83 # component per file + 84 if line.lower() not in self.components_per_file: + 85 self.components_per_file[line.lower()] = [] + 86 if name not in self.components_per_file[line.lower()]: + 87 self.components_per_file[line.lower()].append(name) + 88 + 89 # file per components + 90 if name not in self.files_per_component: + 91 self.files_per_component[name] = [] + 92 self.files_per_component[name].append(line) + 93 elif _cmd != None and self.__match_cmaker_what.match(_cmd) != None: + 94 for line in content.splitlines(): + 95 line = line.strip() + 96 if not line.startswith('"'): + 97 continue + 98 if not line.endswith('"'): + 99 continue +100 line = os.path.normpath(line.strip('"')).lower() +101 # component per file +102 if line not in self.components_per_file: +103 self.components_per_file[line] = [] +104 if name not in self.components_per_file[line]: +105 self.components_per_file[line].append(name) +106 +107 # file per components +108 if name not in self.files_per_component: +109 self.files_per_component[name] = [] +110 self.files_per_component[name].append(line) +
111 +112 +
113 -class PolicyValidator(object): +
114 """ Validate policy files on a hierarchy. """ +
115 - def __init__(self, policyfiles=None, csvfile=None, ignoreroot=False): +
116 """The constructor """ +117 if policyfiles is None: +118 policyfiles = ['distribution.policy.s60'] +119 self._policyfiles = policyfiles +120 self._ids = None +121 self._ignoreroot = ignoreroot +
122 +
123 - def load_policy_ids(self, csvfile): +
124 """ Load the icds from the CSV file. +125 report format by generating array: ['unknownstatus', value, description] +126 """ +127 self._ids = {} +128 reader = csv.reader(open(csvfile, "rU")) +129 for row in reader: +130 if re.match(r"^\s*\d+\s*$", row[0]): +131 self._ids[row[0]] = row +132 if row[1].lower() != "yes" and row[1].lower() != "no" and row[1].lower() != "bin": +133 yield ["unknownstatus", row[0], row[2]] +
134 +
135 - def validate_content(self, filename): +
136 """ Validating the policy file content. If it cannot be decoded, +137 it reports an 'invalidencoding'. +138 Case 'notinidlist': value is not defined under the id list. +139 """ +140 value = None +141 try: +142 value = fileutils.read_policy_content(filename) +143 except Exception: +144 yield ["invalidencoding", filename, None] +145 if value is not None: +146 if self._ids != None: +147 if value not in self._ids: +148 yield ["notinidlist", filename, value] +
149 +
150 - def find_policy(self, path): +
151 """ find the policy file under path using filenames under the list. """ +152 for filename in self._policyfiles: +153 if sys.platform != 'win32': +154 for f in os.listdir(path): +155 if f.lower() == filename.lower(): +156 return os.path.join(path, f) +157 if os.path.exists(os.path.join(path, filename)): +158 return os.path.join(path, filename) +159 return None +
160 +
161 - def validate(self, path): +
162 """ Return a list couple [errortype, location, policy]. +163 errortype: missing, invalidencoding, notinidlist . +164 missing: location is a directory. +165 otherwise the doggie policy file. +166 """ +167 path = os.path.normpath(path) +168 for dirpath, _, _ in os.walk(path): +169 # skipping the root +170 if dirpath == path and self._ignoreroot: +171 continue +172 # skip svn dirs +173 if pathaddition.match.ant_match(dirpath, "**/.svn/**"): +174 continue +175 # Skipping j2me content. Shouln't this be done differently? +176 if pathaddition.match.ant_match(dirpath, "**/j2me/**"): +177 continue +178 filename = self.find_policy(dirpath) +179 if filename != None: +180 for result in self.validate_content(filename): +181 yield result +182 else: +183 yield ['missing', dirpath, None] +
184 +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + +