[Python-checkins] distutils2: Add some tests for retrieving resource path and file object.

tarek.ziade python-checkins at python.org
Wed Feb 16 22:23:58 CET 2011


tarek.ziade pushed 7e8bef5cb5b3 to distutils2:

http://hg.python.org/distutils2/rev/7e8bef5cb5b3
changeset:   1065:7e8bef5cb5b3
parent:      1063:bab1d09babc8
user:        FELD Boris <lothiraldan at gmail.com>
date:        Sun Jan 30 18:29:28 2011 +0100
summary:
  Add some tests for retrieving resource path and file object.
Add methods for retrieving resource path and file object.

files:
  distutils2/_backport/pkgutil.py
  distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/DATAFILES
  distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/INSTALLER
  distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/METADATA
  distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/RECORD
  distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/REQUESTED
  distutils2/_backport/tests/fake_dists/babar.cfg
  distutils2/_backport/tests/fake_dists/babar.png
  distutils2/_backport/tests/test_pkgutil.py
  distutils2/tests/test_datafiles.py

diff --git a/distutils2/_backport/pkgutil.py b/distutils2/_backport/pkgutil.py
--- a/distutils2/_backport/pkgutil.py
+++ b/distutils2/_backport/pkgutil.py
@@ -8,6 +8,7 @@
 from csv import reader as csv_reader
 from types import ModuleType
 from distutils2.errors import DistutilsError
+from distutils2.index.errors import DistributionNotFound
 from distutils2.metadata import DistributionMetadata
 from distutils2.version import suggest_normalized_version, VersionPredicate
 try:
@@ -742,8 +743,8 @@
         return '%s-%s at %s' % (self.name, self.metadata.version, self.path)
 
     def _get_records(self, local=False):
-        RECORD = os.path.join(self.path, 'RECORD')
-        record_reader = csv_reader(open(RECORD, 'rb'), delimiter=',')
+        RECORD = self.get_distinfo_file('RECORD')
+        record_reader = csv_reader(RECORD, delimiter=',')
         for row in record_reader:
             path, md5, size = row[:] + [None for i in xrange(len(row), 3)]
             if local:
@@ -751,6 +752,15 @@
                 path = os.path.join(sys.prefix, path)
             yield path, md5, size
 
+    def get_resource_path(self, relative_path):
+        datafiles_file = self.get_distinfo_file('DATAFILES')
+        datafiles_reader = csv_reader(datafiles_file, delimiter = ',')
+        for relative, destination in datafiles_reader:
+            if relative == relative_path:
+                return destination
+        raise KeyError('No data_file with relative path %s were installed' %
+                relative_path)
+
     def get_installed_files(self, local=False):
         """
         Iterates over the ``RECORD`` entries and returns a tuple
@@ -1162,5 +1172,14 @@
         if dist.uses(path):
             yield dist
 
-def data_open(distribution_name, relative_path):
-    pass
+def resource_path(distribution_name, relative_path):
+     dist = get_distribution(distribution_name)
+     if dist != None:
+         return dist.get_resource_path(relative_path)
+     raise DistributionNotFound('No distribution named %s is installed.' %
+                    distribution_name)
+
+def resource_open(distribution_name, relative_path, *args, **kwargs):
+    file = open(resource_path(distribution_name, relative_path), *args,
+                **kwargs)
+    return file
\ No newline at end of file
diff --git a/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/DATAFILES b/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/DATAFILES
new file mode 100644
--- /dev/null
+++ b/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/DATAFILES
@@ -0,0 +1,2 @@
+babar.png,babar.png
+babar.cfg,babar.cfg
\ No newline at end of file
diff --git a/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/INSTALLER b/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/INSTALLER
new file mode 100644
diff --git a/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/METADATA b/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/METADATA
new file mode 100644
--- /dev/null
+++ b/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/METADATA
@@ -0,0 +1,4 @@
+Metadata-version: 1.2
+Name: babar
+Version: 0.1
+Author: FELD Boris
\ No newline at end of file
diff --git a/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/RECORD b/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/RECORD
new file mode 100644
diff --git a/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/REQUESTED b/distutils2/_backport/tests/fake_dists/babar-0.1.dist-info/REQUESTED
new file mode 100644
diff --git a/distutils2/_backport/tests/fake_dists/babar.cfg b/distutils2/_backport/tests/fake_dists/babar.cfg
new file mode 100644
--- /dev/null
+++ b/distutils2/_backport/tests/fake_dists/babar.cfg
@@ -0,0 +1,1 @@
+Config
\ No newline at end of file
diff --git a/distutils2/_backport/tests/fake_dists/babar.png b/distutils2/_backport/tests/fake_dists/babar.png
new file mode 100644
diff --git a/distutils2/_backport/tests/test_pkgutil.py b/distutils2/_backport/tests/test_pkgutil.py
--- a/distutils2/_backport/tests/test_pkgutil.py
+++ b/distutils2/_backport/tests/test_pkgutil.py
@@ -1,11 +1,12 @@
 # -*- coding: utf-8 -*-
 """Tests for PEP 376 pkgutil functionality"""
+import imp
 import sys
+
+import csv
 import os
-import csv
-import imp
+import shutil
 import tempfile
-import shutil
 import zipfile
 try:
     from hashlib import md5
@@ -18,9 +19,9 @@
 
 from distutils2._backport import pkgutil
 from distutils2._backport.pkgutil import (
-    Distribution, EggInfoDistribution, get_distribution, get_distributions,
-    provides_distribution, obsoletes_distribution, get_file_users,
-    distinfo_dirname, _yield_distributions)
+                                          Distribution, EggInfoDistribution, get_distribution, get_distributions,
+                                          provides_distribution, obsoletes_distribution, get_file_users,
+                                          distinfo_dirname, _yield_distributions)
 
 try:
     from os.path import relpath
@@ -123,7 +124,6 @@
 
         del sys.modules[pkg]
 
-
 # Adapted from Python 2.7's trunk
 
 
@@ -182,7 +182,7 @@
     def setUp(self):
         super(TestPkgUtilDistribution, self).setUp()
         self.fake_dists_path = os.path.abspath(
-            os.path.join(os.path.dirname(__file__), 'fake_dists'))
+                                               os.path.join(os.path.dirname(__file__), 'fake_dists'))
         pkgutil.disable_cache()
 
         self.distinfo_dirs = [os.path.join(self.fake_dists_path, dir)
@@ -205,7 +205,7 @@
             # Setup the RECORD file for this dist
             record_file = os.path.join(distinfo_dir, 'RECORD')
             record_writer = csv.writer(open(record_file, 'w'), delimiter=',',
-                quoting=csv.QUOTE_NONE)
+                                       quoting=csv.QUOTE_NONE)
             dist_location = distinfo_dir.replace('.dist-info', '')
 
             for path, dirs, files in os.walk(dist_location):
@@ -214,15 +214,15 @@
                                            os.path.join(path, f)))
             for file in ['INSTALLER', 'METADATA', 'REQUESTED']:
                 record_writer.writerow(record_pieces(
-                    os.path.join(distinfo_dir, file)))
+                                       os.path.join(distinfo_dir, file)))
             record_writer.writerow([relpath(record_file, sys.prefix)])
             del record_writer  # causes the RECORD file to close
             record_reader = csv.reader(open(record_file, 'rb'))
             record_data = []
             for row in record_reader:
                 path, md5_, size = row[:] + \
-                                   [None for i in xrange(len(row), 3)]
-                record_data.append([path, (md5_, size,)])
+                    [None for i in xrange(len(row), 3)]
+                record_data.append([path, (md5_, size, )])
             self.records[distinfo_dir] = dict(record_data)
 
     def tearDown(self):
@@ -240,7 +240,7 @@
         name = 'choxie'
         version = '2.0.0.9'
         dist_path = os.path.join(here, 'fake_dists',
-            distinfo_dirname(name, version))
+                                 distinfo_dirname(name, version))
         dist = Distribution(dist_path)
 
         self.assertEqual(dist.name, name)
@@ -264,9 +264,9 @@
         # Criteria to test against
         distinfo_name = 'grammar-1.0a4'
         distinfo_dir = os.path.join(self.fake_dists_path,
-            distinfo_name + '.dist-info')
+                                    distinfo_name + '.dist-info')
         true_path = [self.fake_dists_path, distinfo_name, \
-                     'grammar', 'utils.py']
+            'grammar', 'utils.py']
         true_path = relpath(os.path.join(*true_path), sys.prefix)
         false_path = [self.fake_dists_path, 'towel_stuff-0.1', 'towel_stuff',
             '__init__.py']
@@ -282,7 +282,7 @@
         distinfo_name = 'choxie-2.0.0.9'
         other_distinfo_name = 'grammar-1.0a4'
         distinfo_dir = os.path.join(self.fake_dists_path,
-            distinfo_name + '.dist-info')
+                                    distinfo_name + '.dist-info')
         dist = Distribution(distinfo_dir)
         # Test for known good file matches
         distinfo_files = [
@@ -301,9 +301,9 @@
 
         # Test an absolute path that is part of another distributions dist-info
         other_distinfo_file = os.path.join(self.fake_dists_path,
-            other_distinfo_name + '.dist-info', 'REQUESTED')
+                                           other_distinfo_name + '.dist-info', 'REQUESTED')
         self.assertRaises(DistutilsError, dist.get_distinfo_file,
-            other_distinfo_file)
+                          other_distinfo_file)
         # Test for a file that does not exist and should not exist
         self.assertRaises(DistutilsError, dist.get_distinfo_file, \
                           'ENTRYPOINTS')
@@ -312,7 +312,7 @@
         # 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')
+                                    distinfo_name + '.dist-info')
         dist = Distribution(distinfo_dir)
         # Test for the iteration of the raw path
         distinfo_record_paths = self.records[distinfo_dir].keys()
@@ -324,6 +324,16 @@
         found = [path for path in dist.get_distinfo_files(local=True)]
         self.assertEqual(sorted(found), sorted(distinfo_record_paths))
 
+    def test_get_resources_path(self):
+        distinfo_name = 'babar-0.1'
+        distinfo_dir = os.path.join(self.fake_dists_path,
+                                    distinfo_name + '.dist-info')
+        dist = Distribution(distinfo_dir)
+        resource_path = dist.get_resource_path('babar.png')
+        self.assertEqual(resource_path, 'babar.png')
+        self.assertRaises(KeyError, lambda: dist.get_resource_path('notexist'))
+
+
 
 class TestPkgUtilPEP376(support.LoggingCatcher, support.WarningsCatcher,
                         unittest.TestCase):
@@ -347,7 +357,7 @@
         # Given a name and a version, we expect the distinfo_dirname function
         # to return a standard distribution information directory name.
 
-        items = [  # (name, version, standard_dirname)
+        items = [# (name, version, standard_dirname)
             # Test for a very simple single word name and decimal
             # version number
             ('docutils', '0.5', 'docutils-0.5.dist-info'),
@@ -375,10 +385,10 @@
         for dist in dists:
             if not isinstance(dist, Distribution):
                 self.fail("item received was not a Distribution instance: "
-                    "%s" % type(dist))
+                          "%s" % type(dist))
             if dist.name in dict(fake_dists) and \
-               dist.path.startswith(self.fake_dists_path):
-                found_dists.append((dist.name, dist.metadata['version'],))
+                dist.path.startswith(self.fake_dists_path):
+                    found_dists.append((dist.name, dist.metadata['version'], ))
             else:
                 # check that it doesn't find anything more than this
                 self.assertFalse(dist.path.startswith(self.fake_dists_path))
@@ -389,9 +399,9 @@
 
         # Now, test if the egg-info distributions are found correctly as well
         fake_dists += [('bacon', '0.1'), ('cheese', '2.0.2'),
-                       ('coconuts-aster', '10.3'),
-                       ('banana', '0.4'), ('strawberry', '0.6'),
-                       ('truffles', '5.0'), ('nut', 'funkyversion')]
+            ('coconuts-aster', '10.3'),
+            ('banana', '0.4'), ('strawberry', '0.6'),
+            ('truffles', '5.0'), ('nut', 'funkyversion')]
         found_dists = []
 
         dists = [dist for dist in get_distributions(use_egg_info=True)]
@@ -401,8 +411,8 @@
                 self.fail("item received was not a Distribution or "
                           "EggInfoDistribution instance: %s" % type(dist))
             if dist.name in dict(fake_dists) and \
-               dist.path.startswith(self.fake_dists_path):
-                found_dists.append((dist.name, dist.metadata['version']))
+                dist.path.startswith(self.fake_dists_path):
+                    found_dists.append((dist.name, dist.metadata['version']))
             else:
                 self.assertFalse(dist.path.startswith(self.fake_dists_path))
 
@@ -453,7 +463,7 @@
         # Test the iteration of distributions that use a file.
         name = 'towel_stuff-0.1'
         path = os.path.join(self.fake_dists_path, name,
-            'towel_stuff', '__init__.py')
+                            'towel_stuff', '__init__.py')
         for dist in get_file_users(path):
             self.assertTrue(isinstance(dist, Distribution))
             self.assertEqual(dist.name, name)
@@ -484,7 +494,7 @@
 
         l = [dist.name for dist in provides_distribution('truffles', \
                                                          '!=1.1,<=2.0',
-                                                          use_egg_info=True)]
+                                                         use_egg_info=True)]
         checkLists(l, ['choxie', 'bacon', 'cheese'])
 
         l = [dist.name for dist in provides_distribution('truffles', '>1.0')]
@@ -557,29 +567,31 @@
         checkLists = lambda x, y: self.assertListEqual(sorted(x), sorted(y))
 
         eggs = [('bacon', '0.1'), ('banana', '0.4'), ('strawberry', '0.6'),
-                ('truffles', '5.0'), ('cheese', '2.0.2'),
-                ('coconuts-aster', '10.3'), ('nut', 'funkyversion')]
+            ('truffles', '5.0'), ('cheese', '2.0.2'),
+            ('coconuts-aster', '10.3'), ('nut', 'funkyversion')]
         dists = [('choxie', '2.0.0.9'), ('grammar', '1.0a4'),
-                 ('towel-stuff', '0.1')]
+            ('towel-stuff', '0.1'), ('babar', '0.1')]
 
         checkLists([], _yield_distributions(False, False))
 
         found = [(dist.name, dist.metadata['Version'])
-                for dist in _yield_distributions(False, True)
-                if dist.path.startswith(self.fake_dists_path)]
+            for dist in _yield_distributions(False, True)
+            if dist.path.startswith(self.fake_dists_path)]
         checkLists(eggs, found)
 
         found = [(dist.name, dist.metadata['Version'])
-                for dist in _yield_distributions(True, False)
-                if dist.path.startswith(self.fake_dists_path)]
+            for dist in _yield_distributions(True, False)
+            if dist.path.startswith(self.fake_dists_path)]
         checkLists(dists, found)
 
         found = [(dist.name, dist.metadata['Version'])
-                for dist in _yield_distributions(True, True)
-                if dist.path.startswith(self.fake_dists_path)]
+            for dist in _yield_distributions(True, True)
+            if dist.path.startswith(self.fake_dists_path)]
         checkLists(dists + eggs, found)
 
 
+
+
 def test_suite():
     suite = unittest.TestSuite()
     load = unittest.defaultTestLoader.loadTestsFromTestCase
diff --git a/distutils2/tests/test_datafiles.py b/distutils2/tests/test_datafiles.py
--- a/distutils2/tests/test_datafiles.py
+++ b/distutils2/tests/test_datafiles.py
@@ -2,13 +2,11 @@
 """Tests for distutils.data."""
 import os
 import sys
-from StringIO import StringIO
 
 from distutils2.tests import unittest, support, run_unittest
 from distutils2.datafiles import resources_dests, RICH_GLOB
-import re
-
-
+from distutils2._backport.pkgutil import resource_path, resource_open
+from distutils2.command.install_dist import install_dist
 
 
 class DataFilesTestCase(support.TempdirManager,
@@ -120,6 +118,42 @@
         self.maxDiff = None
         self.assertFindGlob(rules, spec)
 
+    def test_resource_open(self):
+        from distutils2._backport.sysconfig import _SCHEMES as sysconfig_SCHEMES
+        from distutils2._backport.sysconfig import _get_default_scheme
+            #dirty but hit marmoute
+
+        tempdir = self.mkdtemp()
+        
+        old_scheme = sysconfig_SCHEMES
+
+        sysconfig_SCHEMES.set(_get_default_scheme(), 'config',
+            tempdir)
+
+        pkg_dir, dist = self.create_dist()
+        dist_name = dist.metadata['name']
+
+        test_path = os.path.join(pkg_dir, 'test.cfg')
+        self.write_file(test_path, 'Config')
+        dist.data_files = {test_path : '{config}/test.cfg'}
+
+        cmd = install_dist(dist)
+        cmd.install_dir = os.path.join(pkg_dir, 'inst')
+        content = 'Config'        
+        
+        cmd.ensure_finalized()
+        cmd.run()
+
+        cfg_dest = os.path.join(tempdir, 'test.cfg')
+
+        self.assertEqual(resource_path(dist_name, test_path), cfg_dest)
+        self.assertRaises(KeyError, lambda: resource_path(dist_name, 'notexis'))
+
+        self.assertEqual(resource_open(dist_name, test_path).read(), content)
+        self.assertRaises(KeyError, lambda: resource_open(dist_name, 'notexis'))
+        
+        sysconfig_SCHEMES = old_scheme
+
 def test_suite():
     return unittest.makeSuite(DataFilesTestCase)
 

--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list