/Lib/distutils/tests/test_dist.py

http://unladen-swallow.googlecode.com/ · Python · 293 lines · 219 code · 48 blank · 26 comment · 21 complexity · 8dd2ca1ab80ce19c5498613f2d54bda6 MD5 · raw file

  1. # -*- coding: latin-1 -*-
  2. """Tests for distutils.dist."""
  3. import distutils.cmd
  4. import distutils.dist
  5. import os
  6. import StringIO
  7. import sys
  8. import unittest
  9. import warnings
  10. from test.test_support import TESTFN
  11. class test_dist(distutils.cmd.Command):
  12. """Sample distutils extension command."""
  13. user_options = [
  14. ("sample-option=", "S", "help text"),
  15. ]
  16. def initialize_options(self):
  17. self.sample_option = None
  18. class TestDistribution(distutils.dist.Distribution):
  19. """Distribution subclasses that avoids the default search for
  20. configuration files.
  21. The ._config_files attribute must be set before
  22. .parse_config_files() is called.
  23. """
  24. def find_config_files(self):
  25. return self._config_files
  26. class DistributionTestCase(unittest.TestCase):
  27. def setUp(self):
  28. self.argv = sys.argv[:]
  29. del sys.argv[1:]
  30. def tearDown(self):
  31. sys.argv[:] = self.argv
  32. def create_distribution(self, configfiles=()):
  33. d = TestDistribution()
  34. d._config_files = configfiles
  35. d.parse_config_files()
  36. d.parse_command_line()
  37. return d
  38. def test_command_packages_unspecified(self):
  39. sys.argv.append("build")
  40. d = self.create_distribution()
  41. self.assertEqual(d.get_command_packages(), ["distutils.command"])
  42. def test_command_packages_cmdline(self):
  43. from distutils.tests.test_dist import test_dist
  44. sys.argv.extend(["--command-packages",
  45. "foo.bar,distutils.tests",
  46. "test_dist",
  47. "-Ssometext",
  48. ])
  49. d = self.create_distribution()
  50. # let's actually try to load our test command:
  51. self.assertEqual(d.get_command_packages(),
  52. ["distutils.command", "foo.bar", "distutils.tests"])
  53. cmd = d.get_command_obj("test_dist")
  54. self.assert_(isinstance(cmd, test_dist))
  55. self.assertEqual(cmd.sample_option, "sometext")
  56. def test_command_packages_configfile(self):
  57. sys.argv.append("build")
  58. f = open(TESTFN, "w")
  59. try:
  60. print >>f, "[global]"
  61. print >>f, "command_packages = foo.bar, splat"
  62. f.close()
  63. d = self.create_distribution([TESTFN])
  64. self.assertEqual(d.get_command_packages(),
  65. ["distutils.command", "foo.bar", "splat"])
  66. # ensure command line overrides config:
  67. sys.argv[1:] = ["--command-packages", "spork", "build"]
  68. d = self.create_distribution([TESTFN])
  69. self.assertEqual(d.get_command_packages(),
  70. ["distutils.command", "spork"])
  71. # Setting --command-packages to '' should cause the default to
  72. # be used even if a config file specified something else:
  73. sys.argv[1:] = ["--command-packages", "", "build"]
  74. d = self.create_distribution([TESTFN])
  75. self.assertEqual(d.get_command_packages(), ["distutils.command"])
  76. finally:
  77. os.unlink(TESTFN)
  78. def test_write_pkg_file(self):
  79. # Check DistributionMetadata handling of Unicode fields
  80. my_file = os.path.join(os.path.dirname(__file__), 'f')
  81. klass = distutils.dist.Distribution
  82. dist = klass(attrs={'author': u'Mister Café',
  83. 'name': 'my.package',
  84. 'maintainer': u'Café Junior',
  85. 'description': u'Café torréfié',
  86. 'long_description': u'Héhéhé'})
  87. # let's make sure the file can be written
  88. # with Unicode fields. they are encoded with
  89. # PKG_INFO_ENCODING
  90. try:
  91. dist.metadata.write_pkg_file(open(my_file, 'w'))
  92. finally:
  93. if os.path.exists(my_file):
  94. os.remove(my_file)
  95. # regular ascii is of course always usable
  96. dist = klass(attrs={'author': 'Mister Cafe',
  97. 'name': 'my.package',
  98. 'maintainer': 'Cafe Junior',
  99. 'description': 'Cafe torrefie',
  100. 'long_description': 'Hehehe'})
  101. try:
  102. dist.metadata.write_pkg_file(open(my_file, 'w'))
  103. finally:
  104. if os.path.exists(my_file):
  105. os.remove(my_file)
  106. def test_empty_options(self):
  107. # an empty options dictionary should not stay in the
  108. # list of attributes
  109. klass = distutils.dist.Distribution
  110. # catching warnings
  111. warns = []
  112. def _warn(msg):
  113. warns.append(msg)
  114. old_warn = warnings.warn
  115. warnings.warn = _warn
  116. try:
  117. dist = klass(attrs={'author': 'xxx',
  118. 'name': 'xxx',
  119. 'version': 'xxx',
  120. 'url': 'xxxx',
  121. 'options': {}})
  122. finally:
  123. warnings.warn = old_warn
  124. self.assertEquals(len(warns), 0)
  125. class MetadataTestCase(unittest.TestCase):
  126. def test_simple_metadata(self):
  127. attrs = {"name": "package",
  128. "version": "1.0"}
  129. dist = distutils.dist.Distribution(attrs)
  130. meta = self.format_metadata(dist)
  131. self.assert_("Metadata-Version: 1.0" in meta)
  132. self.assert_("provides:" not in meta.lower())
  133. self.assert_("requires:" not in meta.lower())
  134. self.assert_("obsoletes:" not in meta.lower())
  135. def test_provides(self):
  136. attrs = {"name": "package",
  137. "version": "1.0",
  138. "provides": ["package", "package.sub"]}
  139. dist = distutils.dist.Distribution(attrs)
  140. self.assertEqual(dist.metadata.get_provides(),
  141. ["package", "package.sub"])
  142. self.assertEqual(dist.get_provides(),
  143. ["package", "package.sub"])
  144. meta = self.format_metadata(dist)
  145. self.assert_("Metadata-Version: 1.1" in meta)
  146. self.assert_("requires:" not in meta.lower())
  147. self.assert_("obsoletes:" not in meta.lower())
  148. def test_provides_illegal(self):
  149. self.assertRaises(ValueError,
  150. distutils.dist.Distribution,
  151. {"name": "package",
  152. "version": "1.0",
  153. "provides": ["my.pkg (splat)"]})
  154. def test_requires(self):
  155. attrs = {"name": "package",
  156. "version": "1.0",
  157. "requires": ["other", "another (==1.0)"]}
  158. dist = distutils.dist.Distribution(attrs)
  159. self.assertEqual(dist.metadata.get_requires(),
  160. ["other", "another (==1.0)"])
  161. self.assertEqual(dist.get_requires(),
  162. ["other", "another (==1.0)"])
  163. meta = self.format_metadata(dist)
  164. self.assert_("Metadata-Version: 1.1" in meta)
  165. self.assert_("provides:" not in meta.lower())
  166. self.assert_("Requires: other" in meta)
  167. self.assert_("Requires: another (==1.0)" in meta)
  168. self.assert_("obsoletes:" not in meta.lower())
  169. def test_requires_illegal(self):
  170. self.assertRaises(ValueError,
  171. distutils.dist.Distribution,
  172. {"name": "package",
  173. "version": "1.0",
  174. "requires": ["my.pkg (splat)"]})
  175. def test_obsoletes(self):
  176. attrs = {"name": "package",
  177. "version": "1.0",
  178. "obsoletes": ["other", "another (<1.0)"]}
  179. dist = distutils.dist.Distribution(attrs)
  180. self.assertEqual(dist.metadata.get_obsoletes(),
  181. ["other", "another (<1.0)"])
  182. self.assertEqual(dist.get_obsoletes(),
  183. ["other", "another (<1.0)"])
  184. meta = self.format_metadata(dist)
  185. self.assert_("Metadata-Version: 1.1" in meta)
  186. self.assert_("provides:" not in meta.lower())
  187. self.assert_("requires:" not in meta.lower())
  188. self.assert_("Obsoletes: other" in meta)
  189. self.assert_("Obsoletes: another (<1.0)" in meta)
  190. def test_obsoletes_illegal(self):
  191. self.assertRaises(ValueError,
  192. distutils.dist.Distribution,
  193. {"name": "package",
  194. "version": "1.0",
  195. "obsoletes": ["my.pkg (splat)"]})
  196. def format_metadata(self, dist):
  197. sio = StringIO.StringIO()
  198. dist.metadata.write_pkg_file(sio)
  199. return sio.getvalue()
  200. def test_custom_pydistutils(self):
  201. # fixes #2166
  202. # make sure pydistutils.cfg is found
  203. old = {}
  204. for env in ('HOME', 'HOMEPATH', 'HOMEDRIVE'):
  205. value = os.environ.get(env)
  206. old[env] = value
  207. if value is not None:
  208. del os.environ[env]
  209. if os.name == 'posix':
  210. user_filename = ".pydistutils.cfg"
  211. else:
  212. user_filename = "pydistutils.cfg"
  213. curdir = os.path.dirname(__file__)
  214. user_filename = os.path.join(curdir, user_filename)
  215. f = open(user_filename, 'w')
  216. f.write('.')
  217. f.close()
  218. try:
  219. dist = distutils.dist.Distribution()
  220. # linux-style
  221. if sys.platform in ('linux', 'darwin'):
  222. os.environ['HOME'] = curdir
  223. files = dist.find_config_files()
  224. self.assert_(user_filename in files)
  225. # win32-style
  226. if sys.platform == 'win32':
  227. # home drive should be found
  228. os.environ['HOME'] = curdir
  229. files = dist.find_config_files()
  230. self.assert_(user_filename in files,
  231. '%r not found in %r' % (user_filename, files))
  232. finally:
  233. for key, value in old.items():
  234. if value is None:
  235. continue
  236. os.environ[key] = value
  237. os.remove(user_filename)
  238. def test_suite():
  239. suite = unittest.TestSuite()
  240. suite.addTest(unittest.makeSuite(DistributionTestCase))
  241. suite.addTest(unittest.makeSuite(MetadataTestCase))
  242. return suite
  243. if __name__ == "__main__":
  244. unittest.main(defaultTest="test_suite")