test_install_lib.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. """Tests for distutils.command.install_data."""
  2. import importlib.util
  3. import os
  4. import sys
  5. from distutils.command.install_lib import install_lib
  6. from distutils.errors import DistutilsOptionError
  7. from distutils.extension import Extension
  8. from distutils.tests import support
  9. import pytest
  10. @support.combine_markers
  11. @pytest.mark.usefixtures('save_env')
  12. class TestInstallLib(
  13. support.TempdirManager,
  14. ):
  15. def test_finalize_options(self):
  16. dist = self.create_dist()[1]
  17. cmd = install_lib(dist)
  18. cmd.finalize_options()
  19. assert cmd.compile == 1
  20. assert cmd.optimize == 0
  21. # optimize must be 0, 1, or 2
  22. cmd.optimize = 'foo'
  23. with pytest.raises(DistutilsOptionError):
  24. cmd.finalize_options()
  25. cmd.optimize = '4'
  26. with pytest.raises(DistutilsOptionError):
  27. cmd.finalize_options()
  28. cmd.optimize = '2'
  29. cmd.finalize_options()
  30. assert cmd.optimize == 2
  31. @pytest.mark.skipif('sys.dont_write_bytecode')
  32. def test_byte_compile(self):
  33. project_dir, dist = self.create_dist()
  34. os.chdir(project_dir)
  35. cmd = install_lib(dist)
  36. cmd.compile = cmd.optimize = 1
  37. f = os.path.join(project_dir, 'foo.py')
  38. self.write_file(f, '# python file')
  39. cmd.byte_compile([f])
  40. pyc_file = importlib.util.cache_from_source('foo.py', optimization='')
  41. pyc_opt_file = importlib.util.cache_from_source(
  42. 'foo.py', optimization=cmd.optimize
  43. )
  44. assert os.path.exists(pyc_file)
  45. assert os.path.exists(pyc_opt_file)
  46. def test_get_outputs(self):
  47. project_dir, dist = self.create_dist()
  48. os.chdir(project_dir)
  49. os.mkdir('spam')
  50. cmd = install_lib(dist)
  51. # setting up a dist environment
  52. cmd.compile = cmd.optimize = 1
  53. cmd.install_dir = self.mkdtemp()
  54. f = os.path.join(project_dir, 'spam', '__init__.py')
  55. self.write_file(f, '# python package')
  56. cmd.distribution.ext_modules = [Extension('foo', ['xxx'])]
  57. cmd.distribution.packages = ['spam']
  58. cmd.distribution.script_name = 'setup.py'
  59. # get_outputs should return 4 elements: spam/__init__.py and .pyc,
  60. # foo.import-tag-abiflags.so / foo.pyd
  61. outputs = cmd.get_outputs()
  62. assert len(outputs) == 4, outputs
  63. def test_get_inputs(self):
  64. project_dir, dist = self.create_dist()
  65. os.chdir(project_dir)
  66. os.mkdir('spam')
  67. cmd = install_lib(dist)
  68. # setting up a dist environment
  69. cmd.compile = cmd.optimize = 1
  70. cmd.install_dir = self.mkdtemp()
  71. f = os.path.join(project_dir, 'spam', '__init__.py')
  72. self.write_file(f, '# python package')
  73. cmd.distribution.ext_modules = [Extension('foo', ['xxx'])]
  74. cmd.distribution.packages = ['spam']
  75. cmd.distribution.script_name = 'setup.py'
  76. # get_inputs should return 2 elements: spam/__init__.py and
  77. # foo.import-tag-abiflags.so / foo.pyd
  78. inputs = cmd.get_inputs()
  79. assert len(inputs) == 2, inputs
  80. def test_dont_write_bytecode(self, caplog):
  81. # makes sure byte_compile is not used
  82. dist = self.create_dist()[1]
  83. cmd = install_lib(dist)
  84. cmd.compile = True
  85. cmd.optimize = 1
  86. old_dont_write_bytecode = sys.dont_write_bytecode
  87. sys.dont_write_bytecode = True
  88. try:
  89. cmd.byte_compile([])
  90. finally:
  91. sys.dont_write_bytecode = old_dont_write_bytecode
  92. assert 'byte-compiling is disabled' in caplog.messages[0]