def _parse(self, path): try: return TestData( source=abspath(path), include_suites=self.include_suites, warn_on_skipped=self.warn_on_skipped ) except DataError as err: raise DataError("Parsing '%s' failed: %s" % (path, unicode(err)))
def _parse(self, path): try: return TestData(source=abspath(path), include_suites=self.include_suites, extensions=self.extensions) except DataError as err: raise DataError("Parsing '%s' failed: %s" % (path, err.message))
def _parse(self, path): try: return TestData(source=abspath(path), include_suites=self.include_suites, warn_on_skipped=self.warn_on_skipped) except DataError as err: raise DataError("Parsing '%s' failed: %s" % (path, unicode(err)))
def _set_built_in_variables(self, settings): for name, value in [('${TEMPDIR}', abspath(tempfile.gettempdir())), ('${EXECDIR}', abspath('.')), ('${/}', os.sep), ('${:}', os.pathsep), ('${\\n}', os.linesep), ('${SPACE}', ' '), ('${True}', True), ('${False}', False), ('${None}', None), ('${null}', None), ('${OUTPUT_DIR}', settings.output_directory), ('${OUTPUT_FILE}', settings.output or 'NONE'), ('${REPORT_FILE}', settings.report or 'NONE'), ('${LOG_FILE}', settings.log or 'NONE'), ('${DEBUG_FILE}', settings.debug_file or 'NONE'), ('${LOG_LEVEL}', settings.log_level), ('${PREV_TEST_NAME}', ''), ('${PREV_TEST_STATUS}', ''), ('${PREV_TEST_MESSAGE}', '')]: self[name] = value
def _process_value(self, name, value): if name == 'ReRunFailed': return gather_failed_tests(value) if name == 'DeprecatedRunFailed': if value.upper() != 'NONE': LOGGER.warn('Option --runfailed is deprecated and will be ' 'removed in the future. Use --rerunfailed instead.') return gather_failed_tests(value) if name == 'DeprecatedMerge' and value is True: LOGGER.warn('Option --rerunmerge is deprecated and will be ' 'removed in the future. Use --merge instead.') if name == 'LogLevel': return self._process_log_level(value) if value == self._get_default_value(name): return value if name in ['Name', 'Doc', 'LogTitle', 'ReportTitle']: if name == 'Doc': value = self._escape_as_data(value) return value.replace('_', ' ') if name in ['Metadata', 'TagDoc']: if name == 'Metadata': value = [self._escape_as_data(v) for v in value] return [self._process_metadata_or_tagdoc(v) for v in value] if name in ['Include', 'Exclude']: return [self._format_tag_patterns(v) for v in value] if name in self._output_opts and (not value or value.upper() == 'NONE'): return None if name == 'OutputDir': return abspath(value) if name in ['MonitorWidth', 'MonitorColors', 'MonitorMarkers']: option = '--' + name.lower() LOGGER.warn("Option '%s' is deprecated. Use '%s' instead." % (option, option.replace('monitor', 'console'))) if name in ['SuiteStatLevel', 'MonitorWidth', 'ConsoleWidth']: return self._convert_to_positive_integer_or_default(name, value) if name == 'VariableFiles': return [split_args_from_name_or_path(item) for item in value] if name == 'ReportBackground': return self._process_report_background(value) if name == 'TagStatCombine': return [self._process_tag_stat_combine(v) for v in value] if name == 'TagStatLink': return [v for v in [self._process_tag_stat_link(v) for v in value] if v] if name == 'Randomize': return self._process_randomize_value(value) if name == 'RemoveKeywords': self._validate_remove_keywords(value) if name == 'FlattenKeywords': self._validate_flatten_keywords(value) return value
def _process_value(self, name, value): if name == 'ReRunFailed': return gather_failed_tests(value) if name == 'ReRunFailedSuites': return gather_failed_suites(value) if name == 'LogLevel': return self._process_log_level(value) if value == self._get_default_value(name): return value if name == 'Doc': return self._escape_as_data(value) if name in ['Metadata', 'TagDoc']: if name == 'Metadata': value = [self._escape_as_data(v) for v in value] return [self._process_metadata_or_tagdoc(v) for v in value] if name in ['Include', 'Exclude']: return [self._format_tag_patterns(v) for v in value] if name in self._output_opts and (not value or value.upper() == 'NONE'): return None if name == 'OutputDir': return abspath(value) if name in ['SuiteStatLevel', 'ConsoleWidth']: return self._convert_to_positive_integer_or_default(name, value) if name == 'VariableFiles': return [split_args_from_name_or_path(item) for item in value] if name == 'ReportBackground': return self._process_report_background(value) if name == 'TagStatCombine': return [self._process_tag_stat_combine(v) for v in value] if name == 'TagStatLink': return [ v for v in [self._process_tag_stat_link(v) for v in value] if v ] if name == 'Randomize': return self._process_randomize_value(value) if name == 'MaxErrorLines': return self._process_max_error_lines(value) if name == 'RemoveKeywords': self._validate_remove_keywords(value) if name == 'FlattenKeywords': self._validate_flatten_keywords(value) if name == 'WarnOnSkipped': with LOGGER.cache_only: LOGGER.warn("Option '--warnonskippedfiles' is deprecated and " "has no effect. Nowadays all skipped files are " "reported.") return value
def _get_output_file(self, option): """Returns path of the requested output file and creates needed dirs. `option` can be 'Output', 'Log', 'Report', 'XUnit' or 'DebugFile'. """ name = self._opts[option] if not name: return None if option == 'Log' and self._output_disabled(): self['Log'] = None LOGGER.error('Log file is not created if output.xml is disabled.') return None name = self._process_output_name(option, name) path = abspath(os.path.join(self['OutputDir'], name)) self._create_output_dir(os.path.dirname(path), option) return path
def _process_value(self, name, value): if name == 'ReRunFailed': return gather_failed_tests(value) if name == 'ReRunFailedSuites': return gather_failed_suites(value) if name == 'LogLevel': return self._process_log_level(value) if value == self._get_default_value(name): return value if name == 'Doc': return self._escape_as_data(value) if name in ['Metadata', 'TagDoc']: if name == 'Metadata': value = [self._escape_as_data(v) for v in value] return [self._process_metadata_or_tagdoc(v) for v in value] if name in ['Include', 'Exclude']: return [self._format_tag_patterns(v) for v in value] if name in self._output_opts and (not value or value.upper() == 'NONE'): return None if name == 'OutputDir': return abspath(value) if name in ['SuiteStatLevel', 'ConsoleWidth']: return self._convert_to_positive_integer_or_default(name, value) if name == 'VariableFiles': return [split_args_from_name_or_path(item) for item in value] if name == 'ReportBackground': return self._process_report_background(value) if name == 'TagStatCombine': return [self._process_tag_stat_combine(v) for v in value] if name == 'TagStatLink': return [v for v in [self._process_tag_stat_link(v) for v in value] if v] if name == 'Randomize': return self._process_randomize_value(value) if name == 'MaxErrorLines': return self._process_max_error_lines(value) if name == 'RemoveKeywords': self._validate_remove_keywords(value) if name == 'FlattenKeywords': self._validate_flatten_keywords(value) if name == 'WarnOnSkipped': with LOGGER.cache_only: LOGGER.warn("Option '--warnonskippedfiles' is deprecated and " "has no effect. Nowadays all skipped files are " "reported.") return value
def main(self, datasources, title=None, **options): outfile = abspath(datasources.pop()) suite = TestSuiteFactory(datasources, **options) self._write_test_doc(suite, outfile, title) self.console(outfile)
class _BaseSettings(object): _cli_opts = {'Name' : ('name', None), 'Doc' : ('doc', None), 'Metadata' : ('metadata', []), 'TestNames' : ('test', []), 'ReRunFailed' : ('rerunfailed', 'NONE'), 'DeprecatedRunFailed': ('runfailed', 'NONE'), # TODO: Remove in RF 3.0 'SuiteNames' : ('suite', []), 'SetTag' : ('settag', []), 'Include' : ('include', []), 'Exclude' : ('exclude', []), 'Critical' : ('critical', None), 'NonCritical' : ('noncritical', None), 'OutputDir' : ('outputdir', abspath('.')), 'Log' : ('log', 'log.html'), 'Report' : ('report', 'report.html'), 'XUnit' : ('xunit', None), 'SplitLog' : ('splitlog', False), 'TimestampOutputs' : ('timestampoutputs', False), 'LogTitle' : ('logtitle', None), 'ReportTitle' : ('reporttitle', None), 'ReportBackground' : ('reportbackground', ('#9e9', '#9e9', '#f66')), 'SuiteStatLevel' : ('suitestatlevel', -1), 'TagStatInclude' : ('tagstatinclude', []), 'TagStatExclude' : ('tagstatexclude', []), 'TagStatCombine' : ('tagstatcombine', []), 'TagDoc' : ('tagdoc', []), 'TagStatLink' : ('tagstatlink', []), 'RemoveKeywords' : ('removekeywords', []), 'FlattenKeywords' : ('flattenkeywords', []), 'PreRebotModifiers': ('prerebotmodifier', []), 'StatusRC' : ('statusrc', True), 'ConsoleColors' : ('consolecolors', 'AUTO'), 'MonitorColors' : ('monitorcolors', None), # TODO: Remove in RF 3.0 'StdOut' : ('stdout', None), 'StdErr' : ('stderr', None), 'XUnitSkipNonCritical' : ('xunitskipnoncritical', False)} _output_opts = ['Output', 'Log', 'Report', 'XUnit', 'DebugFile'] def __init__(self, options=None, **extra_options): self.start_timestamp = format_time(time.time(), '', '-', '') self._opts = {} self._cli_opts = self._cli_opts.copy() self._cli_opts.update(self._extra_cli_opts) self._process_cli_opts(dict(options or {}, **extra_options)) def _process_cli_opts(self, opts): for name, (cli_name, default) in self._cli_opts.items(): value = opts[cli_name] if cli_name in opts else default if default == [] and not is_list_like(value): value = [value] self[name] = self._process_value(name, value) self['TestNames'] += self['ReRunFailed'] or self['DeprecatedRunFailed'] def __setitem__(self, name, value): if name not in self._cli_opts: raise KeyError("Non-existing settings '%s'" % name) self._opts[name] = value def _process_value(self, name, value): if name == 'ReRunFailed': return gather_failed_tests(value) if name == 'DeprecatedRunFailed': if value.upper() != 'NONE': LOGGER.warn('Option --runfailed is deprecated and will be ' 'removed in the future. Use --rerunfailed instead.') return gather_failed_tests(value) if name == 'DeprecatedMerge' and value is True: LOGGER.warn('Option --rerunmerge is deprecated and will be ' 'removed in the future. Use --merge instead.') if name == 'LogLevel': return self._process_log_level(value) if value == self._get_default_value(name): return value if name in ['Name', 'Doc', 'LogTitle', 'ReportTitle']: if name == 'Doc': value = self._escape_as_data(value) return value.replace('_', ' ') if name in ['Metadata', 'TagDoc']: if name == 'Metadata': value = [self._escape_as_data(v) for v in value] return [self._process_metadata_or_tagdoc(v) for v in value] if name in ['Include', 'Exclude']: return [self._format_tag_patterns(v) for v in value] if name in self._output_opts and (not value or value.upper() == 'NONE'): return None if name == 'OutputDir': return abspath(value) if name in ['MonitorWidth', 'MonitorColors', 'MonitorMarkers']: option = '--' + name.lower() LOGGER.warn("Option '%s' is deprecated. Use '%s' instead." % (option, option.replace('monitor', 'console'))) if name in ['SuiteStatLevel', 'MonitorWidth', 'ConsoleWidth']: return self._convert_to_positive_integer_or_default(name, value) if name == 'VariableFiles': return [split_args_from_name_or_path(item) for item in value] if name == 'ReportBackground': return self._process_report_background(value) if name == 'TagStatCombine': return [self._process_tag_stat_combine(v) for v in value] if name == 'TagStatLink': return [v for v in [self._process_tag_stat_link(v) for v in value] if v] if name == 'Randomize': return self._process_randomize_value(value) if name == 'RemoveKeywords': self._validate_remove_keywords(value) if name == 'FlattenKeywords': self._validate_flatten_keywords(value) return value def _escape_as_data(self, value): return value def _process_log_level(self, level): level, visible_level = self._split_log_level(level.upper()) self._opts['VisibleLogLevel'] = visible_level return level def _split_log_level(self, level): if ':' in level: level, visible_level = level.split(':', 1) else: visible_level = level self._validate_log_level_and_default(level, visible_level) return level, visible_level def _validate_log_level_and_default(self, log_level, default): if log_level not in loggerhelper.LEVELS: raise DataError("Invalid log level '%s'" % log_level) if default not in loggerhelper.LEVELS: raise DataError("Invalid log level '%s'" % default) if not loggerhelper.IsLogged(log_level)(default): raise DataError("Default visible log level '%s' is lower than " "log level '%s'" % (default, log_level)) def _process_randomize_value(self, original): value = original.lower() if ':' in value: value, seed = value.split(':', 1) else: seed = random.randint(0, sys.maxint) if value in ('test', 'suite'): value += 's' if value not in ('tests', 'suites', 'none', 'all'): self._raise_invalid_option_value('--randomize', original) try: seed = int(seed) except ValueError: self._raise_invalid_option_value('--randomize', original) return value, seed def _raise_invalid_option_value(self, option_name, given_value): raise DataError("Option '%s' does not support value '%s'." % (option_name, given_value)) def __getitem__(self, name): if name not in self._opts: raise KeyError("Non-existing setting '%s'" % name) if name in self._output_opts: return self._get_output_file(name) return self._opts[name] def _get_output_file(self, option): """Returns path of the requested output file and creates needed dirs. `option` can be 'Output', 'Log', 'Report', 'XUnit' or 'DebugFile'. """ name = self._opts[option] if not name: return None if option == 'Log' and self._output_disabled(): self['Log'] = None LOGGER.error('Log file is not created if output.xml is disabled.') return None name = self._process_output_name(option, name) path = abspath(os.path.join(self['OutputDir'], name)) self._create_output_dir(os.path.dirname(path), option) return path def _process_output_name(self, option, name): base, ext = os.path.splitext(name) if self['TimestampOutputs']: base = '%s-%s' % (base, self.start_timestamp) ext = self._get_output_extension(ext, option) return base + ext def _get_output_extension(self, ext, type_): if ext != '': return ext if type_ in ['Output', 'XUnit']: return '.xml' if type_ in ['Log', 'Report']: return '.html' if type_ == 'DebugFile': return '.txt' raise FrameworkError("Invalid output file type: %s" % type_) def _create_output_dir(self, path, type_): try: if not os.path.exists(path): os.makedirs(path) except EnvironmentError as err: raise DataError("Creating %s file directory '%s' failed: %s" % (type_.lower(), path, err.strerror)) def _process_metadata_or_tagdoc(self, value): value = value.replace('_', ' ') if ':' in value: return value.split(':', 1) return value, '' def _process_report_background(self, colors): if colors.count(':') not in [1, 2]: raise DataError("Invalid report background colors '%s'." % colors) colors = colors.split(':') if len(colors) == 2: return colors[0], colors[0], colors[1] return tuple(colors) def _process_tag_stat_combine(self, pattern): if ':' in pattern: pattern, title = pattern.rsplit(':', 1) else: title = '' return self._format_tag_patterns(pattern), title.replace('_', ' ') def _format_tag_patterns(self, pattern): for search, replace in [('&', 'AND'), ('AND', ' AND '), ('OR', ' OR '), ('NOT', ' NOT '), ('_', ' ')]: if search in pattern: pattern = pattern.replace(search, replace) while ' ' in pattern: pattern = pattern.replace(' ', ' ') if pattern.startswith(' NOT'): pattern = pattern[1:] return pattern def _process_tag_stat_link(self, value): tokens = value.split(':') if len(tokens) >= 3: return tokens[0], ':'.join(tokens[1:-1]), tokens[-1] raise DataError("Invalid format for option '--tagstatlink'. " "Expected 'tag:link:title' but got '%s'." % value) def _convert_to_positive_integer_or_default(self, name, value): value = self._convert_to_integer(name, value) return value if value > 0 else self._get_default_value(name) def _convert_to_integer(self, name, value): try: return int(value) except ValueError: raise DataError("Option '--%s' expected integer value but got '%s'." % (name.lower(), value)) def _get_default_value(self, name): return self._cli_opts[name][1] def _validate_remove_keywords(self, values): for value in values: try: KeywordRemover(value) except DataError as err: raise DataError("Invalid value for option '--removekeywords'. %s" % err) def _validate_flatten_keywords(self, values): try: validate_flatten_keyword(values) except DataError as err: raise DataError("Invalid value for option '--flattenkeywords'. %s" % err) def __contains__(self, setting): return setting in self._cli_opts def __unicode__(self): return '\n'.join('%s: %s' % (name, self._opts[name]) for name in sorted(self._opts)) @property def output_directory(self): return self['OutputDir'] @property def output(self): return self['Output'] @property def log(self): return self['Log'] @property def report(self): return self['Report'] @property def xunit(self): return self['XUnit'] @property def log_level(self): return self['LogLevel'] @property def split_log(self): return self['SplitLog'] @property def status_rc(self): return self['StatusRC'] @property def xunit_skip_noncritical(self): return self['XUnitSkipNonCritical'] @property def statistics_config(self): return { 'suite_stat_level': self['SuiteStatLevel'], 'tag_stat_include': self['TagStatInclude'], 'tag_stat_exclude': self['TagStatExclude'], 'tag_stat_combine': self['TagStatCombine'], 'tag_stat_link': self['TagStatLink'], 'tag_doc': self['TagDoc'], } @property def critical_tags(self): return self['Critical'] @property def non_critical_tags(self): return self['NonCritical'] @property def remove_keywords(self): return self['RemoveKeywords'] @property def flatten_keywords(self): return self['FlattenKeywords'] @property def pre_rebot_modifiers(self): return self['PreRebotModifiers'] @property def console_colors(self): return self['MonitorColors'] or self['ConsoleColors']
def __init__(self, parent=None, source=None): self.parent = parent self.source = abspath(source) if source else None self.children = [] self._tables = dict(self._get_tables())
def _validate_screenshot_path(self, path): path = utils.abspath(self._norm_path(path)) if not os.path.exists(os.path.dirname(path)): raise RuntimeError("Directory '%s' where to save the screenshot " "does not exist" % os.path.dirname(path)) return path
window = gdk.get_default_root_window() if not window: raise RuntimeError('Taking screenshot failed') width, height = window.get_size() pb = gdk.Pixbuf(gdk.COLORSPACE_RGB, False, 8, width, height) pb = pb.get_from_drawable(window, window.get_colormap(), 0, 0, 0, 0, width, height) if not pb: raise RuntimeError('Taking screenshot failed') pb.save(path, 'jpeg') def _pil_screenshot(self, path): ImageGrab.grab().save(path, 'JPEG') def _no_screenshot(self, path): raise RuntimeError('Taking screenshots is not supported on this platform ' 'by default. See library documentation for details.') if __name__ == "__main__": if len(sys.argv) not in [2, 3]: sys.exit("Usage: %s <path> [wx|gtk|pil] OR test [<path>]" % os.path.basename(sys.argv[0])) if sys.argv[1] == 'test': sys.exit(0 if ScreenshotTaker().test(*sys.argv[2:]) else 1) path = utils.abspath(sys.argv[1]) module = sys.argv[2] if len(sys.argv) == 3 else None shooter = ScreenshotTaker(module) print 'Using %s modules' % shooter.module shooter(path) print path
raise RuntimeError('Taking screenshot failed') width, height = window.get_size() pb = gdk.Pixbuf(gdk.COLORSPACE_RGB, False, 8, width, height) pb = pb.get_from_drawable(window, window.get_colormap(), 0, 0, 0, 0, width, height) if not pb: raise RuntimeError('Taking screenshot failed') pb.save(path, 'jpeg') def _pil_screenshot(self, path): ImageGrab.grab().save(path, 'JPEG') def _no_screenshot(self, path): raise RuntimeError( 'Taking screenshots is not supported on this platform ' 'by default. See library documentation for details.') if __name__ == "__main__": if len(sys.argv) not in [2, 3]: sys.exit("Usage: %s <path> [wx|gtk|pil] OR test [<path>]" % os.path.basename(sys.argv[0])) if sys.argv[1] == 'test': sys.exit(0 if ScreenshotTaker().test(*sys.argv[2:]) else 1) path = utils.abspath(sys.argv[1]) module = sys.argv[2] if len(sys.argv) == 3 else None shooter = ScreenshotTaker(module) print 'Using %s modules' % shooter.module shooter(path) print path
def _get_cwd(self, cwd): if cwd: return cwd.replace('/', os.sep) return abspath('.')