From 37ccd6f794539e0678b7a7ad938e571cc73e106c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Araujo?= Date: Thu, 15 Sep 2011 18:18:51 +0200 Subject: [PATCH] Fix packaging.database.Distribution.list_distinfo_files (#12785). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This method was supposed to return only the file under the dist-info directory, but it actually returned all installed files. The tests didn’t catch this because they were flawed; I updated them. Thanks to Nadeem Vawda and Jeremy Kloth for testing. As a bonus, the removal of os.path.relpath use should also fix the Windows buildbots. --- Lib/packaging/database.py | 4 ++- Lib/packaging/tests/test_database.py | 46 +++++++++++++++------------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/Lib/packaging/database.py b/Lib/packaging/database.py index c733b7af674..b606db6b054 100644 --- a/Lib/packaging/database.py +++ b/Lib/packaging/database.py @@ -263,7 +263,9 @@ class Distribution: :returns: iterator of paths """ for path, checksum, size in self._get_records(local): - yield path + # XXX add separator or use real relpath algo + if path.startswith(self.path): + yield path def __eq__(self, other): return isinstance(other, Distribution) and self.path == other.path diff --git a/Lib/packaging/tests/test_database.py b/Lib/packaging/tests/test_database.py index 9baf3960c67..5c95cdaa03b 100644 --- a/Lib/packaging/tests/test_database.py +++ b/Lib/packaging/tests/test_database.py @@ -4,7 +4,6 @@ import csv import sys import shutil import tempfile -from os.path import relpath # separate import for backport concerns from hashlib import md5 from textwrap import dedent @@ -32,11 +31,11 @@ def get_hexdigest(filename): return checksum.hexdigest() -def record_pieces(file): - path = relpath(file, sys.prefix) - digest = get_hexdigest(file) - size = os.path.getsize(file) - return [path, digest, size] +def record_pieces(path): + path = os.path.join(*path) + digest = get_hexdigest(path) + size = os.path.getsize(path) + return path, digest, size class FakeDistsMixin: @@ -141,12 +140,10 @@ class TestDistribution(CommonDistributionTests, unittest.TestCase): for path, dirs, files in os.walk(dist_location): for f in files: - record_writer.writerow(record_pieces( - os.path.join(path, f))) + record_writer.writerow(record_pieces((path, f))) for file in ('INSTALLER', 'METADATA', 'REQUESTED'): - record_writer.writerow(record_pieces( - os.path.join(distinfo_dir, file))) - record_writer.writerow([relpath(record_file, sys.prefix)]) + record_writer.writerow(record_pieces((distinfo_dir, file))) + record_writer.writerow([record_file]) with open(record_file) as file: record_reader = csv.reader(file, lineterminator='\n') @@ -171,15 +168,17 @@ class TestDistribution(CommonDistributionTests, unittest.TestCase): distinfo_name + '.dist-info') true_path = [self.fake_dists_path, distinfo_name, 'grammar', 'utils.py'] - true_path = relpath(os.path.join(*true_path), sys.prefix) + true_path = os.path.join(*true_path) false_path = [self.fake_dists_path, 'towel_stuff-0.1', 'towel_stuff', '__init__.py'] - false_path = relpath(os.path.join(*false_path), sys.prefix) + false_path = os.path.join(*false_path) # Test if the distribution uses the file in question dist = Distribution(distinfo_dir) - self.assertTrue(dist.uses(true_path)) - self.assertFalse(dist.uses(false_path)) + self.assertTrue(dist.uses(true_path), 'dist %r is supposed to use %r' % + (dist, true_path)) + self.assertFalse(dist.uses(false_path), 'dist %r is not supposed to ' + 'use %r' % (dist, true_path)) def test_get_distinfo_file(self): # Test the retrieval of dist-info file objects. @@ -215,20 +214,23 @@ class TestDistribution(CommonDistributionTests, unittest.TestCase): 'MAGICFILE') def test_list_distinfo_files(self): - # Test for the iteration of RECORD path entries. distinfo_name = 'towel_stuff-0.1' distinfo_dir = os.path.join(self.fake_dists_path, distinfo_name + '.dist-info') dist = Distribution(distinfo_dir) # Test for the iteration of the raw path - distinfo_record_paths = self.records[distinfo_dir].keys() + distinfo_files = [os.path.join(distinfo_dir, filename) for filename in + os.listdir(distinfo_dir)] found = dist.list_distinfo_files() - self.assertEqual(sorted(found), sorted(distinfo_record_paths)) + self.assertEqual(sorted(found), sorted(distinfo_files)) # Test for the iteration of local absolute paths - distinfo_record_paths = [os.path.join(sys.prefix, path) - for path in self.records[distinfo_dir]] - found = dist.list_distinfo_files(local=True) - self.assertEqual(sorted(found), sorted(distinfo_record_paths)) + distinfo_files = [os.path.join(sys.prefix, distinfo_dir, path) for + path in distinfo_files] + found = sorted(dist.list_distinfo_files(local=True)) + if os.sep != '/': + self.assertNotIn('/', found[0]) + self.assertIn(os.sep, found[0]) + self.assertEqual(found, sorted(distinfo_files)) def test_get_resources_path(self): distinfo_name = 'babar-0.1'