class TagStatistics(object): """Container for tag statistics.""" def __init__(self, critical_stats, non_critical_stats, combined_stats): #: Dictionary, where key is the name of the tag as a string and value #: is an instance of :class:`~robot.model.stats.TagStat`. self.tags = NormalizedDict(ignore='_') #: List of :class:`~robot.model.stats.CriticalTagStat` objects. self.critical = critical_stats #: List of :class:`~robot.model.stats.CriticalTagStat` objects. self.non_critical = non_critical_stats #: List of :class:`~robot.model.stats.CombinedTagStat` objects. self.combined = combined_stats def visit(self, visitor): visitor.visit_tag_statistics(self) def __iter__(self): crits = self._get_critical_and_non_critical_matcher() tags = [t for t in self.tags.values() if t.name not in crits] return iter(sorted(chain(self.critical, self.non_critical, self.combined, tags))) def _get_critical_and_non_critical_matcher(self): crits = [stat for stat in self.critical + self.non_critical if isinstance(stat.pattern, SingleTagPattern)] return NormalizedDict([(unicode(stat.pattern), None) for stat in crits], ignore='_')
class TagStatistics(object): """Container for tag statistics. """ def __init__(self, combined_stats): #: Dictionary, where key is the name of the tag as a string and value #: is an instance of :class:`~robot.model.stats.TagStat`. self.tags = NormalizedDict(ignore=['_']) #: Dictionary, where key is the name of the created tag as a string # and value is an instance of :class:`~robot.model.stats.TagStat`. self.combined = combined_stats def visit(self, visitor): visitor.visit_tag_statistics(self) def __iter__(self): return iter(sorted(self.tags.values() + self.combined))
class TagStatistics(object): """Container for tag statistics. """ def __init__(self, combined_stats): #: Dictionary, where key is the name of the tag as a string and value #: is an instance of :class:`~robot.model.stats.TagStat`. self.tags = NormalizedDict(ignore=['_']) #: Dictionary, where key is the name of the created tag as a string # and value is an instance of :class:`~robot.model.stats.TagStat`. self.combined = combined_stats def visit(self, visitor): visitor.visit_tag_statistics(self) def __iter__(self): return iter(sorted(self.tags.values() + self.combined))
class HandlerStore(object): TEST_LIBRARY_TYPE = 'Test library' TEST_CASE_FILE_TYPE = 'Test case file' RESOURCE_FILE_TYPE = 'Resource file' def __init__(self, source, source_type): self.source = source self.source_type = source_type self._normal = NormalizedDict(ignore='_') self._embedded = [] def add(self, handler, embedded=False): if embedded: self._embedded.append(handler) elif handler.name not in self._normal: self._normal[handler.name] = handler else: error = DataError('Keyword with same name defined multiple times.') self._normal[handler.name] = UserErrorHandler(error, handler.name, handler.libname) raise error def __iter__(self): handlers = list(self._normal.values()) + self._embedded return iter(sorted(handlers, key=attrgetter('name'))) def __len__(self): return len(self._normal) + len(self._embedded) def __contains__(self, name): if name in self._normal: return True return any(template.matches(name) for template in self._embedded) def create_runner(self, name): return self[name].create_runner(name) def __getitem__(self, name): try: return self._normal[name] except KeyError: return self._find_embedded(name) def _find_embedded(self, name): embedded = [template for template in self._embedded if template.matches(name)] if len(embedded) == 1: return embedded[0] self._raise_no_single_match(name, embedded) def _raise_no_single_match(self, name, found): if self.source_type == self.TEST_CASE_FILE_TYPE: source = self.source_type else: source = "%s '%s'" % (self.source_type, self.source) if not found: raise KeywordError("%s contains no keywords matching name '%s'." % (source, name)) error = ["%s contains multiple keywords matching name '%s':" % (source, name)] names = sorted(handler.name for handler in found) raise KeywordError('\n '.join(error + names))
class HandlerStore(object): def __init__(self, source): self._source = source self._normal = NormalizedDict(ignore='_') self._embedded = [] def add(self, handler, embedded=False): if embedded: self._embedded.append(handler) else: self._normal[handler.name] = handler def remove(self, name): if name in self._normal: self._normal.pop(name) self._embedded = [e for e in self._embedded if not e.matches(name)] def __iter__(self): return iter(sorted(self._normal.values() + self._embedded, key=attrgetter('name'))) def __len__(self): return len(self._normal) + len(self._embedded) def __contains__(self, name): if name in self._normal: return True return any(template.matches(name) for template in self._embedded) def __getitem__(self, name): try: return self._normal[name] except KeyError: return self._find_embedded(name) def _find_embedded(self, name): embedded = [template.create(name) for template in self._embedded if template.matches(name)] if len(embedded) == 1: return embedded[0] self._raise_no_single_match(name, embedded) def _raise_no_single_match(self, name, found): if self._source is None: where = "Test case file" elif self._is_resource(self._source): where = "Resource file '%s'" % self._source else: where = "Test library '%s'" % self._source if not found: raise DataError("%s contains no keywords matching name '%s'." % (where, name)) error = ["%s contains multiple keywords matching name '%s':" % (where, name)] names = sorted(handler.orig_name for handler in found) raise DataError('\n '.join(error + names)) def _is_resource(self, source): extension = splitext(source)[1][1:].lower() return extension in RESOURCE_EXTENSIONS
class HandlerStore(object): TEST_LIBRARY_TYPE = 'Test library' TEST_CASE_FILE_TYPE = 'Test case file' RESOURCE_FILE_TYPE = 'Resource file' def __init__(self, source, source_type): self.source = source self.source_type = source_type self._normal = NormalizedDict(ignore='_') self._embedded = [] def add(self, handler, embedded=False): if embedded: self._embedded.append(handler) elif handler.name not in self._normal: self._normal[handler.name] = handler else: error = DataError('Keyword with same name defined multiple times.') self._normal[handler.name] = UserErrorHandler( error, handler.name, handler.libname) raise error def __iter__(self): handlers = list(self._normal.values()) + self._embedded return iter(sorted(handlers, key=attrgetter('name'))) def __len__(self): return len(self._normal) + len(self._embedded) def __contains__(self, name): if name in self._normal: return True return any(template.matches(name) for template in self._embedded) def create_runner(self, name): return self[name].create_runner(name) def __getitem__(self, name): try: return self._normal[name] except KeyError: return self._find_embedded(name) def _find_embedded(self, name): embedded = [ template for template in self._embedded if template.matches(name) ] if len(embedded) == 1: return embedded[0] self._raise_no_single_match(name, embedded) def _raise_no_single_match(self, name, found): if self.source_type == self.TEST_CASE_FILE_TYPE: source = self.source_type else: source = "%s '%s'" % (self.source_type, self.source) if not found: raise KeywordError("%s contains no keywords matching name '%s'." % (source, name)) error = [ "%s contains multiple keywords matching name '%s':" % (source, name) ] names = sorted(handler.name for handler in found) raise KeywordError('\n '.join(error + names))