Refactor the code of osccore-qa-testing-tools  to comply with PEP8.

Related-prod: PRODX-42195
Change-Id: Id05e7584e0d024127ce1bd5042cfe681a1b52e2d
diff --git a/update_testrail_xml/client.py b/update_testrail_xml/client.py
index 94bc5f6..a1b45a9 100644
--- a/update_testrail_xml/client.py
+++ b/update_testrail_xml/client.py
@@ -1,4 +1,5 @@
 from __future__ import absolute_import
+
 import logging
 import time
 
@@ -6,7 +7,7 @@
 
 logger = logging.getLogger(__name__)
 
-requests_logger = logging.getLogger('requests.packages.urllib3')
+requests_logger = logging.getLogger("requests.packages.urllib3")
 requests_logger.setLevel(logging.WARNING)
 
 
@@ -17,8 +18,10 @@
 
     def find_all(self, **kwargs):
         filtered = ItemSet(
-            x for x in self
-            if all(getattr(x, k) == v for k, v in kwargs.items()))
+            x
+            for x in self
+            if all(getattr(x, k) == v for k, v in kwargs.items())
+        )
         filtered._item_class = self._item_class
         return filtered
 
@@ -32,8 +35,8 @@
 
 class Collection(object):
 
-    _list_url = 'get_{name}s'
-    _add_url = 'add_{name}'
+    _list_url = "get_{name}s"
+    _add_url = "add_{name}"
 
     def __init__(self, item_class=None, parent_id=None, **kwargs):
         self._item_class = item_class
@@ -46,12 +49,12 @@
         name = self._item_class._api_name()
         if id is None:
             items = self._list(name)
-            if 'error' in items:
+            if "error" in items:
                 raise Exception(items)
-            if name == 'project':
-                items = items['projects']
-            if name == 'case':
-                items = items['cases']
+            if name == "project":
+                items = items["projects"]
+            if name == "case":
+                items = items["cases"]
             items = ItemSet(self._to_object(x) for x in items)
             items._item_class = self._item_class
             return items
@@ -60,7 +63,7 @@
             return self._item_class.get(id)
 
     def __repr__(self):
-        return '<Collection of {}>'.format(self._item_class.__name__)
+        return "<Collection of {}>".format(self._item_class.__name__)
 
     def _to_object(self, data):
         return self._item_class(**data)
@@ -69,8 +72,8 @@
         params = params or {}
         url = self._list_url.format(name=name)
         if self.parent_id is not None:
-            url += '/{}'.format(self.parent_id)
-        return self._handler('GET', url, params=params)
+            url += "/{}".format(self.parent_id)
+        return self._handler("GET", url, params=params)
 
     def find_all(self, **kwargs):
         return self().find_all(**kwargs)
@@ -92,10 +95,10 @@
 
 
 class Item(object):
-    _get_url = 'get_{name}/{id}'
-    _update_url = 'update_{name}/{id}'
+    _get_url = "get_{name}/{id}"
+    _update_url = "update_{name}/{id}"
     _handler = None
-    _repr_field = 'name'
+    _repr_field = "name"
 
     def __init__(self, id=None, **kwargs):
         self.id = id
@@ -112,29 +115,30 @@
             raise AttributeError
 
     def __setattr__(self, name, value):
-        if '_data' in self.__dict__ and name not in self.__dict__:
-            self.__dict__['_data'][name] = value
+        if "_data" in self.__dict__ and name not in self.__dict__:
+            self.__dict__["_data"][name] = value
         else:
             self.__dict__[name] = value
 
     def __repr__(self):
-        name = getattr(self, self._repr_field, '')
+        name = getattr(self, self._repr_field, "")
         name = repr(name)
-        return '<{c.__name__}({s.id}) {name} at 0x{id:x}>'.format(
-            s=self, c=self.__class__, id=id(self), name=name)
+        return "<{c.__name__}({s.id}) {name} at 0x{id:x}>".format(
+            s=self, c=self.__class__, id=id(self), name=name
+        )
 
     @classmethod
     def get(cls, id):
         name = cls._api_name()
         url = cls._get_url.format(name=name, id=id)
-        result = cls._handler('GET', url)
-        if 'error' in result:
+        result = cls._handler("GET", url)
+        if "error" in result:
             raise Exception(result)
         return cls(**result)
 
     def update(self):
         url = self._update_url.format(name=self._api_name(), id=self.id)
-        self._handler('POST', url, json=self.data)
+        self._handler("POST", url, json=self.data)
 
     @property
     def data(self):
@@ -152,8 +156,10 @@
     def cases(self):
         return CaseCollection(
             Case,
-            _list_url='get_cases/{}&suite_id={}'.format(self.project_id,
-                                                        self.id))
+            _list_url="get_cases/{}&suite_id={}".format(
+                self.project_id, self.id
+            ),
+        )
 
 
 class CaseCollection(Collection):
@@ -165,18 +171,20 @@
 
 
 class Plan(Item):
-    def __init__(self,
-                 name,
-                 description=None,
-                 milestone_id=None,
-                 entries=None,
-                 id=None,
-                 **kwargs):
+    def __init__(
+        self,
+        name,
+        description=None,
+        milestone_id=None,
+        entries=None,
+        id=None,
+        **kwargs
+    ):
         add_kwargs = {
-            'name': name,
-            'description': description,
-            'milestone_id': milestone_id,
-            'entries': entries or [],
+            "name": name,
+            "description": description,
+            "milestone_id": milestone_id,
+            "entries": entries or [],
         }
         kwargs.update(add_kwargs)
         return super(self.__class__, self).__init__(id, **kwargs)
@@ -186,14 +194,14 @@
     def __init__(self, base_url, username, password):
         self.username = username
         self.password = password
-        self.base_url = base_url.rstrip('/') + '/index.php?/api/v2/'
+        self.base_url = base_url.rstrip("/") + "/index.php?/api/v2/"
 
         Item._handler = self._query
 
     def _query(self, method, url, **kwargs):
         url = self.base_url + url
-        headers = {'Content-type': 'application/json'}
-        logger.debug('Make {} request to {}'.format(method, url))
+        headers = {"Content-type": "application/json"}
+        logger.debug("Make {} request to {}".format(method, url))
         for _ in range(5):
             response = requests.request(
                 method,
@@ -201,7 +209,8 @@
                 allow_redirects=False,
                 auth=(self.username, self.password),
                 headers=headers,
-                **kwargs)
+                **kwargs
+            )
             # To many requests
             if response.status_code == 429:
                 time.sleep(60)
@@ -210,13 +219,15 @@
                 break
         # Redirect or error
         if response.status_code >= 300:
-            raise requests.HTTPError("Wrong response:\n"
-                                     "status_code: {0.status_code}\n"
-                                     "headers: {0.headers}\n"
-                                     "content: '{0.content}'".format(response),
-                                     response=response)
+            raise requests.HTTPError(
+                "Wrong response:\n"
+                "status_code: {0.status_code}\n"
+                "headers: {0.headers}\n"
+                "content: '{0.content}'".format(response),
+                response=response,
+            )
         result = response.json()
-        if 'error' in result:
+        if "error" in result:
             logger.warning(result)
         return result
 
@@ -231,8 +242,9 @@
         self.conditions = conditions
 
     def __str__(self):
-        conditions = ', '.join(['{}="{}"'.format(x, y)
-                               for (x, y) in self.conditions.items()])
-        return u'{type} with {conditions}'.format(
-            type=self.item_class._api_name().title(),
-            conditions=conditions)
\ No newline at end of file
+        conditions = ", ".join(
+            ['{}="{}"'.format(x, y) for (x, y) in self.conditions.items()]
+        )
+        return "{type} with {conditions}".format(
+            type=self.item_class._api_name().title(), conditions=conditions
+        )
diff --git a/update_testrail_xml/cmd.py b/update_testrail_xml/cmd.py
index bec9097..ea7a5f3 100644
--- a/update_testrail_xml/cmd.py
+++ b/update_testrail_xml/cmd.py
@@ -9,13 +9,13 @@
 
 from reporter import Reporter
 
-warnings.simplefilter('always', DeprecationWarning)
+warnings.simplefilter("always", DeprecationWarning)
 logger = logging.getLogger(__name__)
 
 if sys.version_info[0] == 3:
     str_cls = str
 else:
-    str_cls = eval('unicode')
+    str_cls = eval("unicode")
 
 
 def filename(string):
@@ -30,140 +30,164 @@
 
 def parse_args(args):
     defaults = {
-        'TESTRAIL_URL': 'https://mirantis.testrail.com',
-        'TESTRAIL_USER': 'user@example.com',
-        'TESTRAIL_PASSWORD': 'password',
-        'TESTRAIL_PROJECT': 'Mirantis OpenStack',
-        'TESTRAIL_MILESTONE': '9.0',
-        'TESTRAIL_TEST_SUITE': '[{0.testrail_milestone}] MOSQA',
-        'XUNIT_REPORT': 'report.xml',
-        'OUTPUT_XUNIT_REPORT': 'output_report.xml',
-        'XUNIT_NAME_TEMPLATE': '{id}',
-        'TESTRAIL_NAME_TEMPLATE': '{custom_report_label}',
-        'TRACE_LEN': 100,
-        'ISO_ID': None,
-        'TESTRAIL_PLAN_NAME': None,
-        'ENV_DESCRIPTION': '',
-        'TEST_RESULTS_LINK': '',
-        'PASTE_BASE_URL': None
+        "TESTRAIL_URL": "https://mirantis.testrail.com",
+        "TESTRAIL_USER": "user@example.com",
+        "TESTRAIL_PASSWORD": "password",
+        "TESTRAIL_PROJECT": "Mirantis OpenStack",
+        "TESTRAIL_MILESTONE": "9.0",
+        "TESTRAIL_TEST_SUITE": "[{0.testrail_milestone}] MOSQA",
+        "XUNIT_REPORT": "report.xml",
+        "OUTPUT_XUNIT_REPORT": "output_report.xml",
+        "XUNIT_NAME_TEMPLATE": "{id}",
+        "TESTRAIL_NAME_TEMPLATE": "{custom_report_label}",
+        "TRACE_LEN": 100,
+        "ISO_ID": None,
+        "TESTRAIL_PLAN_NAME": None,
+        "ENV_DESCRIPTION": "",
+        "TEST_RESULTS_LINK": "",
+        "PASTE_BASE_URL": None,
     }
     defaults = {k: os.environ.get(k, v) for k, v in defaults.items()}
 
-    parser = argparse.ArgumentParser(description='xUnit to testrail reporter')
+    parser = argparse.ArgumentParser(description="xUnit to testrail reporter")
     parser.add_argument(
-        'xunit_report',
+        "xunit_report",
         type=filename,
-        default=defaults['XUNIT_REPORT'],
-        help='xUnit report XML file')
+        default=defaults["XUNIT_REPORT"],
+        help="xUnit report XML file",
+    )
 
     parser.add_argument(
-        '--output-xunit-report',
+        "--output-xunit-report",
         type=str_cls,
-        default=defaults['OUTPUT_XUNIT_REPORT'],
-        help='Output xUnit report XML file after update')
+        default=defaults["OUTPUT_XUNIT_REPORT"],
+        help="Output xUnit report XML file after update",
+    )
 
     parser.add_argument(
-        '--xunit-name-template',
+        "--xunit-name-template",
         type=str_cls,
-        default=defaults['XUNIT_NAME_TEMPLATE'],
-        help='template for xUnit cases to make id string')
+        default=defaults["XUNIT_NAME_TEMPLATE"],
+        help="template for xUnit cases to make id string",
+    )
     parser.add_argument(
-        '--testrail-name-template',
+        "--testrail-name-template",
         type=str_cls,
-        default=defaults['TESTRAIL_NAME_TEMPLATE'],
-        help='template for TestRail cases to make id string')
+        default=defaults["TESTRAIL_NAME_TEMPLATE"],
+        help="template for TestRail cases to make id string",
+    )
 
     parser.add_argument(
-        '--env-description',
+        "--env-description",
         type=str_cls,
-        default=defaults['ENV_DESCRIPTION'],
-        help='env deploy type description (for TestRun name)')
+        default=defaults["ENV_DESCRIPTION"],
+        help="env deploy type description (for TestRun name)",
+    )
 
     group = parser.add_mutually_exclusive_group()
     group.add_argument(
-        '--iso-id',
+        "--iso-id",
         type=str_cls,
-        default=defaults['ISO_ID'],
-        help='id of build Fuel iso (DEPRECATED)')
+        default=defaults["ISO_ID"],
+        help="id of build Fuel iso (DEPRECATED)",
+    )
     group.add_argument(
-        '--testrail-plan-name',
+        "--testrail-plan-name",
         type=str_cls,
-        default=defaults['TESTRAIL_PLAN_NAME'],
-        help='name of test plan to be displayed in testrail')
+        default=defaults["TESTRAIL_PLAN_NAME"],
+        help="name of test plan to be displayed in testrail",
+    )
 
     parser.add_argument(
-        '--test-results-link',
+        "--test-results-link",
         type=str_cls,
-        default=defaults['TEST_RESULTS_LINK'],
-        help='link to test job results')
+        default=defaults["TEST_RESULTS_LINK"],
+        help="link to test job results",
+    )
     parser.add_argument(
-        '--testrail-url',
+        "--testrail-url",
         type=str_cls,
-        default=defaults['TESTRAIL_URL'],
-        help='base url of testrail')
+        default=defaults["TESTRAIL_URL"],
+        help="base url of testrail",
+    )
     parser.add_argument(
-        '--testrail-user',
+        "--testrail-user",
         type=str_cls,
-        default=defaults['TESTRAIL_USER'],
-        help='testrail user')
+        default=defaults["TESTRAIL_USER"],
+        help="testrail user",
+    )
     parser.add_argument(
-        '--testrail-password',
+        "--testrail-password",
         type=str_cls,
-        default=defaults['TESTRAIL_PASSWORD'],
-        help='testrail password')
+        default=defaults["TESTRAIL_PASSWORD"],
+        help="testrail password",
+    )
     parser.add_argument(
-        '--testrail-project',
+        "--testrail-project",
         type=str_cls,
-        default=defaults['TESTRAIL_PROJECT'],
-        help='testrail project name')
+        default=defaults["TESTRAIL_PROJECT"],
+        help="testrail project name",
+    )
     parser.add_argument(
-        '--testrail-milestone',
+        "--testrail-milestone",
         type=str_cls,
-        default=defaults['TESTRAIL_MILESTONE'],
-        help='testrail project milestone')
+        default=defaults["TESTRAIL_MILESTONE"],
+        help="testrail project milestone",
+    )
     parser.add_argument(
-        '--testrail-suite',
+        "--testrail-suite",
         type=str_cls,
-        default=defaults['TESTRAIL_TEST_SUITE'],
-        help='testrail project suite name')
+        default=defaults["TESTRAIL_TEST_SUITE"],
+        help="testrail project suite name",
+    )
     parser.add_argument(
-        '--trace-len',
+        "--trace-len",
         type=int,
-        default=defaults['TRACE_LEN'],
-        help='testrail project name')
+        default=defaults["TRACE_LEN"],
+        help="testrail project name",
+    )
     parser.add_argument(
-        '--send-skipped',
-        action='store_true',
+        "--send-skipped",
+        action="store_true",
         default=False,
-        help='send skipped cases to testrail')
+        help="send skipped cases to testrail",
+    )
     parser.add_argument(
-        '--send-duplicates',
-        action='store_true',
+        "--send-duplicates",
+        action="store_true",
         default=False,
-        help='send duplicated cases to testrail')
+        help="send duplicated cases to testrail",
+    )
     parser.add_argument(
-        '--paste-url',
+        "--paste-url",
         type=str_cls,
-        default=defaults['PASTE_BASE_URL'],
-        help=('pastebin service JSON API URL to send test case logs and trace,'
-              ' example: http://localhost:5000/'))
+        default=defaults["PASTE_BASE_URL"],
+        help=(
+            "pastebin service JSON API URL to send test case logs and trace,"
+            " example: http://localhost:5000/"
+        ),
+    )
     parser.add_argument(
-        '--testrail-run-update',
-        dest='use_test_run_if_exists',
-        action='store_true',
+        "--testrail-run-update",
+        dest="use_test_run_if_exists",
+        action="store_true",
         default=False,
-        help='don\'t create new test run if such already exists')
+        help="don't create new test run if such already exists",
+    )
     parser.add_argument(
-        '--dry-run', '-n',
-        action='store_true',
+        "--dry-run",
+        "-n",
+        action="store_true",
         default=False,
-        help='Just print mapping table')
+        help="Just print mapping table",
+    )
     parser.add_argument(
-        '--verbose',
-        '-v',
-        action='store_true',
+        "--verbose",
+        "-v",
+        action="store_true",
         default=False,
-        help='Verbose mode')
+        help="Verbose mode",
+    )
 
     return parser.parse_args(args)
 
@@ -175,16 +199,19 @@
     args = parse_args(args)
 
     if not args.testrail_plan_name:
-        args.testrail_plan_name = ('{0.testrail_milestone} iso '
-                                   '#{0.iso_id}').format(args)
+        args.testrail_plan_name = (
+            "{0.testrail_milestone} iso " "#{0.iso_id}"
+        ).format(args)
 
-        msg = ("--iso-id parameter is DEPRECATED. "
-               "It is recommended to use --testrail-plan-name parameter.")
+        msg = (
+            "--iso-id parameter is DEPRECATED. "
+            "It is recommended to use --testrail-plan-name parameter."
+        )
         warnings.warn(msg, DeprecationWarning)
 
     logger_dict = dict(stream=sys.stderr)
     if args.verbose:
-        logger_dict['level'] = logging.DEBUG
+        logger_dict["level"] = logging.DEBUG
 
     logging.basicConfig(**logger_dict)
     trace_len = args.trace_len
@@ -194,7 +221,8 @@
         output_xunit_report=args.output_xunit_report,
         env_description=args.env_description,
         test_results_link=args.test_results_link,
-        paste_url=args.paste_url)
+        paste_url=args.paste_url,
+    )
     suite = args.testrail_suite.format(args)
     reporter.config_testrail(
         base_url=args.testrail_url,
@@ -204,7 +232,8 @@
         tests_suite=suite,
         send_skipped=args.send_skipped,
         send_duplicates=args.send_duplicates,
-        use_test_run_if_exists=args.use_test_run_if_exists)
+        use_test_run_if_exists=args.use_test_run_if_exists,
+    )
 
     empty_classnames = reporter.get_empty_classnames()
     all_empty_cases = reporter.get_testcases(empty_classnames)
@@ -215,7 +244,7 @@
     reporter.delete_temporary_file()
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     try:
         main()
     except Exception:
diff --git a/update_testrail_xml/reporter.py b/update_testrail_xml/reporter.py
index 4c04e09..438759c 100644
--- a/update_testrail_xml/reporter.py
+++ b/update_testrail_xml/reporter.py
@@ -1,15 +1,14 @@
 from __future__ import absolute_import, print_function
 
-from functools import wraps
+import logging
 import os
 import re
-import six
-
 import xml.etree.ElementTree as ET
+from functools import wraps
 
+import six
 from client import Client as TrClient
 
-import logging
 logging.basicConfig(level=logging.INFO)
 logger = logging.getLogger(__name__)
 
@@ -27,12 +26,16 @@
 
 
 class Reporter(object):
-    def __init__(self,
-                 xunit_report,
-                 output_xunit_report,
-                 env_description,
-                 test_results_link,
-                 paste_url, *args, **kwargs):
+    def __init__(
+        self,
+        xunit_report,
+        output_xunit_report,
+        env_description,
+        test_results_link,
+        paste_url,
+        *args,
+        **kwargs
+    ):
         self._config = {}
         self._cache = {}
         self.xunit_report = xunit_report
@@ -43,17 +46,22 @@
 
         super(Reporter, self).__init__(*args, **kwargs)
 
-    def config_testrail(self,
-                        base_url,
-                        username,
-                        password,
-                        project,
-                        tests_suite,
-                        send_skipped=False,
-                        use_test_run_if_exists=False, send_duplicates=False):
-        self._config['testrail'] = dict(base_url=base_url,
-                                        username=username,
-                                        password=password, )
+    def config_testrail(
+        self,
+        base_url,
+        username,
+        password,
+        project,
+        tests_suite,
+        send_skipped=False,
+        use_test_run_if_exists=False,
+        send_duplicates=False,
+    ):
+        self._config["testrail"] = dict(
+            base_url=base_url,
+            username=username,
+            password=password,
+        )
         self.project_name = project
         self.tests_suite_name = tests_suite
         self.send_skipped = send_skipped
@@ -62,7 +70,7 @@
 
     @property
     def testrail_client(self):
-        return TrClient(**self._config['testrail'])
+        return TrClient(**self._config["testrail"])
 
     @property
     @memoize
@@ -79,55 +87,62 @@
     def cases(self):
         return self.suite.cases()
 
-# ================================================================
+    # ================================================================
 
-    temporary_filename = 'temporary_xunit_report.xml'
-    logger.info(' Temporrary filename is: {}'.format(temporary_filename))
+    temporary_filename = "temporary_xunit_report.xml"
+    logger.info(" Temporrary filename is: {}".format(temporary_filename))
 
     def describe_testrail_case(self, case):
         return {
             k: v
-            for k, v in case.data.items() if isinstance(v, six.string_types)
+            for k, v in case.data.items()
+            if isinstance(v, six.string_types)
         }
 
     def get_cases(self):
         """Get all the testcases from the server"""
-        logger.info(' Start gerring cases from the Testrail')
+        logger.info(" Start gerring cases from the Testrail")
         cases_data = []
         cases = self.suite.cases()
         for case in cases:
             case_data = self.describe_testrail_case(case)
             cases_data.append(case_data)
-        logger.info(' Cases were got from the Testrail')
+        logger.info(" Cases were got from the Testrail")
         return cases_data
 
     def get_empty_classnames(self):
         tree = ET.parse(self.xunit_report)
         root = tree.getroot()
 
-        if root[0].tag == 'testsuite':
+        if root[0].tag == "testsuite":
             root = root[0]
 
         classnames = []
         for child in root:
-            if child.attrib['classname'] == '' and child[0].tag == 'failure':
-                m = re.search(r'\(.*\)', child.attrib['name'])
+            if child.attrib["classname"] == "" and child[0].tag == "failure":
+                m = re.search(r"\(.*\)", child.attrib["name"])
                 classname = m.group()[1:-1]
-                classnames.append({'classname': classname,
-                                   'data': child[0].text,
-                                   'fullname': child.attrib.get('name')})
+                classnames.append(
+                    {
+                        "classname": classname,
+                        "data": child[0].text,
+                        "fullname": child.attrib.get("name"),
+                    }
+                )
 
-        logger.info(' Got empty classnames from xml file')
+        logger.info(" Got empty classnames from xml file")
         return classnames
 
     def get_testcases(self, empty_classnames):
         needed_cases = []
         for empty_classname in empty_classnames:
-            updated_case = {'classname': empty_classname['classname'],
-                            'name': '.' + empty_classname['fullname'],
-                            'data': empty_classname['data']}
+            updated_case = {
+                "classname": empty_classname["classname"],
+                "name": "." + empty_classname["fullname"],
+                "data": empty_classname["data"],
+            }
             needed_cases.append(updated_case)
-        logger.info(' Got test cases for updating xml file')
+        logger.info(" Got test cases for updating xml file")
         return needed_cases
 
     def update_testcases(self, cases):
@@ -136,73 +151,107 @@
 
         for case in cases:
             testcase = ET.Element("testcase")
-            testcase.attrib['classname'] = "{}".format(case['classname'])
-            testcase.attrib['name'] = "{}".format(case['name'])
-            testcase.attrib['time'] = "0.000"
+            testcase.attrib["classname"] = "{}".format(case["classname"])
+            testcase.attrib["name"] = "{}".format(case["name"])
+            testcase.attrib["time"] = "0.000"
 
-            skip = ET.SubElement(testcase, 'failure')
-            skip.text = case['data']
+            skip = ET.SubElement(testcase, "failure")
+            skip.text = case["data"]
 
             root.append(testcase)
 
         for _ in cases:
             for child in root:
                 try:
-                    if child.attrib['classname'] == "":
+                    if child.attrib["classname"] == "":
                         root.remove(child)
                 except KeyError:
                     pass
-        logger.info(' Create temporrary file: {}'.format(str(self.temporary_filename)))
+        logger.info(
+            " Create temporrary file: {}".format(str(self.temporary_filename))
+        )
         tree = ET.ElementTree(root)
         tree.write(self.temporary_filename)
-        logger.info(' Temporrary file was created: {}'.format(self.check_file_exists(self.temporary_filename)))
+        logger.info(
+            " Temporrary file was created: {}".format(
+                self.check_file_exists(self.temporary_filename)
+            )
+        )
+
+    @staticmethod
+    def get_duplicates(all_cases):
+        return sorted(
+            list(set([x for x in all_cases if all_cases.count(x) > 1]))
+        )
 
     def delete_duplicates(self):
-        logger.info(' Start deleting duplicates from xml file: {}'.format(self.temporary_filename))
+        logger.info(
+            " Start deleting duplicates from xml file: {}".format(
+                self.temporary_filename
+            )
+        )
         tree = ET.parse(self.temporary_filename)
         root = tree.getroot()
 
-        if root[0].tag == 'testsuite':
+        if root[0].tag == "testsuite":
             root = root[0]
 
         all_cases = []
         for child in root:
             try:
-                all_cases.append((child.attrib['classname'], child.attrib['name']))
+                all_cases.append(
+                    (child.attrib["classname"], child.attrib["name"])
+                )
             except KeyError:
                 pass
         # Get duplicates
-        for_stack = lambda all_cases: sorted(list(set([x for x in all_cases if all_cases.count(x) > 1])))
-        duplicate_cases = for_stack(all_cases)
+        duplicate_cases = self.get_duplicates(all_cases)
 
         # Remove duplicates from xml
         for case in duplicate_cases:
             for child in root:
                 try:
-                    if child.attrib['classname'] == case[0] and child.attrib['name'] == case[1]:
-                        if (child.attrib['time'] == '0.000' or
-                                hasattr(next(iter(child), None), 'tag') and child[0].tag == 'error'):
+                    if (
+                        child.attrib["classname"] == case[0]
+                        and child.attrib["name"] == case[1]
+                    ):
+                        if (
+                            child.attrib["time"] == "0.000"
+                            or hasattr(next(iter(child), None), "tag")
+                            and child[0].tag == "error"
+                        ):
                             child.clear()
                 except KeyError:
                     pass
 
-        logger.info(' Start saving results to the file: {}'.format(self.output_xunit_report))
+        logger.info(
+            " Start saving results to the file: {}".format(
+                self.output_xunit_report
+            )
+        )
         tree = ET.ElementTree(root)
         tree.write(self.temporary_filename)
 
-        logger.info(' {} file was created: {}'.format(self.output_xunit_report, self.check_file_exists(self.output_xunit_report)))
+        logger.info(
+            " {} file was created: {}".format(
+                self.output_xunit_report,
+                self.check_file_exists(self.output_xunit_report),
+            )
+        )
 
     def cut_long_traces(self, trace_len):
         tree = ET.parse(self.temporary_filename)
         root = tree.getroot()
 
-        if root[0].tag == 'testsuite':
+        if root[0].tag == "testsuite":
             root = root[0]
 
         for child in root:
             try:
-                if child[0].text.count('\n') > trace_len:
-                    ind = [m.start() for m in re.finditer('\n', child[0].text)][-trace_len]
+                if child[0].text.count("\n") > trace_len:
+                    ind = [
+                        m.start() for m in re.finditer("\n", child[0].text)
+                    ][-trace_len]
                     old = child[0].text[ind:]
                     child[0].text = old
             except IndexError:
@@ -215,4 +264,8 @@
 
     def delete_temporary_file(self):
         os.remove(self.temporary_filename)
-        logger.info(' Temporrary file exists: {}'.format(self.check_file_exists(self.temporary_filename)))
+        logger.info(
+            " Temporrary file exists: {}".format(
+                self.check_file_exists(self.temporary_filename)
+            )
+        )