diff options
34 files changed, 114 insertions, 100 deletions
diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass index 4be0a7e487..357062b3c1 100644 --- a/meta/classes/base.bbclass +++ b/meta/classes/base.bbclass | |||
@@ -10,7 +10,7 @@ inherit utility-tasks | |||
10 | inherit metadata_scm | 10 | inherit metadata_scm |
11 | inherit logging | 11 | inherit logging |
12 | 12 | ||
13 | OE_IMPORTS += "os sys time oe.path oe.utils oe.data oe.package oe.packagegroup oe.sstatesig oe.lsb oe.cachedpath" | 13 | OE_IMPORTS += "os sys time oe.path oe.utils oe.types oe.package oe.packagegroup oe.sstatesig oe.lsb oe.cachedpath" |
14 | OE_IMPORTS[type] = "list" | 14 | OE_IMPORTS[type] = "list" |
15 | 15 | ||
16 | def oe_import(d): | 16 | def oe_import(d): |
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass index 1ccd9ee485..6995d06950 100644 --- a/meta/classes/buildhistory.bbclass +++ b/meta/classes/buildhistory.bbclass | |||
@@ -145,7 +145,7 @@ python buildhistory_emit_pkghistory() { | |||
145 | elif name == "RCONFLICTS": | 145 | elif name == "RCONFLICTS": |
146 | pkginfo.rconflicts = value | 146 | pkginfo.rconflicts = value |
147 | elif name == "PKGSIZE": | 147 | elif name == "PKGSIZE": |
148 | pkginfo.size = long(value) | 148 | pkginfo.size = int(value) |
149 | elif name == "FILES": | 149 | elif name == "FILES": |
150 | pkginfo.files = value | 150 | pkginfo.files = value |
151 | elif name == "FILELIST": | 151 | elif name == "FILELIST": |
diff --git a/meta/classes/populate_sdk_ext.bbclass b/meta/classes/populate_sdk_ext.bbclass index a9c6fe5933..b9d9543409 100644 --- a/meta/classes/populate_sdk_ext.bbclass +++ b/meta/classes/populate_sdk_ext.bbclass | |||
@@ -129,8 +129,8 @@ python copy_buildsystem () { | |||
129 | d.setVar('scriptrelpath', scriptrelpath) | 129 | d.setVar('scriptrelpath', scriptrelpath) |
130 | 130 | ||
131 | # Write out config file for devtool | 131 | # Write out config file for devtool |
132 | import ConfigParser | 132 | import configparser |
133 | config = ConfigParser.SafeConfigParser() | 133 | config = configparser.SafeConfigParser() |
134 | config.add_section('General') | 134 | config.add_section('General') |
135 | config.set('General', 'bitbake_subdir', conf_bbpath) | 135 | config.set('General', 'bitbake_subdir', conf_bbpath) |
136 | config.set('General', 'init_path', conf_initpath) | 136 | config.set('General', 'init_path', conf_initpath) |
diff --git a/meta/classes/report-error.bbclass b/meta/classes/report-error.bbclass index 20d2bef797..5cbf8f07fd 100644 --- a/meta/classes/report-error.bbclass +++ b/meta/classes/report-error.bbclass | |||
@@ -43,7 +43,7 @@ python errorreport_handler () { | |||
43 | data['target_sys'] = e.data.getVar("TARGET_SYS", True) | 43 | data['target_sys'] = e.data.getVar("TARGET_SYS", True) |
44 | data['failures'] = [] | 44 | data['failures'] = [] |
45 | data['component'] = e.getPkgs()[0] | 45 | data['component'] = e.getPkgs()[0] |
46 | data['branch_commit'] = base_detect_branch(e.data) + ": " + base_detect_revision(e.data) | 46 | data['branch_commit'] = str(base_detect_branch(e.data)) + ": " + str(base_detect_revision(e.data)) |
47 | lock = bb.utils.lockfile(datafile + '.lock') | 47 | lock = bb.utils.lockfile(datafile + '.lock') |
48 | errorreport_savedata(e, data, "error-report.txt") | 48 | errorreport_savedata(e, data, "error-report.txt") |
49 | bb.utils.unlockfile(lock) | 49 | bb.utils.unlockfile(lock) |
diff --git a/meta/lib/oe/classutils.py b/meta/lib/oe/classutils.py index 98bb059a71..e7856c86f2 100644 --- a/meta/lib/oe/classutils.py +++ b/meta/lib/oe/classutils.py | |||
@@ -1,4 +1,11 @@ | |||
1 | class ClassRegistry(type): | 1 | |
2 | class ClassRegistryMeta(type): | ||
3 | """Give each ClassRegistry their own registry""" | ||
4 | def __init__(cls, name, bases, attrs): | ||
5 | cls.registry = {} | ||
6 | type.__init__(cls, name, bases, attrs) | ||
7 | |||
8 | class ClassRegistry(type, metaclass=ClassRegistryMeta): | ||
2 | """Maintain a registry of classes, indexed by name. | 9 | """Maintain a registry of classes, indexed by name. |
3 | 10 | ||
4 | Note that this implementation requires that the names be unique, as it uses | 11 | Note that this implementation requires that the names be unique, as it uses |
@@ -12,12 +19,6 @@ Subclasses of ClassRegistry may define an 'implemented' property to exert | |||
12 | control over whether the class will be added to the registry (e.g. to keep | 19 | control over whether the class will be added to the registry (e.g. to keep |
13 | abstract base classes out of the registry).""" | 20 | abstract base classes out of the registry).""" |
14 | priority = 0 | 21 | priority = 0 |
15 | class __metaclass__(type): | ||
16 | """Give each ClassRegistry their own registry""" | ||
17 | def __init__(cls, name, bases, attrs): | ||
18 | cls.registry = {} | ||
19 | type.__init__(cls, name, bases, attrs) | ||
20 | |||
21 | def __init__(cls, name, bases, attrs): | 22 | def __init__(cls, name, bases, attrs): |
22 | super(ClassRegistry, cls).__init__(name, bases, attrs) | 23 | super(ClassRegistry, cls).__init__(name, bases, attrs) |
23 | try: | 24 | try: |
diff --git a/meta/lib/oe/distro_check.py b/meta/lib/oe/distro_check.py index ba1bba678d..746e242f5d 100644 --- a/meta/lib/oe/distro_check.py +++ b/meta/lib/oe/distro_check.py | |||
@@ -1,8 +1,8 @@ | |||
1 | from contextlib import contextmanager | 1 | from contextlib import contextmanager |
2 | @contextmanager | 2 | @contextmanager |
3 | def create_socket(url, d): | 3 | def create_socket(url, d): |
4 | import urllib | 4 | import urllib.request, urllib.parse, urllib.error |
5 | socket = urllib.urlopen(url, proxies=get_proxies(d)) | 5 | socket = urllib.request.urlopen(url, proxies=get_proxies(d)) |
6 | try: | 6 | try: |
7 | yield socket | 7 | yield socket |
8 | finally: | 8 | finally: |
diff --git a/meta/lib/oe/maketype.py b/meta/lib/oe/maketype.py index 139f333691..f88981dd90 100644 --- a/meta/lib/oe/maketype.py +++ b/meta/lib/oe/maketype.py | |||
@@ -6,7 +6,8 @@ the arguments of the type's factory for details. | |||
6 | """ | 6 | """ |
7 | 7 | ||
8 | import inspect | 8 | import inspect |
9 | import types | 9 | import oe.types as types |
10 | import collections | ||
10 | 11 | ||
11 | available_types = {} | 12 | available_types = {} |
12 | 13 | ||
@@ -53,7 +54,9 @@ def get_callable_args(obj): | |||
53 | if type(obj) is type: | 54 | if type(obj) is type: |
54 | obj = obj.__init__ | 55 | obj = obj.__init__ |
55 | 56 | ||
56 | args, varargs, keywords, defaults = inspect.getargspec(obj) | 57 | sig = inspect.signature(obj) |
58 | args = list(sig.parameters.keys()) | ||
59 | defaults = list(s for s in sig.parameters.keys() if sig.parameters[s].default != inspect.Parameter.empty) | ||
57 | flaglist = [] | 60 | flaglist = [] |
58 | if args: | 61 | if args: |
59 | if len(args) > 1 and args[0] == 'self': | 62 | if len(args) > 1 and args[0] == 'self': |
@@ -93,7 +96,7 @@ for name in dir(types): | |||
93 | continue | 96 | continue |
94 | 97 | ||
95 | obj = getattr(types, name) | 98 | obj = getattr(types, name) |
96 | if not callable(obj): | 99 | if not isinstance(obj, collections.Callable): |
97 | continue | 100 | continue |
98 | 101 | ||
99 | register(name, obj) | 102 | register(name, obj) |
diff --git a/meta/lib/oe/manifest.py b/meta/lib/oe/manifest.py index ec2ef500b2..95f8eb2df3 100644 --- a/meta/lib/oe/manifest.py +++ b/meta/lib/oe/manifest.py | |||
@@ -4,11 +4,10 @@ import re | |||
4 | import bb | 4 | import bb |
5 | 5 | ||
6 | 6 | ||
7 | class Manifest(object): | 7 | class Manifest(object, metaclass=ABCMeta): |
8 | """ | 8 | """ |
9 | This is an abstract class. Do not instantiate this directly. | 9 | This is an abstract class. Do not instantiate this directly. |
10 | """ | 10 | """ |
11 | __metaclass__ = ABCMeta | ||
12 | 11 | ||
13 | PKG_TYPE_MUST_INSTALL = "mip" | 12 | PKG_TYPE_MUST_INSTALL = "mip" |
14 | PKG_TYPE_MULTILIB = "mlp" | 13 | PKG_TYPE_MULTILIB = "mlp" |
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py index 5bb15bbc09..faa0ab2edb 100644 --- a/meta/lib/oe/package.py +++ b/meta/lib/oe/package.py | |||
@@ -8,7 +8,7 @@ def runstrip(arg): | |||
8 | # 8 - shared library | 8 | # 8 - shared library |
9 | # 16 - kernel module | 9 | # 16 - kernel module |
10 | 10 | ||
11 | import commands, stat, subprocess | 11 | import stat, subprocess |
12 | 12 | ||
13 | (file, elftype, strip) = arg | 13 | (file, elftype, strip) = arg |
14 | 14 | ||
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py index 54e6970298..71e5b502e7 100644 --- a/meta/lib/oe/package_manager.py +++ b/meta/lib/oe/package_manager.py | |||
@@ -89,9 +89,7 @@ def opkg_query(cmd_output): | |||
89 | return output | 89 | return output |
90 | 90 | ||
91 | 91 | ||
92 | class Indexer(object): | 92 | class Indexer(object, metaclass=ABCMeta): |
93 | __metaclass__ = ABCMeta | ||
94 | |||
95 | def __init__(self, d, deploy_dir): | 93 | def __init__(self, d, deploy_dir): |
96 | self.d = d | 94 | self.d = d |
97 | self.deploy_dir = deploy_dir | 95 | self.deploy_dir = deploy_dir |
@@ -342,9 +340,7 @@ class DpkgIndexer(Indexer): | |||
342 | 340 | ||
343 | 341 | ||
344 | 342 | ||
345 | class PkgsList(object): | 343 | class PkgsList(object, metaclass=ABCMeta): |
346 | __metaclass__ = ABCMeta | ||
347 | |||
348 | def __init__(self, d, rootfs_dir): | 344 | def __init__(self, d, rootfs_dir): |
349 | self.d = d | 345 | self.d = d |
350 | self.rootfs_dir = rootfs_dir | 346 | self.rootfs_dir = rootfs_dir |
@@ -512,11 +508,10 @@ class DpkgPkgsList(PkgsList): | |||
512 | return opkg_query(cmd_output) | 508 | return opkg_query(cmd_output) |
513 | 509 | ||
514 | 510 | ||
515 | class PackageManager(object): | 511 | class PackageManager(object, metaclass=ABCMeta): |
516 | """ | 512 | """ |
517 | This is an abstract class. Do not instantiate this directly. | 513 | This is an abstract class. Do not instantiate this directly. |
518 | """ | 514 | """ |
519 | __metaclass__ = ABCMeta | ||
520 | 515 | ||
521 | def __init__(self, d): | 516 | def __init__(self, d): |
522 | self.d = d | 517 | self.d = d |
diff --git a/meta/lib/oe/qa.py b/meta/lib/oe/qa.py index 2c301419b0..75e7df8546 100644 --- a/meta/lib/oe/qa.py +++ b/meta/lib/oe/qa.py | |||
@@ -50,41 +50,41 @@ class ELFFile: | |||
50 | if len(self.data) < ELFFile.EI_NIDENT + 4: | 50 | if len(self.data) < ELFFile.EI_NIDENT + 4: |
51 | raise NotELFFileError("%s is not an ELF" % self.name) | 51 | raise NotELFFileError("%s is not an ELF" % self.name) |
52 | 52 | ||
53 | self.my_assert(self.data[0], chr(0x7f) ) | 53 | self.my_assert(self.data[0], 0x7f) |
54 | self.my_assert(self.data[1], 'E') | 54 | self.my_assert(self.data[1], ord('E')) |
55 | self.my_assert(self.data[2], 'L') | 55 | self.my_assert(self.data[2], ord('L')) |
56 | self.my_assert(self.data[3], 'F') | 56 | self.my_assert(self.data[3], ord('F')) |
57 | if self.bits == 0: | 57 | if self.bits == 0: |
58 | if self.data[ELFFile.EI_CLASS] == chr(ELFFile.ELFCLASS32): | 58 | if self.data[ELFFile.EI_CLASS] == ELFFile.ELFCLASS32: |
59 | self.bits = 32 | 59 | self.bits = 32 |
60 | elif self.data[ELFFile.EI_CLASS] == chr(ELFFile.ELFCLASS64): | 60 | elif self.data[ELFFile.EI_CLASS] == ELFFile.ELFCLASS64: |
61 | self.bits = 64 | 61 | self.bits = 64 |
62 | else: | 62 | else: |
63 | # Not 32-bit or 64.. lets assert | 63 | # Not 32-bit or 64.. lets assert |
64 | raise NotELFFileError("ELF but not 32 or 64 bit.") | 64 | raise NotELFFileError("ELF but not 32 or 64 bit.") |
65 | elif self.bits == 32: | 65 | elif self.bits == 32: |
66 | self.my_assert(self.data[ELFFile.EI_CLASS], chr(ELFFile.ELFCLASS32)) | 66 | self.my_assert(self.data[ELFFile.EI_CLASS], ELFFile.ELFCLASS32) |
67 | elif self.bits == 64: | 67 | elif self.bits == 64: |
68 | self.my_assert(self.data[ELFFile.EI_CLASS], chr(ELFFile.ELFCLASS64)) | 68 | self.my_assert(self.data[ELFFile.EI_CLASS], ELFFile.ELFCLASS64) |
69 | else: | 69 | else: |
70 | raise NotELFFileError("Must specify unknown, 32 or 64 bit size.") | 70 | raise NotELFFileError("Must specify unknown, 32 or 64 bit size.") |
71 | self.my_assert(self.data[ELFFile.EI_VERSION], chr(ELFFile.EV_CURRENT) ) | 71 | self.my_assert(self.data[ELFFile.EI_VERSION], ELFFile.EV_CURRENT) |
72 | 72 | ||
73 | self.sex = self.data[ELFFile.EI_DATA] | 73 | self.sex = self.data[ELFFile.EI_DATA] |
74 | if self.sex == chr(ELFFile.ELFDATANONE): | 74 | if self.sex == ELFFile.ELFDATANONE: |
75 | raise NotELFFileError("self.sex == ELFDATANONE") | 75 | raise NotELFFileError("self.sex == ELFDATANONE") |
76 | elif self.sex == chr(ELFFile.ELFDATA2LSB): | 76 | elif self.sex == ELFFile.ELFDATA2LSB: |
77 | self.sex = "<" | 77 | self.sex = "<" |
78 | elif self.sex == chr(ELFFile.ELFDATA2MSB): | 78 | elif self.sex == ELFFile.ELFDATA2MSB: |
79 | self.sex = ">" | 79 | self.sex = ">" |
80 | else: | 80 | else: |
81 | raise NotELFFileError("Unknown self.sex") | 81 | raise NotELFFileError("Unknown self.sex") |
82 | 82 | ||
83 | def osAbi(self): | 83 | def osAbi(self): |
84 | return ord(self.data[ELFFile.EI_OSABI]) | 84 | return self.data[ELFFile.EI_OSABI] |
85 | 85 | ||
86 | def abiVersion(self): | 86 | def abiVersion(self): |
87 | return ord(self.data[ELFFile.EI_ABIVERSION]) | 87 | return self.data[ELFFile.EI_ABIVERSION] |
88 | 88 | ||
89 | def abiSize(self): | 89 | def abiSize(self): |
90 | return self.bits | 90 | return self.bits |
diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py index 1b8538785c..e3c4b8a759 100644 --- a/meta/lib/oe/recipeutils.py +++ b/meta/lib/oe/recipeutils.py | |||
@@ -11,7 +11,7 @@ import os.path | |||
11 | import tempfile | 11 | import tempfile |
12 | import textwrap | 12 | import textwrap |
13 | import difflib | 13 | import difflib |
14 | import utils | 14 | from . import utils |
15 | import shutil | 15 | import shutil |
16 | import re | 16 | import re |
17 | import fnmatch | 17 | import fnmatch |
@@ -662,7 +662,7 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False, | |||
662 | 662 | ||
663 | if removevar in removevalues: | 663 | if removevar in removevalues: |
664 | remove = removevalues[removevar] | 664 | remove = removevalues[removevar] |
665 | if isinstance(remove, basestring): | 665 | if isinstance(remove, str): |
666 | if remove in splitval: | 666 | if remove in splitval: |
667 | splitval.remove(remove) | 667 | splitval.remove(remove) |
668 | changed = True | 668 | changed = True |
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py index d93485819a..1fc35bdc78 100644 --- a/meta/lib/oe/rootfs.py +++ b/meta/lib/oe/rootfs.py | |||
@@ -10,11 +10,10 @@ import subprocess | |||
10 | import re | 10 | import re |
11 | 11 | ||
12 | 12 | ||
13 | class Rootfs(object): | 13 | class Rootfs(object, metaclass=ABCMeta): |
14 | """ | 14 | """ |
15 | This is an abstract class. Do not instantiate this directly. | 15 | This is an abstract class. Do not instantiate this directly. |
16 | """ | 16 | """ |
17 | __metaclass__ = ABCMeta | ||
18 | 17 | ||
19 | def __init__(self, d): | 18 | def __init__(self, d): |
20 | self.d = d | 19 | self.d = d |
diff --git a/meta/lib/oe/sdk.py b/meta/lib/oe/sdk.py index 4786cc5aac..c74525f929 100644 --- a/meta/lib/oe/sdk.py +++ b/meta/lib/oe/sdk.py | |||
@@ -8,9 +8,7 @@ import glob | |||
8 | import traceback | 8 | import traceback |
9 | 9 | ||
10 | 10 | ||
11 | class Sdk(object): | 11 | class Sdk(object, metaclass=ABCMeta): |
12 | __metaclass__ = ABCMeta | ||
13 | |||
14 | def __init__(self, d, manifest_dir): | 12 | def __init__(self, d, manifest_dir): |
15 | self.d = d | 13 | self.d = d |
16 | self.sdk_output = self.d.getVar('SDK_OUTPUT', True) | 14 | self.sdk_output = self.d.getVar('SDK_OUTPUT', True) |
diff --git a/meta/lib/oe/terminal.py b/meta/lib/oe/terminal.py index 634daa9033..dc25d14ff6 100644 --- a/meta/lib/oe/terminal.py +++ b/meta/lib/oe/terminal.py | |||
@@ -25,9 +25,7 @@ class Registry(oe.classutils.ClassRegistry): | |||
25 | return bool(cls.command) | 25 | return bool(cls.command) |
26 | 26 | ||
27 | 27 | ||
28 | class Terminal(Popen): | 28 | class Terminal(Popen, metaclass=Registry): |
29 | __metaclass__ = Registry | ||
30 | |||
31 | def __init__(self, sh_cmd, title=None, env=None, d=None): | 29 | def __init__(self, sh_cmd, title=None, env=None, d=None): |
32 | fmt_sh_cmd = self.format_command(sh_cmd, title) | 30 | fmt_sh_cmd = self.format_command(sh_cmd, title) |
33 | try: | 31 | try: |
@@ -41,7 +39,7 @@ class Terminal(Popen): | |||
41 | 39 | ||
42 | def format_command(self, sh_cmd, title): | 40 | def format_command(self, sh_cmd, title): |
43 | fmt = {'title': title or 'Terminal', 'command': sh_cmd} | 41 | fmt = {'title': title or 'Terminal', 'command': sh_cmd} |
44 | if isinstance(self.command, basestring): | 42 | if isinstance(self.command, str): |
45 | return shlex.split(self.command.format(**fmt)) | 43 | return shlex.split(self.command.format(**fmt)) |
46 | else: | 44 | else: |
47 | return [element.format(**fmt) for element in self.command] | 45 | return [element.format(**fmt) for element in self.command] |
diff --git a/meta/lib/oe/tests/test_path.py b/meta/lib/oe/tests/test_path.py index 5fa24483d1..44d068143e 100644 --- a/meta/lib/oe/tests/test_path.py +++ b/meta/lib/oe/tests/test_path.py | |||
@@ -85,5 +85,5 @@ class TestRealPath(unittest.TestCase): | |||
85 | 85 | ||
86 | def test_loop(self): | 86 | def test_loop(self): |
87 | for e in self.EXCEPTIONS: | 87 | for e in self.EXCEPTIONS: |
88 | self.assertRaisesRegexp(OSError, r'\[Errno %u\]' % e[1], | 88 | self.assertRaisesRegex(OSError, r'\[Errno %u\]' % e[1], |
89 | self.__realpath, e[0], False, False) | 89 | self.__realpath, e[0], False, False) |
diff --git a/meta/lib/oe/types.py b/meta/lib/oe/types.py index 7f47c17d0e..4ae58acfac 100644 --- a/meta/lib/oe/types.py +++ b/meta/lib/oe/types.py | |||
@@ -33,7 +33,7 @@ def choice(value, choices): | |||
33 | Acts as a multiple choice for the user. To use this, set the variable | 33 | Acts as a multiple choice for the user. To use this, set the variable |
34 | type flag to 'choice', and set the 'choices' flag to a space separated | 34 | type flag to 'choice', and set the 'choices' flag to a space separated |
35 | list of valid values.""" | 35 | list of valid values.""" |
36 | if not isinstance(value, basestring): | 36 | if not isinstance(value, str): |
37 | raise TypeError("choice accepts a string, not '%s'" % type(value)) | 37 | raise TypeError("choice accepts a string, not '%s'" % type(value)) |
38 | 38 | ||
39 | value = value.lower() | 39 | value = value.lower() |
@@ -106,7 +106,7 @@ def boolean(value): | |||
106 | Valid values for false: 'no', 'n', 'false', 'f', '0' | 106 | Valid values for false: 'no', 'n', 'false', 'f', '0' |
107 | """ | 107 | """ |
108 | 108 | ||
109 | if not isinstance(value, basestring): | 109 | if not isinstance(value, str): |
110 | raise TypeError("boolean accepts a string, not '%s'" % type(value)) | 110 | raise TypeError("boolean accepts a string, not '%s'" % type(value)) |
111 | 111 | ||
112 | value = value.lower() | 112 | value = value.lower() |
diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py index 1bbdbb4bd5..cecddc657f 100644 --- a/meta/lib/oe/utils.py +++ b/meta/lib/oe/utils.py | |||
@@ -46,7 +46,7 @@ def both_contain(variable1, variable2, checkvalue, d): | |||
46 | val2 = d.getVar(variable2, True) | 46 | val2 = d.getVar(variable2, True) |
47 | val1 = set(val1.split()) | 47 | val1 = set(val1.split()) |
48 | val2 = set(val2.split()) | 48 | val2 = set(val2.split()) |
49 | if isinstance(checkvalue, basestring): | 49 | if isinstance(checkvalue, str): |
50 | checkvalue = set(checkvalue.split()) | 50 | checkvalue = set(checkvalue.split()) |
51 | else: | 51 | else: |
52 | checkvalue = set(checkvalue) | 52 | checkvalue = set(checkvalue) |
@@ -235,7 +235,7 @@ def format_pkg_list(pkg_dict, ret_format=None): | |||
235 | # so implement a version here | 235 | # so implement a version here |
236 | # | 236 | # |
237 | 237 | ||
238 | from Queue import Queue | 238 | from queue import Queue |
239 | from threading import Thread | 239 | from threading import Thread |
240 | 240 | ||
241 | class ThreadedWorker(Thread): | 241 | class ThreadedWorker(Thread): |
@@ -249,7 +249,7 @@ class ThreadedWorker(Thread): | |||
249 | self.worker_end = worker_end | 249 | self.worker_end = worker_end |
250 | 250 | ||
251 | def run(self): | 251 | def run(self): |
252 | from Queue import Empty | 252 | from queue import Empty |
253 | 253 | ||
254 | if self.worker_init is not None: | 254 | if self.worker_init is not None: |
255 | self.worker_init(self) | 255 | self.worker_init(self) |
diff --git a/meta/lib/oeqa/controllers/masterimage.py b/meta/lib/oeqa/controllers/masterimage.py index 522f9ebd76..4cb75539ee 100644 --- a/meta/lib/oeqa/controllers/masterimage.py +++ b/meta/lib/oeqa/controllers/masterimage.py | |||
@@ -24,9 +24,7 @@ from oeqa.utils import CommandError | |||
24 | 24 | ||
25 | from abc import ABCMeta, abstractmethod | 25 | from abc import ABCMeta, abstractmethod |
26 | 26 | ||
27 | class MasterImageHardwareTarget(oeqa.targetcontrol.BaseTarget): | 27 | class MasterImageHardwareTarget(oeqa.targetcontrol.BaseTarget, metaclass=ABCMeta): |
28 | |||
29 | __metaclass__ = ABCMeta | ||
30 | 28 | ||
31 | supported_image_fstypes = ['tar.gz', 'tar.bz2'] | 29 | supported_image_fstypes = ['tar.gz', 'tar.bz2'] |
32 | 30 | ||
diff --git a/meta/lib/oeqa/oetest.py b/meta/lib/oeqa/oetest.py index 4211ffc379..b4cf34b720 100644 --- a/meta/lib/oeqa/oetest.py +++ b/meta/lib/oeqa/oetest.py | |||
@@ -13,6 +13,7 @@ import inspect | |||
13 | import subprocess | 13 | import subprocess |
14 | import signal | 14 | import signal |
15 | import shutil | 15 | import shutil |
16 | import functools | ||
16 | try: | 17 | try: |
17 | import bb | 18 | import bb |
18 | except ImportError: | 19 | except ImportError: |
@@ -340,7 +341,14 @@ class TestContext(object): | |||
340 | for index, suite in enumerate(suites): | 341 | for index, suite in enumerate(suites): |
341 | set_suite_depth(suite) | 342 | set_suite_depth(suite) |
342 | suite.index = index | 343 | suite.index = index |
343 | suites.sort(cmp=lambda a,b: cmp((a.depth, a.index), (b.depth, b.index))) | 344 | |
345 | def cmp(a, b): | ||
346 | return (a > b) - (a < b) | ||
347 | |||
348 | def cmpfunc(a, b): | ||
349 | return cmp((a.depth, a.index), (b.depth, b.index)) | ||
350 | |||
351 | suites.sort(key=functools.cmp_to_key(cmpfunc)) | ||
344 | 352 | ||
345 | self.suite = testloader.suiteClass(suites) | 353 | self.suite = testloader.suiteClass(suites) |
346 | 354 | ||
diff --git a/meta/lib/oeqa/selftest/_toaster.py b/meta/lib/oeqa/selftest/_toaster.py index c424659fdc..15ea9df9ef 100644 --- a/meta/lib/oeqa/selftest/_toaster.py +++ b/meta/lib/oeqa/selftest/_toaster.py | |||
@@ -2,7 +2,7 @@ import unittest | |||
2 | import os | 2 | import os |
3 | import sys | 3 | import sys |
4 | import shlex, subprocess | 4 | import shlex, subprocess |
5 | import urllib, commands, time, getpass, re, json, shlex | 5 | import urllib.request, urllib.parse, urllib.error, subprocess, time, getpass, re, json, shlex |
6 | 6 | ||
7 | import oeqa.utils.ftools as ftools | 7 | import oeqa.utils.ftools as ftools |
8 | from oeqa.selftest.base import oeSelfTest | 8 | from oeqa.selftest.base import oeSelfTest |
@@ -290,7 +290,7 @@ class Toaster_DB_Tests(ToasterSetup): | |||
290 | layers = Layer.objects.values('id', 'layer_index_url') | 290 | layers = Layer.objects.values('id', 'layer_index_url') |
291 | cnt_err = [] | 291 | cnt_err = [] |
292 | for layer in layers: | 292 | for layer in layers: |
293 | resp = urllib.urlopen(layer['layer_index_url']) | 293 | resp = urllib.request.urlopen(layer['layer_index_url']) |
294 | if (resp.getcode() != 200): | 294 | if (resp.getcode() != 200): |
295 | cnt_err.append(layer['id']) | 295 | cnt_err.append(layer['id']) |
296 | self.assertEqual(len(cnt_err), 0, msg = 'Errors for layer id: %s' % cnt_err) | 296 | self.assertEqual(len(cnt_err), 0, msg = 'Errors for layer id: %s' % cnt_err) |
diff --git a/meta/lib/oeqa/selftest/recipetool.py b/meta/lib/oeqa/selftest/recipetool.py index e72911b0aa..a93d18e275 100644 --- a/meta/lib/oeqa/selftest/recipetool.py +++ b/meta/lib/oeqa/selftest/recipetool.py | |||
@@ -1,7 +1,7 @@ | |||
1 | import os | 1 | import os |
2 | import logging | 2 | import logging |
3 | import tempfile | 3 | import tempfile |
4 | import urlparse | 4 | import urllib.parse |
5 | 5 | ||
6 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var, create_temp_layer | 6 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var, create_temp_layer |
7 | from oeqa.utils.decorators import testcase | 7 | from oeqa.utils.decorators import testcase |
@@ -471,7 +471,7 @@ class RecipetoolAppendsrcBase(RecipetoolBase): | |||
471 | '''Return the first file:// in SRC_URI for the specified recipe.''' | 471 | '''Return the first file:// in SRC_URI for the specified recipe.''' |
472 | src_uri = get_bb_var('SRC_URI', recipe).split() | 472 | src_uri = get_bb_var('SRC_URI', recipe).split() |
473 | for uri in src_uri: | 473 | for uri in src_uri: |
474 | p = urlparse.urlparse(uri) | 474 | p = urllib.parse.urlparse(uri) |
475 | if p.scheme == 'file': | 475 | if p.scheme == 'file': |
476 | return p.netloc + p.path | 476 | return p.netloc + p.path |
477 | 477 | ||
diff --git a/meta/lib/oeqa/selftest/sstatetests.py b/meta/lib/oeqa/selftest/sstatetests.py index cc64c6cb68..07212ac4f1 100644 --- a/meta/lib/oeqa/selftest/sstatetests.py +++ b/meta/lib/oeqa/selftest/sstatetests.py | |||
@@ -264,7 +264,7 @@ SDKMACHINE = "i686" | |||
264 | files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps/") | 264 | files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps/") |
265 | files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash").replace("i686-linux", "x86_64-linux").replace("i686" + targetvendor + "-linux", "x86_64" + targetvendor + "-linux", ) for x in files2] | 265 | files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash").replace("i686-linux", "x86_64-linux").replace("i686" + targetvendor + "-linux", "x86_64" + targetvendor + "-linux", ) for x in files2] |
266 | self.maxDiff = None | 266 | self.maxDiff = None |
267 | self.assertItemsEqual(files1, files2) | 267 | self.assertCountEqual(files1, files2) |
268 | 268 | ||
269 | 269 | ||
270 | @testcase(1271) | 270 | @testcase(1271) |
@@ -298,7 +298,7 @@ NATIVELSBSTRING = \"DistroB\" | |||
298 | files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps/") | 298 | files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps/") |
299 | files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash") for x in files2] | 299 | files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash") for x in files2] |
300 | self.maxDiff = None | 300 | self.maxDiff = None |
301 | self.assertItemsEqual(files1, files2) | 301 | self.assertCountEqual(files1, files2) |
302 | 302 | ||
303 | @testcase(1368) | 303 | @testcase(1368) |
304 | def test_sstate_allarch_samesigs(self): | 304 | def test_sstate_allarch_samesigs(self): |
@@ -393,7 +393,7 @@ DEFAULTTUNE_virtclass-multilib-lib32 = "x86" | |||
393 | files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps") | 393 | files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps") |
394 | files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash") for x in files2] | 394 | files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash") for x in files2] |
395 | self.maxDiff = None | 395 | self.maxDiff = None |
396 | self.assertItemsEqual(files1, files2) | 396 | self.assertCountEqual(files1, files2) |
397 | 397 | ||
398 | 398 | ||
399 | def test_sstate_noop_samesigs(self): | 399 | def test_sstate_noop_samesigs(self): |
diff --git a/meta/lib/oeqa/targetcontrol.py b/meta/lib/oeqa/targetcontrol.py index 5422a617c4..1c57efaaef 100644 --- a/meta/lib/oeqa/targetcontrol.py +++ b/meta/lib/oeqa/targetcontrol.py | |||
@@ -43,9 +43,7 @@ def get_target_controller(d): | |||
43 | return controller(d) | 43 | return controller(d) |
44 | 44 | ||
45 | 45 | ||
46 | class BaseTarget(object): | 46 | class BaseTarget(object, metaclass=ABCMeta): |
47 | |||
48 | __metaclass__ = ABCMeta | ||
49 | 47 | ||
50 | supported_image_fstypes = [] | 48 | supported_image_fstypes = [] |
51 | 49 | ||
diff --git a/meta/lib/oeqa/utils/commands.py b/meta/lib/oeqa/utils/commands.py index 9a7c1d1375..18fe39ecfe 100644 --- a/meta/lib/oeqa/utils/commands.py +++ b/meta/lib/oeqa/utils/commands.py | |||
@@ -41,7 +41,7 @@ class Command(object): | |||
41 | self.data = data | 41 | self.data = data |
42 | 42 | ||
43 | self.options = dict(self.defaultopts) | 43 | self.options = dict(self.defaultopts) |
44 | if isinstance(self.cmd, basestring): | 44 | if isinstance(self.cmd, str): |
45 | self.options["shell"] = True | 45 | self.options["shell"] = True |
46 | if self.data: | 46 | if self.data: |
47 | self.options['stdin'] = subprocess.PIPE | 47 | self.options['stdin'] = subprocess.PIPE |
@@ -123,7 +123,7 @@ def bitbake(command, ignore_status=False, timeout=None, postconfig=None, **optio | |||
123 | else: | 123 | else: |
124 | extra_args = "" | 124 | extra_args = "" |
125 | 125 | ||
126 | if isinstance(command, basestring): | 126 | if isinstance(command, str): |
127 | cmd = "bitbake " + extra_args + " " + command | 127 | cmd = "bitbake " + extra_args + " " + command |
128 | else: | 128 | else: |
129 | cmd = [ "bitbake" ] + [a for a in (command + extra_args.split(" ")) if a not in [""]] | 129 | cmd = [ "bitbake" ] + [a for a in (command + extra_args.split(" ")) if a not in [""]] |
diff --git a/meta/lib/oeqa/utils/decorators.py b/meta/lib/oeqa/utils/decorators.py index 6fb09db417..0b23565485 100644 --- a/meta/lib/oeqa/utils/decorators.py +++ b/meta/lib/oeqa/utils/decorators.py | |||
@@ -115,6 +115,8 @@ class NoParsingFilter(logging.Filter): | |||
115 | def filter(self, record): | 115 | def filter(self, record): |
116 | return record.levelno == 100 | 116 | return record.levelno == 100 |
117 | 117 | ||
118 | import inspect | ||
119 | |||
118 | def LogResults(original_class): | 120 | def LogResults(original_class): |
119 | orig_method = original_class.run | 121 | orig_method = original_class.run |
120 | 122 | ||
@@ -124,6 +126,19 @@ def LogResults(original_class): | |||
124 | logfile = os.path.join(os.getcwd(),'results-'+caller+'.'+timestamp+'.log') | 126 | logfile = os.path.join(os.getcwd(),'results-'+caller+'.'+timestamp+'.log') |
125 | linkfile = os.path.join(os.getcwd(),'results-'+caller+'.log') | 127 | linkfile = os.path.join(os.getcwd(),'results-'+caller+'.log') |
126 | 128 | ||
129 | def get_class_that_defined_method(meth): | ||
130 | if inspect.ismethod(meth): | ||
131 | for cls in inspect.getmro(meth.__self__.__class__): | ||
132 | if cls.__dict__.get(meth.__name__) is meth: | ||
133 | return cls | ||
134 | meth = meth.__func__ # fallback to __qualname__ parsing | ||
135 | if inspect.isfunction(meth): | ||
136 | cls = getattr(inspect.getmodule(meth), | ||
137 | meth.__qualname__.split('.<locals>', 1)[0].rsplit('.', 1)[0]) | ||
138 | if isinstance(cls, type): | ||
139 | return cls | ||
140 | return None | ||
141 | |||
127 | #rewrite the run method of unittest.TestCase to add testcase logging | 142 | #rewrite the run method of unittest.TestCase to add testcase logging |
128 | def run(self, result, *args, **kws): | 143 | def run(self, result, *args, **kws): |
129 | orig_method(self, result, *args, **kws) | 144 | orig_method(self, result, *args, **kws) |
@@ -135,7 +150,7 @@ def LogResults(original_class): | |||
135 | except AttributeError: | 150 | except AttributeError: |
136 | test_case = self._testMethodName | 151 | test_case = self._testMethodName |
137 | 152 | ||
138 | class_name = str(testMethod.im_class).split("'")[1] | 153 | class_name = str(get_class_that_defined_method(testMethod)).split("'")[1] |
139 | 154 | ||
140 | #create custom logging level for filtering. | 155 | #create custom logging level for filtering. |
141 | custom_log_level = 100 | 156 | custom_log_level = 100 |
diff --git a/meta/lib/oeqa/utils/dump.py b/meta/lib/oeqa/utils/dump.py index 63a591d366..71422a9aea 100644 --- a/meta/lib/oeqa/utils/dump.py +++ b/meta/lib/oeqa/utils/dump.py | |||
@@ -3,7 +3,7 @@ import sys | |||
3 | import errno | 3 | import errno |
4 | import datetime | 4 | import datetime |
5 | import itertools | 5 | import itertools |
6 | from commands import runCmd | 6 | from .commands import runCmd |
7 | 7 | ||
8 | def get_host_dumper(d): | 8 | def get_host_dumper(d): |
9 | cmds = d.getVar("testimage_dump_host", True) | 9 | cmds = d.getVar("testimage_dump_host", True) |
diff --git a/meta/lib/oeqa/utils/httpserver.py b/meta/lib/oeqa/utils/httpserver.py index 76518d8ef9..bd76f36468 100644 --- a/meta/lib/oeqa/utils/httpserver.py +++ b/meta/lib/oeqa/utils/httpserver.py | |||
@@ -1,8 +1,8 @@ | |||
1 | import SimpleHTTPServer | 1 | import http.server |
2 | import multiprocessing | 2 | import multiprocessing |
3 | import os | 3 | import os |
4 | 4 | ||
5 | class HTTPServer(SimpleHTTPServer.BaseHTTPServer.HTTPServer): | 5 | class HTTPServer(http.server.HTTPServer): |
6 | 6 | ||
7 | def server_start(self, root_dir): | 7 | def server_start(self, root_dir): |
8 | import signal | 8 | import signal |
@@ -10,7 +10,7 @@ class HTTPServer(SimpleHTTPServer.BaseHTTPServer.HTTPServer): | |||
10 | os.chdir(root_dir) | 10 | os.chdir(root_dir) |
11 | self.serve_forever() | 11 | self.serve_forever() |
12 | 12 | ||
13 | class HTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): | 13 | class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler): |
14 | 14 | ||
15 | def log_message(self, format_str, *args): | 15 | def log_message(self, format_str, *args): |
16 | pass | 16 | pass |
diff --git a/meta/lib/oeqa/utils/logparser.py b/meta/lib/oeqa/utils/logparser.py index 87b50354cd..b377dcd271 100644 --- a/meta/lib/oeqa/utils/logparser.py +++ b/meta/lib/oeqa/utils/logparser.py | |||
@@ -3,7 +3,7 @@ | |||
3 | import sys | 3 | import sys |
4 | import os | 4 | import os |
5 | import re | 5 | import re |
6 | import ftools | 6 | from . import ftools |
7 | 7 | ||
8 | 8 | ||
9 | # A parser that can be used to identify weather a line is a test result or a section statement. | 9 | # A parser that can be used to identify weather a line is a test result or a section statement. |
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index 3d60433cae..e408fbbf3a 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py | |||
@@ -23,8 +23,8 @@ logger = logging.getLogger("BitBake.QemuRunner") | |||
23 | 23 | ||
24 | # Get Unicode non printable control chars | 24 | # Get Unicode non printable control chars |
25 | control_range = list(range(0,32))+list(range(127,160)) | 25 | control_range = list(range(0,32))+list(range(127,160)) |
26 | control_chars = [unichr(x) for x in control_range | 26 | control_chars = [chr(x) for x in control_range |
27 | if unichr(x) not in string.printable] | 27 | if chr(x) not in string.printable] |
28 | re_control_char = re.compile('[%s]' % re.escape("".join(control_chars))) | 28 | re_control_char = re.compile('[%s]' % re.escape("".join(control_chars))) |
29 | 29 | ||
30 | class QemuRunner: | 30 | class QemuRunner: |
@@ -220,6 +220,7 @@ class QemuRunner: | |||
220 | stopread = False | 220 | stopread = False |
221 | qemusock = None | 221 | qemusock = None |
222 | bootlog = '' | 222 | bootlog = '' |
223 | data = b'' | ||
223 | while time.time() < endtime and not stopread: | 224 | while time.time() < endtime and not stopread: |
224 | sread, swrite, serror = select.select(socklist, [], [], 5) | 225 | sread, swrite, serror = select.select(socklist, [], [], 5) |
225 | for sock in sread: | 226 | for sock in sread: |
@@ -283,13 +284,14 @@ class QemuRunner: | |||
283 | if hasattr(self, "origchldhandler"): | 284 | if hasattr(self, "origchldhandler"): |
284 | signal.signal(signal.SIGCHLD, self.origchldhandler) | 285 | signal.signal(signal.SIGCHLD, self.origchldhandler) |
285 | if self.runqemu: | 286 | if self.runqemu: |
286 | os.kill(self.monitorpid, signal.SIGKILL) | 287 | if hasattr(self, "monitorpid"): |
287 | logger.info("Sending SIGTERM to runqemu") | 288 | os.kill(self.monitorpid, signal.SIGKILL) |
288 | try: | 289 | logger.info("Sending SIGTERM to runqemu") |
289 | os.killpg(os.getpgid(self.runqemu.pid), signal.SIGTERM) | 290 | try: |
290 | except OSError as e: | 291 | os.killpg(os.getpgid(self.runqemu.pid), signal.SIGTERM) |
291 | if e.errno != errno.ESRCH: | 292 | except OSError as e: |
292 | raise | 293 | if e.errno != errno.ESRCH: |
294 | raise | ||
293 | endtime = time.time() + self.runqemutime | 295 | endtime = time.time() + self.runqemutime |
294 | while self.runqemu.poll() is None and time.time() < endtime: | 296 | while self.runqemu.poll() is None and time.time() < endtime: |
295 | time.sleep(1) | 297 | time.sleep(1) |
@@ -448,7 +450,7 @@ class LoggingThread(threading.Thread): | |||
448 | def stop(self): | 450 | def stop(self): |
449 | self.logger.info("Stopping logging thread") | 451 | self.logger.info("Stopping logging thread") |
450 | if self.running: | 452 | if self.running: |
451 | os.write(self.writepipe, "stop") | 453 | os.write(self.writepipe, bytes("stop", "utf-8")) |
452 | 454 | ||
453 | def teardown(self): | 455 | def teardown(self): |
454 | self.logger.info("Tearing down logging thread") | 456 | self.logger.info("Tearing down logging thread") |
diff --git a/meta/lib/oeqa/utils/qemutinyrunner.py b/meta/lib/oeqa/utils/qemutinyrunner.py index 054ab0ec5d..c823157ad6 100644 --- a/meta/lib/oeqa/utils/qemutinyrunner.py +++ b/meta/lib/oeqa/utils/qemutinyrunner.py | |||
@@ -13,7 +13,7 @@ import re | |||
13 | import socket | 13 | import socket |
14 | import select | 14 | import select |
15 | import bb | 15 | import bb |
16 | from qemurunner import QemuRunner | 16 | from .qemurunner import QemuRunner |
17 | 17 | ||
18 | class QemuTinyRunner(QemuRunner): | 18 | class QemuTinyRunner(QemuRunner): |
19 | 19 | ||
diff --git a/meta/lib/oeqa/utils/targetbuild.py b/meta/lib/oeqa/utils/targetbuild.py index f850d78df1..d538f6b65f 100644 --- a/meta/lib/oeqa/utils/targetbuild.py +++ b/meta/lib/oeqa/utils/targetbuild.py | |||
@@ -10,9 +10,7 @@ import bb.utils | |||
10 | import subprocess | 10 | import subprocess |
11 | from abc import ABCMeta, abstractmethod | 11 | from abc import ABCMeta, abstractmethod |
12 | 12 | ||
13 | class BuildProject(): | 13 | class BuildProject(metaclass=ABCMeta): |
14 | |||
15 | __metaclass__ = ABCMeta | ||
16 | 14 | ||
17 | def __init__(self, d, uri, foldername=None, tmpdir="/tmp/"): | 15 | def __init__(self, d, uri, foldername=None, tmpdir="/tmp/"): |
18 | self.d = d | 16 | self.d = d |
diff --git a/meta/lib/oeqa/utils/testexport.py b/meta/lib/oeqa/utils/testexport.py index 4fbf4bdcb3..57be2ca449 100644 --- a/meta/lib/oeqa/utils/testexport.py +++ b/meta/lib/oeqa/utils/testexport.py | |||
@@ -6,7 +6,7 @@ | |||
6 | 6 | ||
7 | import os, re, glob as g, shutil as sh,sys | 7 | import os, re, glob as g, shutil as sh,sys |
8 | from time import sleep | 8 | from time import sleep |
9 | from commands import runCmd | 9 | from .commands import runCmd |
10 | from difflib import SequenceMatcher as SM | 10 | from difflib import SequenceMatcher as SM |
11 | 11 | ||
12 | try: | 12 | try: |
diff --git a/scripts/oe-selftest b/scripts/oe-selftest index db132fdf9f..b1ecf7f322 100755 --- a/scripts/oe-selftest +++ b/scripts/oe-selftest | |||
@@ -1,4 +1,4 @@ | |||
1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python3 |
2 | 2 | ||
3 | # Copyright (c) 2013 Intel Corporation | 3 | # Copyright (c) 2013 Intel Corporation |
4 | # | 4 | # |
@@ -34,6 +34,8 @@ import subprocess | |||
34 | import time as t | 34 | import time as t |
35 | import re | 35 | import re |
36 | import fnmatch | 36 | import fnmatch |
37 | import collections | ||
38 | import imp | ||
37 | 39 | ||
38 | sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '/lib') | 40 | sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '/lib') |
39 | import scriptpath | 41 | import scriptpath |
@@ -414,7 +416,7 @@ def coverage_report(): | |||
414 | # Coverage under version 4 uses coverage.coverage | 416 | # Coverage under version 4 uses coverage.coverage |
415 | from coverage import coverage as Coverage | 417 | from coverage import coverage as Coverage |
416 | 418 | ||
417 | import cStringIO as StringIO | 419 | import io as StringIO |
418 | from coverage.misc import CoverageException | 420 | from coverage.misc import CoverageException |
419 | 421 | ||
420 | cov_output = StringIO.StringIO() | 422 | cov_output = StringIO.StringIO() |
@@ -442,7 +444,7 @@ def main(): | |||
442 | bbpath = get_bb_var('BBPATH').split(':') | 444 | bbpath = get_bb_var('BBPATH').split(':') |
443 | layer_libdirs = [p for p in (os.path.join(l, 'lib') for l in bbpath) if os.path.exists(p)] | 445 | layer_libdirs = [p for p in (os.path.join(l, 'lib') for l in bbpath) if os.path.exists(p)] |
444 | sys.path.extend(layer_libdirs) | 446 | sys.path.extend(layer_libdirs) |
445 | reload(oeqa.selftest) | 447 | imp.reload(oeqa.selftest) |
446 | 448 | ||
447 | if args.run_tests_by and len(args.run_tests_by) >= 2: | 449 | if args.run_tests_by and len(args.run_tests_by) >= 2: |
448 | valid_options = ['name', 'class', 'module', 'id', 'tag'] | 450 | valid_options = ['name', 'class', 'module', 'id', 'tag'] |
@@ -491,7 +493,7 @@ def main(): | |||
491 | if isinstance(t, type(oeSelfTest)) and issubclass(t, oeSelfTest) and t!=oeSelfTest: | 493 | if isinstance(t, type(oeSelfTest)) and issubclass(t, oeSelfTest) and t!=oeSelfTest: |
492 | print(" --", v) | 494 | print(" --", v) |
493 | for method in dir(t): | 495 | for method in dir(t): |
494 | if method.startswith("test_") and callable(vars(t)[method]): | 496 | if method.startswith("test_") and isinstance(vars(t)[method], collections.Callable): |
495 | print(" -- --", method) | 497 | print(" -- --", method) |
496 | 498 | ||
497 | except (AttributeError, ImportError) as e: | 499 | except (AttributeError, ImportError) as e: |