summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Courteau <j_courteau@hotmail.com>2012-05-12 14:23:20 -0400
committerJulien Courteau <j_courteau@hotmail.com>2012-05-12 14:23:20 -0400
commit42eb0c19439494044dde68a7f75c28e746bc6b0d (patch)
treee34cb1797ee62497018f2605e25094713eda5353
parent5d5463009a93746b987f941b5698cf18ff6ec4fa (diff)
parent6076dd84aaa4d4313be65a171331c91bd9412019 (diff)
downloaddisutils2-42eb0c19439494044dde68a7f75c28e746bc6b0d.tar.gz
merge #1364
-rw-r--r--CONTRIBUTORS.txt1
-rw-r--r--distutils2/database.py6
-rw-r--r--distutils2/install.py20
-rw-r--r--distutils2/run.py2
-rw-r--r--distutils2/tests/test_database.py21
-rw-r--r--distutils2/tests/test_install.py22
6 files changed, 58 insertions, 14 deletions
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
index cc84676..e33eb16 100644
--- a/CONTRIBUTORS.txt
+++ b/CONTRIBUTORS.txt
@@ -59,6 +59,7 @@ Thanks to:
- Gaƫl Pasgrimaud
- George Peristerakis
- Mathieu Perreault
+- Guillaume Pratte
- Sean Reifschneider
- Antoine Reversat
- Arc Riley
diff --git a/distutils2/database.py b/distutils2/database.py
index 6fb30ce..677ef2b 100644
--- a/distutils2/database.py
+++ b/distutils2/database.py
@@ -161,6 +161,9 @@ class Distribution(object):
return '<Distribution %r %s at %r>' % (
self.name, self.version, self.path)
+ def __str__(self):
+ return "%s %s" % (self.name, self.version)
+
def _get_records(self, local=False):
results = []
record = self.get_distinfo_file('RECORD')
@@ -365,6 +368,9 @@ class EggInfoDistribution(object):
return '<EggInfoDistribution %r %s at %r>' % (
self.name, self.version, self.path)
+ def __str__(self):
+ return "%s %s" % (self.name, self.version)
+
def list_installed_files(self, local=False):
def _md5(path):
diff --git a/distutils2/install.py b/distutils2/install.py
index 85af932..20bcacf 100644
--- a/distutils2/install.py
+++ b/distutils2/install.py
@@ -58,7 +58,7 @@ def _move_files(files, destination):
yield old, new
-def _run_distutils_install(path):
+def _run_distutils_install(path, dest):
# backward compat: using setuptools or plain-distutils
cmd = '%s setup.py install --record=%s'
record_file = os.path.join(path, 'RECORD')
@@ -69,7 +69,7 @@ def _run_distutils_install(path):
egginfo_to_distinfo(record_file, remove_egginfo=True)
-def _run_setuptools_install(path):
+def _run_setuptools_install(path, dest):
cmd = '%s setup.py install --record=%s --single-version-externally-managed'
record_file = os.path.join(path, 'RECORD')
@@ -80,12 +80,12 @@ def _run_setuptools_install(path):
egginfo_to_distinfo(record_file, remove_egginfo=True)
-def _run_packaging_install(path):
+def _run_packaging_install(path, dest):
# XXX check for a valid setup.cfg?
dist = Distribution()
dist.parse_config_files()
try:
- dist.run_command('install_dist')
+ dist.run_command('install_dist', dict(prefix=(None,dest)))
name = dist.metadata['Name']
return database.get_distribution(name) is not None
except (IOError, os.error, PackagingError, CCompilerError), msg:
@@ -106,7 +106,7 @@ def _install_dist(dist, path):
if where is None:
raise ValueError('Cannot locate the unpacked archive')
- return _run_install_from_archive(where)
+ return _run_install_from_archive(where, path)
def install_local_project(path):
@@ -134,14 +134,14 @@ def install_local_project(path):
return False
-def _run_install_from_archive(source_dir):
+def _run_install_from_archive(source_dir, dest_dir):
# XXX need a better way
for item in os.listdir(source_dir):
fullpath = os.path.join(source_dir, item)
if os.path.isdir(fullpath):
source_dir = fullpath
break
- return _run_install_from_dir(source_dir)
+ return _run_install_from_dir(source_dir, dest_dir)
install_methods = {
@@ -150,7 +150,7 @@ install_methods = {
'distutils': _run_distutils_install}
-def _run_install_from_dir(source_dir):
+def _run_install_from_dir(source_dir, destination_dir=None):
old_dir = os.getcwd()
os.chdir(source_dir)
install_method = get_install_method(source_dir)
@@ -158,7 +158,7 @@ def _run_install_from_dir(source_dir):
try:
func = install_methods[install_method]
try:
- func(source_dir)
+ func(source_dir, destination_dir)
return True
except ValueError, err:
# failed to install
@@ -183,7 +183,7 @@ def install_dists(dists, path, paths=None):
installed_dists = []
for dist in dists:
- logger.info('Installing %r %s...', dist.name, dist.version)
+ logger.info('Installing %s...', dist)
try:
_install_dist(dist, path)
installed_dists.append(dist)
diff --git a/distutils2/run.py b/distutils2/run.py
index 27f1fd1..f845dbc 100644
--- a/distutils2/run.py
+++ b/distutils2/run.py
@@ -308,7 +308,7 @@ def _list(dispatcher, args, **kw):
number = 0
for dist in results:
- print '%r %s (from %r)' % (dist.name, dist.version, dist.path)
+ print "%s (from %r)" % (dist, dist.path)
number += 1
if number == 0:
diff --git a/distutils2/tests/test_database.py b/distutils2/tests/test_database.py
index 09db9ef..6975258 100644
--- a/distutils2/tests/test_database.py
+++ b/distutils2/tests/test_database.py
@@ -80,12 +80,14 @@ class CommonDistributionTests(FakeDistsMixin):
attributes are used in test methods. See source code for details.
"""
+ def _get_dist_path(self, distdir):
+ here = os.path.abspath(os.path.dirname(__file__))
+ return os.path.join(here, 'fake_dists', distdir)
+
def test_instantiation(self):
# check that useful attributes are here
name, version, distdir = self.sample_dist
- here = os.path.abspath(os.path.dirname(__file__))
- dist_path = os.path.join(here, 'fake_dists', distdir)
-
+ dist_path = self._get_dist_path(distdir)
dist = self.dist = self.cls(dist_path)
self.assertEqual(dist.path, dist_path)
self.assertEqual(dist.name, name)
@@ -101,6 +103,17 @@ class CommonDistributionTests(FakeDistsMixin):
self.assertIn(self.cls.__name__, repr(dist))
@requires_zlib
+ def test_str(self):
+ name, version, distdir = self.sample_dist
+ dist = self.cls(self._get_dist_path(distdir))
+ self.assertEqual(name, dist.name)
+ # Sanity test: dist.name is unicode,
+ # but str output contains no u prefix.
+ self.assertIsInstance(dist.name, unicode)
+ self.assertEqual(version, dist.version)
+ self.assertEqual(str(dist), self.expected_str_output)
+
+ @requires_zlib
def test_comparison(self):
# tests for __eq__ and __hash__
dist = self.cls(self.dirs[0])
@@ -128,6 +141,7 @@ class TestDistribution(CommonDistributionTests, unittest.TestCase):
cls = Distribution
sample_dist = 'choxie', '2.0.0.9', 'choxie-2.0.0.9.dist-info'
+ expected_str_output = 'choxie 2.0.0.9'
def setUp(self):
super(TestDistribution, self).setUp()
@@ -265,6 +279,7 @@ class TestEggInfoDistribution(CommonDistributionTests,
cls = EggInfoDistribution
sample_dist = 'bacon', '0.1', 'bacon-0.1.egg-info'
+ expected_str_output = 'bacon 0.1'
def setUp(self):
super(TestEggInfoDistribution, self).setUp()
diff --git a/distutils2/tests/test_install.py b/distutils2/tests/test_install.py
index cb1d499..f613b22 100644
--- a/distutils2/tests/test_install.py
+++ b/distutils2/tests/test_install.py
@@ -1,6 +1,8 @@
"""Tests for the distutils2.install module."""
import os
import logging
+import sys
+
from tempfile import mkstemp
from distutils2 import install
@@ -258,6 +260,26 @@ class TestInstall(LoggingCatcher, TempdirManager, unittest.TestCase):
for key in expect:
self.assertEqual(expect[key], dict1[key])
+ def test_install_custom_dir(self):
+ dest = self.mkdtemp()
+ src = self.mkdtemp()
+
+ project_dir, dist = self.create_dist(
+ name='Spamlib', version='0.1',
+ data_files={'spamd': '{scripts}/spamd'})
+
+ dist.name = MagicMock(return_value='Spamlib')
+ dist.version = MagicMock(return_value='0.1')
+ dist.unpack = MagicMock(return_value=project_dir)
+
+ self.write_file([project_dir, 'setup.cfg'],
+ ("[metadata]\n"
+ "name = mypackage\n"
+ "version = 0.1.0\n"))
+
+ install.install_from_infos(dest, install=[dist])
+ self.assertEqual(len(os.listdir(dest)), 1)
+
def test_install_dists_rollback(self):
# if one of the distribution installation fails, call uninstall on all
# installed distributions.