From 1b564162d67761a1107a1802f8e7751f9dda2195 Mon Sep 17 00:00:00 2001 From: Mathieu Leduc-Hamel Date: Sat, 21 Apr 2012 17:42:52 -0400 Subject: #14270: Fixes to add dest_dir params working when using install_from_infos --- distutils2/install.py | 18 +++++++++--------- distutils2/tests/test_install.py | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/distutils2/install.py b/distutils2/install.py index 85af932..ee6b022 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 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. -- cgit v1.2.1 From 20e1ef7ac5e1c470f2327a5aaa38e75a219ad491 Mon Sep 17 00:00:00 2001 From: Guillaume Pratte Date: Sat, 21 Apr 2012 17:43:54 -0400 Subject: #13166: Implement __str__ on Distribution and EggInfoDistribution, use for pysetup list, pysetup graph and installation log --- CONTRIBUTORS.txt | 1 + distutils2/database.py | 6 ++++++ distutils2/depgraph.py | 10 ++++------ distutils2/install.py | 2 +- distutils2/run.py | 2 +- distutils2/tests/test_database.py | 21 ++++++++++++++++++--- 6 files changed, 31 insertions(+), 11 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 '' % ( 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 '' % ( 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/depgraph.py b/distutils2/depgraph.py index 30a2528..abaefc2 100644 --- a/distutils2/depgraph.py +++ b/distutils2/depgraph.py @@ -71,18 +71,16 @@ class DependencyGraph: """ self.missing[distribution].append(requirement) - def _repr_dist(self, dist): - return '%r %s' % (dist.name, dist.version) - def repr_node(self, dist, level=1): """Prints only a subgraph""" output = [] - output.append(self._repr_dist(dist)) + output.append(str(dist)) + # XXX: this code needs cleanup for other, label in self.adjacency_list[dist]: - dist = self._repr_dist(other) + dist = str(other) if label is not None: dist = '%s [%s]' % (dist, label) - output.append(' ' * level + str(dist)) + output.append(' ' * level + dist) suboutput = self.repr_node(other, level + 1) subs = suboutput.split('\n') output.extend(subs[1:]) diff --git a/distutils2/install.py b/distutils2/install.py index ee6b022..20bcacf 100644 --- a/distutils2/install.py +++ b/distutils2/install.py @@ -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) @@ -100,6 +102,17 @@ class CommonDistributionTests(FakeDistsMixin): # just check that the class name is in the repr 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__ @@ -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() -- cgit v1.2.1 From 6076dd84aaa4d4313be65a171331c91bd9412019 Mon Sep 17 00:00:00 2001 From: Guillaume Pratte Date: Sat, 21 Apr 2012 18:25:22 -0400 Subject: remove changes that modified output of pysetup graph: tests are needed first --- distutils2/depgraph.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/distutils2/depgraph.py b/distutils2/depgraph.py index abaefc2..30a2528 100644 --- a/distutils2/depgraph.py +++ b/distutils2/depgraph.py @@ -71,16 +71,18 @@ class DependencyGraph: """ self.missing[distribution].append(requirement) + def _repr_dist(self, dist): + return '%r %s' % (dist.name, dist.version) + def repr_node(self, dist, level=1): """Prints only a subgraph""" output = [] - output.append(str(dist)) - # XXX: this code needs cleanup + output.append(self._repr_dist(dist)) for other, label in self.adjacency_list[dist]: - dist = str(other) + dist = self._repr_dist(other) if label is not None: dist = '%s [%s]' % (dist, label) - output.append(' ' * level + dist) + output.append(' ' * level + str(dist)) suboutput = self.repr_node(other, level + 1) subs = suboutput.split('\n') output.extend(subs[1:]) -- cgit v1.2.1