Reported by 2to3. The .items, .keys, and .values methods in Python 2 make expensive copies, so the test framework uses the .iter* flavors. But in Python 3 the .iter* (and even the 2.7 .view*) flavors are removed and the original methods return fast views. The shims examine the runtime's version and calls the right method to avoid making copies. Signed-off-by: Jeremy Heiner <ScalaProtractor at gmail.com> --- test/pacman/pmdb.py | 4 ++-- test/pacman/pmpkg.py | 2 +- test/pacman/pmtest.py | 6 +++--- test/pacman/util.py | 15 ++++++++++++--- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/test/pacman/pmdb.py b/test/pacman/pmdb.py index b7b3522..f4bc71d 100644 --- a/test/pacman/pmdb.py +++ b/test/pacman/pmdb.py @@ -236,7 +236,7 @@ def generate(self): for pkg, entry in pkg_entries: path = os.path.join(self.dbdir, pkg.fullname()) util.mkdir(path) - for name, data in entry.iteritems(): + for name, data in util.itemsview(entry): util.mkfile(path, name, data) if self.dbfile: @@ -247,7 +247,7 @@ def generate(self): info = tarfile.TarInfo(pkg.fullname()) info.type = tarfile.DIRTYPE tar.addfile(info) - for name, data in entry.iteritems(): + for name, data in util.itemsview(entry): filename = os.path.join(pkg.fullname(), name) info = tarfile.TarInfo(filename) info.size = len(data) diff --git a/test/pacman/pmpkg.py b/test/pacman/pmpkg.py index 0c1ea68..69734b0 100644 --- a/test/pacman/pmpkg.py +++ b/test/pacman/pmpkg.py @@ -225,7 +225,7 @@ def local_backup_entries(self): def installfile(self): data = [] - for key, value in self.install.iteritems(): + for key, value in util.itemsview(self.install): if value: data.append("%s() {\n%s\n}\n" % (key, value)) diff --git a/test/pacman/pmtest.py b/test/pacman/pmtest.py index 57e6538..a3e4a47 100644 --- a/test/pacman/pmtest.py +++ b/test/pacman/pmtest.py @@ -58,7 +58,7 @@ def findpkg(self, name, version, allow_local=False): """Find a package object matching the name and version specified in either sync databases or the local package collection. The local database is allowed to match if allow_local is True.""" - for db in self.db.itervalues(): + for db in util.valuesview(self.db): if db.is_local and not allow_local: continue pkg = db.getpkg(name) @@ -154,7 +154,7 @@ def generate(self, pacman): vprint("\t%s" % os.path.join(util.TMPDIR, pkg.filename())) pkg.finalize() pkg.makepkg(tmpdir) - for key, value in self.db.iteritems(): + for key, value in util.itemsview(self.db): for pkg in value.pkgs: pkg.finalize() if key == "local" and not self.createlocalpkgs: @@ -170,7 +170,7 @@ def generate(self, pacman): # Creating sync database archives vprint(" Creating databases") - for key, value in self.db.iteritems(): + for key, value in util.itemsview(self.db): vprint("\t" + value.treename) value.generate() diff --git a/test/pacman/util.py b/test/pacman/util.py index 77dd804..107a224 100644 --- a/test/pacman/util.py +++ b/test/pacman/util.py @@ -59,6 +59,15 @@ def vprint(msg): PERM_DIR = int("755",8) # 0o755 PERM_FILE = int("644",8) # 0o644 +def keysview(x): + return x.keys() if sys.hexversion >= 0x03000000 else x.iterkeys() + +def valuesview(x): + return x.values() if sys.hexversion >= 0x03000000 else x.itervalues() + +def itemsview(x): + return x.items() if sys.hexversion >= 0x03000000 else x.iteritems() + # # Methods to generate files @@ -125,13 +134,13 @@ def writedata(filename, data): def mkcfgfile(filename, root, option, db): # Options data = ["[options]"] - for key, value in option.iteritems(): + for key, value in itemsview(option): data.extend(["%s = %s" % (key, j) for j in value]) # Repositories # sort by repo name so tests can predict repo order, rather than be # subjects to the whims of python dict() ordering - for key in sorted(db.iterkeys()): + for key in sorted(keysview(db)): if key != "local": value = db[key] data.append("[%s]\n" \ @@ -139,7 +148,7 @@ def mkcfgfile(filename, root, option, db): "Server = file://%s" \ % (value.treename, value.getverify(), \ os.path.join(root, SYNCREPO, value.treename))) - for optkey, optval in value.option.iteritems(): + for optkey, optval in itemsview(value.option): data.extend(["%s = %s" % (optkey, j) for j in optval]) mkfile(root, filename, "\n".join(data)) -- 1.8.4