| #!/usr/bin/python2.4 |
| # |
| # |
| # Copyright 2008, The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| import xml.dom.minidom |
| import xml.parsers |
| import os |
| |
| import logger |
| import errors |
| |
| class CoverageTargets: |
| """Accessor for the code coverage target xml file |
| Expects the following format: |
| <targets> |
| <target |
| name="" |
| type="JAVA_LIBRARIES|APPS" |
| build_path="" |
| |
| [<src path=""/>] (0..*) - These are relative to build_path. If missing, |
| assumes 'src' |
| >/target> |
| |
| TODO: add more format checking |
| """ |
| |
| _TARGET_TAG_NAME = 'coverage_target' |
| |
| def __init__(self, ): |
| self._target_map= {} |
| |
| def __iter__(self): |
| return iter(self._target_map.values()) |
| |
| def Parse(self, file_path): |
| """Parse the coverage target data from from given file path, and add it to |
| the current object |
| Args: |
| file_path: absolute file path to parse |
| Raises: |
| errors.ParseError if file_path cannot be parsed |
| """ |
| try: |
| doc = xml.dom.minidom.parse(file_path) |
| except IOError: |
| # Error: The results file does not exist |
| logger.Log('Results file %s does not exist' % file_path) |
| raise errors.ParseError |
| except xml.parsers.expat.ExpatError: |
| logger.Log('Error Parsing xml file: %s ' % file_path) |
| raise errors.ParseError |
| |
| target_elements = doc.getElementsByTagName(self._TARGET_TAG_NAME) |
| |
| for target_element in target_elements: |
| target = CoverageTarget(target_element) |
| self._AddTarget(target) |
| |
| def _AddTarget(self, target): |
| self._target_map[target.GetName()] = target |
| |
| def GetBuildTargets(self): |
| """ returns list of target names """ |
| build_targets = [] |
| for target in self: |
| build_targets.append(target.GetName()) |
| return build_targets |
| |
| def GetTargets(self): |
| """ returns list of CoverageTarget""" |
| return self._target_map.values() |
| |
| def GetTarget(self, name): |
| """ returns CoverageTarget for given name. None if not found """ |
| try: |
| return self._target_map[name] |
| except KeyError: |
| return None |
| |
| class CoverageTarget: |
| """ Represents one coverage target definition parsed from xml """ |
| |
| _NAME_ATTR = 'name' |
| _TYPE_ATTR = 'type' |
| _BUILD_ATTR = 'build_path' |
| _SRC_TAG = 'src' |
| _PATH_ATTR = 'path' |
| |
| def __init__(self, target_element): |
| self._name = target_element.getAttribute(self._NAME_ATTR) |
| self._type = target_element.getAttribute(self._TYPE_ATTR) |
| self._build_path = target_element.getAttribute(self._BUILD_ATTR) |
| self._paths = [] |
| self._ParsePaths(target_element) |
| |
| def GetName(self): |
| return self._name |
| |
| def GetPaths(self): |
| return self._paths |
| |
| def GetType(self): |
| return self._type |
| |
| def GetBuildPath(self): |
| return self._build_path |
| |
| def _ParsePaths(self, target_element): |
| src_elements = target_element.getElementsByTagName(self._SRC_TAG) |
| if len(src_elements) <= 0: |
| # no src tags specified. Assume build_path + src |
| self._paths.append(os.path.join(self.GetBuildPath(), "src")) |
| for src_element in src_elements: |
| rel_path = src_element.getAttribute(self._PATH_ATTR) |
| self._paths.append(os.path.join(self.GetBuildPath(), rel_path)) |
| |
| def Parse(xml_file_path): |
| """parses out a file_path class from given path to xml""" |
| targets = CoverageTargets() |
| targets.Parse(xml_file_path) |
| return targets |