[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