From 730844755e4682daf62d62070bf478c9a93beaf4 Mon Sep 17 00:00:00 2001 From: "biao716.wang" Date: Sat, 19 Oct 2019 14:23:25 +0800 Subject: [PATCH] fix pylint issue for gbs Change-Id: Iba8d2014840fc9c57a99f2c410fd4f53f1e2fbf7 Signed-off-by: biao716.wang --- gitbuildsys/cmd_build.py | 12 ++++++------ gitbuildsys/cmd_changelog.py | 2 +- gitbuildsys/cmd_chroot.py | 2 +- gitbuildsys/cmd_depends.py | 4 ++-- gitbuildsys/cmd_devel.py | 2 +- gitbuildsys/cmd_export.py | 6 +++--- gitbuildsys/cmd_remotebuild.py | 12 ++++++------ gitbuildsys/cmd_submit.py | 6 +++--- gitbuildsys/conf.py | 20 ++++++++++---------- gitbuildsys/oscapi.py | 36 ++++++++++++++++++------------------ gitbuildsys/safe_url.py | 4 ++-- gitbuildsys/utils.py | 17 +++++++++-------- setup.py | 4 ++-- tests/test_config.py | 3 ++- tests/test_help.py | 6 +++--- tests/test_passwdx.py | 2 ++ tests/test_profile.py | 2 ++ tools/gbs | 4 ++-- 18 files changed, 75 insertions(+), 69 deletions(-) diff --git a/gitbuildsys/cmd_build.py b/gitbuildsys/cmd_build.py index b6641f5..bf17172 100644 --- a/gitbuildsys/cmd_build.py +++ b/gitbuildsys/cmd_build.py @@ -116,7 +116,7 @@ def get_binary_name_from_git(args, package_dirs): try: spec = rpm.SpecFile(spec_to_parse) - except GbpError, err: + except GbpError as err: raise GbsError('%s' % err) binary_list.append(spec.name) @@ -148,7 +148,7 @@ def prepare_repos_and_build_conf(args, arch, profile): log.warning('local repo: %s does not exist' % repo) continue opt_repo = SafeURL(repo) - except ValueError, err: + except ValueError as err: log.warning('Invalid repo %s: %s' % (repo, str(err))) else: repos.append(opt_repo) @@ -185,7 +185,7 @@ def prepare_repos_and_build_conf(args, arch, profile): % distconf) try: shutil.copy(buildconf, distconf) - except IOError, err: + except IOError as err: raise GbsError("Failed to copy build conf: %s" % (str(err))) if not os.path.exists(distconf): @@ -561,7 +561,7 @@ def prepare_depsbuild_source(gnmapper, profile, arch, pkgs, url, download_path): continue deps_path.append(gnmapper.get_gerritname_by_obsname(pkg)) - except OSCError, err: + except OSCError as err: raise GbsError(str(err)) sync_source(None, deps_path, url, download_path) @@ -636,7 +636,7 @@ def main(args): shutil.copy(buildconf, distconf) log.info('build conf has been downloaded at:\n %s' \ % distconf) - except IOError, err: + except IOError as err: raise GbsError("Failed to copy build conf: %s" % (str(err))) profile.buildconf = distconf @@ -663,7 +663,7 @@ def main(args): local_pkgs.append(pkg) else: log.error('package %s parse failed' %spec.name) - except GbpError, err: + except GbpError as err: log.warning('gbp parse spec failed. %s' % err) if args.full_build: diff --git a/gitbuildsys/cmd_changelog.py b/gitbuildsys/cmd_changelog.py index 0aae547..24914de 100644 --- a/gitbuildsys/cmd_changelog.py +++ b/gitbuildsys/cmd_changelog.py @@ -36,7 +36,7 @@ def main(args): try: repo = RpmGitRepository(args.gitdir) - except GitRepositoryError, err: + except GitRepositoryError as err: raise GbsError(str(err)) packaging_dir = get_packaging_dir(args) diff --git a/gitbuildsys/cmd_chroot.py b/gitbuildsys/cmd_chroot.py index 498f080..796e986 100644 --- a/gitbuildsys/cmd_chroot.py +++ b/gitbuildsys/cmd_chroot.py @@ -49,7 +49,7 @@ def main(args): build_env = os.environ build_env['PS1'] = "(tizen-build-env)@\h \W]\$ " subprocess.call(cmd, env=build_env) - except OSError, err: + except OSError as err: raise GbsError('failed to chroot to %s: %s' % (build_root, err)) except KeyboardInterrupt: log.info('keyboard interrupt ...') diff --git a/gitbuildsys/cmd_depends.py b/gitbuildsys/cmd_depends.py index 7b0443c..f67c6db 100644 --- a/gitbuildsys/cmd_depends.py +++ b/gitbuildsys/cmd_depends.py @@ -111,7 +111,7 @@ def prepare_repos_and_build_conf(args, arch, profile): log.warning('local repo: %s does not exist' % repo) continue opt_repo = SafeURL(repo) - except ValueError, err: + except ValueError as err: log.warning('Invalid repo %s: %s' % (repo, str(err))) else: repos.append(opt_repo) @@ -148,7 +148,7 @@ def prepare_repos_and_build_conf(args, arch, profile): % distconf) try: shutil.copy(buildconf, distconf) - except IOError, err: + except IOError as err: raise GbsError("Failed to copy build conf: %s" % (str(err))) if not os.path.exists(distconf): diff --git a/gitbuildsys/cmd_devel.py b/gitbuildsys/cmd_devel.py index 4f5d766..6ad0190 100644 --- a/gitbuildsys/cmd_devel.py +++ b/gitbuildsys/cmd_devel.py @@ -83,7 +83,7 @@ def main(args): try: repo = RpmGitRepository(args.gitdir) - except GitRepositoryError, err: + except GitRepositoryError as err: raise GbsError(str(err)) tmp = Temp(prefix='gbp_', dirn=configmgr.get('tmpdir', 'general'), diff --git a/gitbuildsys/cmd_export.py b/gitbuildsys/cmd_export.py index 0141f3e..3d22844 100644 --- a/gitbuildsys/cmd_export.py +++ b/gitbuildsys/cmd_export.py @@ -245,7 +245,7 @@ def export_sources(repo, commit, export_dir, spec, args, create_tarball=True): log.error(errmsg) if ret: raise GbsError("Failed to export packaging files from git tree") - except GitRepositoryError, excobj: + except GitRepositoryError as excobj: raise GbsError("Repository error: %s" % excobj) @@ -258,7 +258,7 @@ def main(args): workdir = args.gitdir try: repo = RpmGitRepository(workdir) - except GitRepositoryError, err: + except GitRepositoryError as err: raise GbsError(str(err)) log.debug("read repo path") utils.read_localconf(repo.path) @@ -324,7 +324,7 @@ def main(args): specfile = os.path.basename(main_spec) try: spec = rpm.SpecFile(os.path.join(export_dir, specfile)) - except GbpError, err: + except GbpError as err: raise GbsError('%s' % err) if not spec.name or not spec.version: diff --git a/gitbuildsys/cmd_remotebuild.py b/gitbuildsys/cmd_remotebuild.py index 0d612e1..887fca6 100644 --- a/gitbuildsys/cmd_remotebuild.py +++ b/gitbuildsys/cmd_remotebuild.py @@ -76,7 +76,7 @@ def main(args): try: repo = RpmGitRepository(args.gitdir) - except GitRepositoryError, err: + except GitRepositoryError as err: raise GbsError(str(err)) workdir = repo.path @@ -114,7 +114,7 @@ def main(args): # get 'name' and 'version' from spec file try: spec = gbp.rpm.SpecFile(spec_to_parse) - except GbpError, err: + except GbpError as err: raise GbsError('%s' % err) if not spec.name: @@ -175,7 +175,7 @@ def main(args): status[obs_repo][obs_arch])) log.info('build log for %s/%s/%s/%s' % (target_prj, package, obs_repo, obs_arch)) - print api.get_buildlog(target_prj, package, obs_repo, obs_arch) + print(api.get_buildlog(target_prj, package, obs_repo, obs_arch)) return 0 @@ -195,7 +195,7 @@ def main(args): log.info('no build results from build server') return 0 - except OSCError, err: + except OSCError as err: raise GbsError(str(err)) with utils.Workdir(workdir): @@ -203,7 +203,7 @@ def main(args): try: commit_msg = repo.get_commit_info(args.commit or 'HEAD')['subject'] - except GitRepositoryError, exc: + except GitRepositoryError as exc: raise GbsError('failed to get commit info: %s' % exc) files = glob.glob("%s/*" % exportdir) @@ -226,7 +226,7 @@ def main(args): api.create_package(target_prj, package) # new project - submitting all local files commit_files = files - except OSCError, err: + except OSCError as err: raise GbsError(str(err)) if not commit_files: diff --git a/gitbuildsys/cmd_submit.py b/gitbuildsys/cmd_submit.py index 7e27424..dbe72dd 100644 --- a/gitbuildsys/cmd_submit.py +++ b/gitbuildsys/cmd_submit.py @@ -93,7 +93,7 @@ def main(args): repo = RpmGitRepository(workdir) commit = repo.rev_parse(args.commit) current_branch = repo.get_branch() - except GitRepositoryError, err: + except GitRepositoryError as err: raise GbsError(str(err)) try: @@ -137,13 +137,13 @@ def main(args): try: repo.create_tag(tagname, msg=message, commit=commit, sign=args.sign, keyid=args.user_key) - except GitRepositoryError, err: + except GitRepositoryError as err: raise GbsError('failed to create tag %s: %s ' % (tagname, str(err))) log.info("pushing tag to remote '%s'" % args.remote) try: repo.push_tag(args.remote, tagname) - except GitRepositoryError, err: + except GitRepositoryError as err: repo.delete_tag(tagname) raise GbsError('failed to push tag %s :%s' % (tagname, str(err))) diff --git a/gitbuildsys/conf.py b/gitbuildsys/conf.py index 798dc86..a0fd40a 100644 --- a/gitbuildsys/conf.py +++ b/gitbuildsys/conf.py @@ -276,7 +276,7 @@ url = http://download.tizen.org/releases/daily/trunk/ivi/latest/ cfgparser.get('general', 'work_dir') == '.': cfgparser.set('general', 'work_dir', os.path.abspath(os.path.dirname(fpath))) - except Error, err: + except Error as err: raise errors.ConfigError('config file error:%s' % err) self._cfgparsers.append(cfgparser) self._cfgparsers.append(self._create_default_parser()) @@ -339,7 +339,7 @@ url = http://download.tizen.org/releases/daily/trunk/ivi/latest/ with open(fpath, 'w') as wfile: wfile.write(self.DEFAULT_CONF_TEMPLATE) - os.chmod(fpath, 0600) + os.chmod(fpath, 0o600) log.warning('Created a new config file %s. Please check and edit ' 'your authentication information.' % fpath) @@ -380,7 +380,7 @@ url = http://download.tizen.org/releases/daily/trunk/ivi/latest/ for cfgparser in self._cfgparsers: try: return cfgparser.get(section, opt) - except Error, err: + except Error as err: pass raise errors.ConfigError(err) @@ -392,7 +392,7 @@ url = http://download.tizen.org/releases/daily/trunk/ivi/latest/ try: options.update(cfgparser.options(section)) sect_found = True - except Error, err: + except Error as err: pass if not sect_found: @@ -431,7 +431,7 @@ url = http://download.tizen.org/releases/daily/trunk/ivi/latest/ val = self._get('passwdx', section) try: ret = decode_passwdx(val) - except (TypeError, IOError), err: + except (TypeError, IOError) as err: raise errors.ConfigError('passwdx:%s' % err) else: ret = self._get(opt, section) @@ -460,7 +460,7 @@ url = http://download.tizen.org/releases/daily/trunk/ivi/latest/ for cfgparser in cfgparsers: try: cfgparser.update() - except IOError, err: + except IOError as err: log.warning('update config file error: %s' % err) @@ -480,7 +480,7 @@ class SectionConf(object): password = url.password or parent.common_password try: self.url = SafeURL(url.url, user, password) - except ValueError, err: + except ValueError as err: raise errors.ConfigError('%s for %s' % (str(err), url.url)) def dump(self, fhandler): @@ -596,7 +596,7 @@ class BizConfigManager(ConfigMgr): value = re.sub(r'\$\{([^}]+)\}', r'%(\1)s', value) try: value = value % general_keys - except KeyError, err: + except KeyError as err: raise errors.ConfigError('unknown key: %s. Supportted '\ 'keys are %s' % (str(err), ' '.join( \ self.DEFAULTS['general'].keys()))) @@ -636,7 +636,7 @@ class BizConfigManager(ConfigMgr): dump_general(fhandler) profile.dump(fhandler) shutil.move(tmp.path, os.path.expanduser(fname)) - except IOError, err: + except IOError as err: raise errors.ConfigError(err) log.warning('subcommand oriented style of config is deprecated. ' @@ -760,7 +760,7 @@ class BizConfigManager(ConfigMgr): if name == 'passwdx': try: value = decode_passwdx(value) - except (TypeError, IOError), err: + except (TypeError, IOError) as err: raise errors.ConfigError('Error decoding %s: %s' % \ (opt, err)) repos[key]['passwd'] = value diff --git a/gitbuildsys/oscapi.py b/gitbuildsys/oscapi.py index 9384996..930d5d1 100644 --- a/gitbuildsys/oscapi.py +++ b/gitbuildsys/oscapi.py @@ -53,7 +53,7 @@ class OSC(object): if oscrc: try: conf.get_config(override_conffile=oscrc) - except OSError, err: + except OSError as err: if err.errno == 1: # permission problem, should be the chmod(0600) issue raise ObsError('Current user has no write permission '\ @@ -80,7 +80,7 @@ class OSC(object): try: return method(url, data=data, file=filep) except (urllib2.URLError, M2Crypto.m2urllib2.URLError, - M2Crypto.SSL.SSLError, ssl.SSLError), err: + M2Crypto.SSL.SSLError, ssl.SSLError) as err: if count == 3: raise OSCError(str(err)) @@ -127,7 +127,7 @@ class OSC(object): # Create target meta meta = ''\ - '%s'\ + '%s'\ '' % \ (target, description, conf.get_apiurl_usr(self.apiurl)) if linkto: @@ -143,7 +143,7 @@ class OSC(object): for name in repos: if linkedbuild: meta += '' % \ - (name, linkedbuild) + (name, linkedbuild) else: meta += '' % name meta += '' % (src, name) @@ -162,7 +162,7 @@ class OSC(object): # Create project and set its meta core.edit_meta('prj', path_args=quote_plus(target), data=meta) except (urllib2.URLError, M2Crypto.m2urllib2.URLError, - M2Crypto.SSL.SSLError), err: + M2Crypto.SSL.SSLError) as err: raise ObsError("Can't set meta for %s: %s" % (target, str(err))) # don't need set project config if no src project @@ -173,7 +173,7 @@ class OSC(object): try: config = core.show_project_conf(self.apiurl, src) except (urllib2.URLError, M2Crypto.m2urllib2.URLError, - M2Crypto.SSL.SSLError), err: + M2Crypto.SSL.SSLError) as err: raise ObsError("Can't get config from project %s: %s" \ % (src, str(err))) @@ -181,7 +181,7 @@ class OSC(object): self.apiurl, False) try: self.core_http(core.http_PUT, url, data=''.join(config)) - except OSCError, err: + except OSCError as err: raise ObsError("can't copy config from %s to %s: %s" \ % (src, target, err)) @@ -195,7 +195,7 @@ class OSC(object): url = core.makeurl(self.apiurl, ['source', prj], query) try: self.core_http(core.http_DELETE, url) - except OSCError, err: + except OSCError as err: raise ObsError("can't delete project %s: %s" % (prj, err)) def exists(self, prj, pkg=''): @@ -205,11 +205,11 @@ class OSC(object): try: core.meta_exists(metatype=metatype, path_args=path_args, create_new=False, apiurl=self.apiurl) - except urllib2.HTTPError, err: + except urllib2.HTTPError as err: if err.code == 404: return False except (urllib2.URLError, M2Crypto.m2urllib2.URLError, \ - M2Crypto.SSL.SSLError), err: + M2Crypto.SSL.SSLError) as err: pass except SSLVerificationError: raise ObsError("SSL verification error.") @@ -223,7 +223,7 @@ class OSC(object): try: return core.rebuild(self.apiurl, prj, pkg, repo=None, arch=arch) except (urllib2.URLError, M2Crypto.m2urllib2.URLError, \ - M2Crypto.SSL.SSLError), err: + M2Crypto.SSL.SSLError) as err: raise ObsError("Can't trigger rebuild for %s/%s: %s" % \ (prj, pkg, str(err))) except SSLVerificationError: @@ -275,8 +275,8 @@ class OSC(object): def commit_files(self, prj, pkg, files, message): """Commits files to OBS.""" - query = {'cmd' : 'commitfilelist', - 'user' : conf.get_apiurl_usr(self.apiurl), + query = {'cmd': 'commitfilelist', + 'user': conf.get_apiurl_usr(self.apiurl), 'comment': message, 'keeplink': 1} url = core.makeurl(self.apiurl, ['source', prj, pkg], query=query) @@ -298,7 +298,7 @@ class OSC(object): query="rev=repository") self.core_http(core.http_PUT, put_url, filep=fpath) self.core_http(core.http_POST, url, data=xml) - except OSCError, err: + except OSCError as err: raise ObsError("can't commit files to %s/%s: %s" % (prj, pkg, err)) def create_package(self, prj, pkg): @@ -310,7 +310,7 @@ class OSC(object): self.apiurl, False) try: self.core_http(core.http_PUT, url, data=meta) - except OSCError, err: + except OSCError as err: raise ObsError("can't create %s/%s: %s" % (prj, pkg, err)) def get_results(self, prj, pkg): @@ -319,7 +319,7 @@ class OSC(object): try: build_status = core.get_results(self.apiurl, prj, pkg) except (urllib2.URLError, M2Crypto.m2urllib2.URLError, - M2Crypto.SSL.SSLError), err: + M2Crypto.SSL.SSLError) as err: raise ObsError("can't get %s/%s build results: %s" \ % (prj, pkg, str(err))) @@ -344,11 +344,11 @@ class OSC(object): '_log?nostream=1&start=0']) try: log = self.core_http(core.http_GET, url).read() - except OSCError, err: + except OSCError as err: raise ObsError("can't get %s/%s build log: %s" % (prj, pkg, err)) return log.translate(None, "".join([chr(i) for i in \ - range(10) + range(11, 32)])) + range(10) + range(11, 32)])) @staticmethod def get_path(prj, pkg=None): diff --git a/gitbuildsys/safe_url.py b/gitbuildsys/safe_url.py index c1a9f6c..1293e63 100644 --- a/gitbuildsys/safe_url.py +++ b/gitbuildsys/safe_url.py @@ -63,9 +63,9 @@ class SafeURL(str): 'return True is it is local path' return self.startswith('/') - def pathjoin(self, *args): + def pathjoin(self, args): '''treat self as path and urljoin''' - new = urlparse.urljoin(self.rstrip('/') + '/', *args) + new = urlparse.urljoin(self.rstrip('/') + '/', args) return SafeURL(new, self.user, self.passwd) def _get_userinfo(self): diff --git a/gitbuildsys/utils.py b/gitbuildsys/utils.py index 63a9165..4982826 100644 --- a/gitbuildsys/utils.py +++ b/gitbuildsys/utils.py @@ -142,9 +142,10 @@ class Temp(object): (fds, path) = tempfile.mkstemp(suffix, prefix, dirn) os.close(fds) if content: - with file(path, 'w+') as fobj: + #python3 will not support file, use open + with open(path, 'w+') as fobj: fobj.write(content) - except OSError, err: + except OSError as err: raise GbsError("Failed to create dir or file on %s: %s" % \ (target_dir, str(err))) self.path = path @@ -239,7 +240,7 @@ class URLGrabber(object): original_handler = signal.signal(signal.SIGINT, handler) try: curl.perform() - except pycurl.error, err: + except pycurl.error as err: log.debug('fetching error:%s' % str(err)) errcode, errmsg = err.args @@ -707,7 +708,7 @@ def git_status_checker(git, opts): git.rev_parse(opts.commit) is_clean = git.is_clean()[0] status = git.status() - except (GbpError, GitRepositoryError), err: + except (GbpError, GitRepositoryError) as err: raise GbsError(str(err)) untracked_files = status['??'] @@ -752,7 +753,7 @@ def show_file_from_rev(git_path, relative_path, commit_id): with Workdir(git_path): return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0] - except (subprocess.CalledProcessError, OSError), err: + except (subprocess.CalledProcessError, OSError) as err: log.debug('failed to checkout %s from %s:%s' % (relative_path, commit_id, str(err))) return None @@ -770,7 +771,7 @@ def file_exists_in_rev(git_path, relative_path, commit_id, dir_only=False): with Workdir(git_path): output = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0] - except (subprocess.CalledProcessError, OSError), err: + except (subprocess.CalledProcessError, OSError) as err: raise GbsError('failed to check existence of %s in %s:%s' % ( relative_path, commit_id, str(err))) @@ -787,7 +788,7 @@ def glob_in_rev(git_path, pattern, commit_id): with Workdir(git_path): output = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0] - except (subprocess.CalledProcessError, OSError), err: + except (subprocess.CalledProcessError, OSError) as err: raise GbsError('failed to glob %s in %s:%s' % ( pattern, commit_id, str(err))) @@ -829,6 +830,6 @@ def edit_file(target_fname, initial_content=None): try: with open(target_fname, 'w') as fobj: fobj.write(changes) - except IOError, err: + except IOError as err: raise GbsError("Can't update %s: %s" % (target_fname, str(err))) return True diff --git a/setup.py b/setup.py index 1c11f45..42519df 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ def get_version(mod_name): """Get version from module __init__.py""" path = os.path.join(mod_name, "__init__.py") if not os.path.isfile(path): - print 'No %s version file found' % path + print('No %s version file found' % path) sys.exit(1) content = open(path).read() @@ -36,7 +36,7 @@ def get_version(mod_name): if match: return match.group(1) - print 'Unable to find version in %s' % path + print('Unable to find version in %s' % path) sys.exit(1) check_debian() diff --git a/tests/test_config.py b/tests/test_config.py index f897ce7..fbae7db 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -25,7 +25,8 @@ from mock import patch from gitbuildsys.errors import ConfigError import gitbuildsys.conf - +#after python3.0, reload has been moved to imp std lib. +from imp import reload FILE_DIRNAME = os.path.dirname(os.path.abspath(__file__)) diff --git a/tests/test_help.py b/tests/test_help.py index 1d53b22..d7d7d48 100644 --- a/tests/test_help.py +++ b/tests/test_help.py @@ -36,9 +36,9 @@ class TestHelp(unittest.TestCase): "chroot", "chr"]: try: - print '>>>sub', sub + print('>>>sub', sub) GBS(argv=["gbs", sub, "--help"]) - except SystemExit, err: + except SystemExit as err: eq_(err.code, 0) @staticmethod @@ -46,5 +46,5 @@ class TestHelp(unittest.TestCase): """Test running gbs --help and gbs help.""" try: GBS(argv=["gbs", "--help"]) - except SystemExit, err: + except SystemExit as err: eq_(err.code, 0) diff --git a/tests/test_passwdx.py b/tests/test_passwdx.py index 42d4cd4..d63e193 100644 --- a/tests/test_passwdx.py +++ b/tests/test_passwdx.py @@ -27,6 +27,8 @@ from gitbuildsys.errors import ConfigError from test_config import Fixture +#after python3.0, reload has been moved to imp std lib. +from imp import reload class FakeFile(object): 'Fake file used to get updated config file' diff --git a/tests/test_profile.py b/tests/test_profile.py index a8690d3..562d9f4 100644 --- a/tests/test_profile.py +++ b/tests/test_profile.py @@ -25,6 +25,8 @@ from gitbuildsys.errors import ConfigError from test_config import Fixture from test_passwdx import FakeFile +#after python3.0, reload has been moved to imp std lib. +from imp import reload def get_profile(): '''get current profile to test''' diff --git a/tools/gbs b/tools/gbs index 4a03e5b..43eab50 100755 --- a/tools/gbs +++ b/tools/gbs @@ -713,10 +713,10 @@ if __name__ == '__main__': except KeyboardInterrupt: log.LOGGER.error('^C caught, program aborted.') - except errors.Usage, usage: + except errors.Usage as usage: log.LOGGER.error(str(usage)) - except errors.CmdError, err: + except errors.CmdError as err: if log.LOGGER.level == log.DEBUG: import traceback log.LOGGER.error(traceback.format_exc()) -- 2.7.4