def _get_python_thrift_library_sources(self, py_thrift_targets): """Get file contents for python thrift library targets.""" target_snapshots = OrderedDict( (t, t.sources_snapshot( scheduler=self.context._scheduler).directory_digest) for t in py_thrift_targets) filescontent_by_target = OrderedDict( zip( target_snapshots.keys(), self.context._scheduler.product_request( FilesContent, target_snapshots.values()))) thrift_file_sources_by_target = OrderedDict( (t, [(file_content.path, file_content.content) for file_content in all_content.dependencies]) for t, all_content in filescontent_by_target.items()) return thrift_file_sources_by_target
def _run_pytest(self, fail_fast, test_targets, workdirs): if not test_targets: return PytestResult.rc(0) # Absolute path to chrooted test file -> Path to original test file relative to the buildroot. sources_map = OrderedDict() for t in test_targets: for p in t.sources_relative_to_source_root(): sources_map[os.path.join(self._source_chroot_path, p)] = os.path.join(t.target_base, p) if not sources_map: return PytestResult.rc(0) with self._test_runner(workdirs, test_targets, sources_map) as (pytest_binary, test_args, get_pytest_rootdir): # Validate that the user didn't provide any passthru args that conflict # with those we must set ourselves. for arg in self.get_passthru_args(): if arg.startswith('--junitxml') or arg.startswith( '--confcutdir'): raise TaskError( 'Cannot pass this arg through to pytest: {}'.format( arg)) junitxml_path = workdirs.junitxml_path(*test_targets) # N.B. the `--confcutdir` here instructs pytest to stop scanning for conftest.py files at the # top of the buildroot. This prevents conftest.py files from outside (e.g. in users home dirs) # from leaking into pants test runs. See: https://github.com/pantsbuild/pants/issues/2726 args = [ '-c', pytest_binary.config_path, '--junitxml', junitxml_path, '--confcutdir', get_buildroot(), '--continue-on-collection-errors' ] if fail_fast: args.extend(['-x']) if self._debug: args.extend(['-s']) if self.get_options().colors: args.extend(['--color', 'yes']) if self.get_options().options: for opt in self.get_options().options: args.extend(safe_shlex_split(opt)) args.extend(self.get_passthru_args()) args.extend(test_args) args.extend(sources_map.keys()) # We want to ensure our reporting based off junit xml is from this run so kill results from # prior runs. if os.path.exists(junitxml_path): os.unlink(junitxml_path) with self._maybe_run_in_chroot(): result = self._do_run_tests_with_args(pytest_binary.pex, args) # There was a problem prior to test execution preventing junit xml file creation so just let # the failure result bubble. if not os.path.exists(junitxml_path): return result pytest_rootdir = get_pytest_rootdir() failed_targets = self._get_failed_targets_from_junitxml( junitxml_path, test_targets, pytest_rootdir) def parse_error_handler(parse_error): # Simple error handler to pass to xml parsing function. raise TaskError('Error parsing xml file at {}: {}'.format( parse_error.xml_path, parse_error.cause)) all_tests_info = self.parse_test_info( junitxml_path, parse_error_handler, ['file', 'name', 'classname']) for test_name, test_info in all_tests_info.items(): test_target = self._get_target_from_test( test_info, test_targets, pytest_rootdir) self.report_all_info_for_single_test(self.options_scope, test_target, test_name, test_info) return result.with_failed_targets(failed_targets)
def _run_pytest(self, fail_fast, test_targets, workdirs): if not test_targets: return PytestResult.rc(0) # Absolute path to chrooted test file -> Path to original test file relative to the buildroot. sources_map = OrderedDict() for t in test_targets: for p in t.sources_relative_to_source_root(): sources_map[os.path.join(self._source_chroot_path, p)] = os.path.join(t.target_base, p) if not sources_map: return PytestResult.rc(0) with self._test_runner(workdirs, test_targets, sources_map) as (pytest_binary, test_args, get_pytest_rootdir): # Validate that the user didn't provide any passthru args that conflict # with those we must set ourselves. for arg in self.get_passthru_args(): if arg.startswith('--junitxml') or arg.startswith('--confcutdir'): raise TaskError('Cannot pass this arg through to pytest: {}'.format(arg)) junitxml_path = workdirs.junitxml_path(*test_targets) # N.B. the `--confcutdir` here instructs pytest to stop scanning for conftest.py files at the # top of the buildroot. This prevents conftest.py files from outside (e.g. in users home dirs) # from leaking into pants test runs. See: https://github.com/pantsbuild/pants/issues/2726 args = ['-c', pytest_binary.config_path, '--junitxml', junitxml_path, '--confcutdir', get_buildroot(), '--continue-on-collection-errors'] if fail_fast: args.extend(['-x']) if self._debug: args.extend(['-s']) if self.get_options().colors: args.extend(['--color', 'yes']) if self.get_options().options: for opt in self.get_options().options: args.extend(safe_shlex_split(opt)) args.extend(self.get_passthru_args()) args.extend(test_args) args.extend(sources_map.keys()) # We want to ensure our reporting based off junit xml is from this run so kill results from # prior runs. if os.path.exists(junitxml_path): os.unlink(junitxml_path) with self._maybe_run_in_chroot(): result = self._do_run_tests_with_args(pytest_binary.pex, args) # There was a problem prior to test execution preventing junit xml file creation so just let # the failure result bubble. if not os.path.exists(junitxml_path): return result pytest_rootdir = get_pytest_rootdir() failed_targets = self._get_failed_targets_from_junitxml(junitxml_path, test_targets, pytest_rootdir) def parse_error_handler(parse_error): # Simple error handler to pass to xml parsing function. raise TaskError('Error parsing xml file at {}: {}' .format(parse_error.xml_path, parse_error.cause)) all_tests_info = self.parse_test_info(junitxml_path, parse_error_handler, ['file', 'name', 'classname']) for test_name, test_info in all_tests_info.items(): test_target = self._get_target_from_test(test_info, test_targets, pytest_rootdir) self.report_all_info_for_single_test(self.options_scope, test_target, test_name, test_info) return result.with_failed_targets(failed_targets)
return zippath TAR = TarArchiver('w:', 'tar') TGZ = TarArchiver('w:gz', 'tar.gz') TBZ2 = TarArchiver('w:bz2', 'tar.bz2') ZIP = ZipArchiver(ZIP_DEFLATED, 'zip') _ARCHIVER_BY_TYPE = OrderedDict(tar=TAR, tgz=TGZ, tbz2=TBZ2, zip=ZIP) archive_extensions = { name: archiver.extension for name, archiver in _ARCHIVER_BY_TYPE.items() } TYPE_NAMES = frozenset(_ARCHIVER_BY_TYPE.keys()) TYPE_NAMES_NO_PRESERVE_SYMLINKS = frozenset({'zip'}) TYPE_NAMES_PRESERVE_SYMLINKS = TYPE_NAMES - TYPE_NAMES_NO_PRESERVE_SYMLINKS def create_archiver(typename): """Returns Archivers in common configurations. :API: public The typename must correspond to one of the following: 'tar' Returns a tar archiver that applies no compression and emits .tar files. 'tgz' Returns a tar archiver that applies gzip compression and emits .tar.gz files. 'tbz2' Returns a tar archiver that applies bzip2 compression and emits .tar.bz2 files. 'zip' Returns a zip archiver that applies standard compression and emits .zip files. 'jar' Returns a jar archiver that applies no compression and emits .jar files.
TAR = TarArchiver('w:', 'tar') TGZ = TarArchiver('w:gz', 'tar.gz') TBZ2 = TarArchiver('w:bz2', 'tar.bz2') ZIP = ZipArchiver(ZIP_DEFLATED, 'zip') _ARCHIVER_BY_TYPE = OrderedDict( tar=TAR, tgz=TGZ, tbz2=TBZ2, zip=ZIP) archive_extensions = { name: archiver.extension for name, archiver in _ARCHIVER_BY_TYPE.items() } TYPE_NAMES = frozenset(_ARCHIVER_BY_TYPE.keys()) TYPE_NAMES_NO_PRESERVE_SYMLINKS = frozenset({'zip'}) TYPE_NAMES_PRESERVE_SYMLINKS = TYPE_NAMES - TYPE_NAMES_NO_PRESERVE_SYMLINKS def create_archiver(typename): """Returns Archivers in common configurations. :API: public The typename must correspond to one of the following: 'tar' Returns a tar archiver that applies no compression and emits .tar files. 'tgz' Returns a tar archiver that applies gzip compression and emits .tar.gz files. 'tbz2' Returns a tar archiver that applies bzip2 compression and emits .tar.bz2 files. 'zip' Returns a zip archiver that applies standard compression and emits .zip files. 'jar' Returns a jar archiver that applies no compression and emits .jar files.