PageRenderTime 24ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/regressiontests/utils/module_loading.py

https://code.google.com/p/mango-py/
Python | 119 lines | 74 code | 23 blank | 22 comment | 1 complexity | 9e4181615fee7e5df5af9100a66b8a55 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. import os
  2. import sys
  3. from zipimport import zipimporter
  4. from django.utils import unittest
  5. from django.utils.importlib import import_module
  6. from django.utils.module_loading import module_has_submodule
  7. class DefaultLoader(unittest.TestCase):
  8. def test_loader(self):
  9. "Normal module existence can be tested"
  10. test_module = import_module('regressiontests.utils.test_module')
  11. # An importable child
  12. self.assertTrue(module_has_submodule(test_module, 'good_module'))
  13. mod = import_module('regressiontests.utils.test_module.good_module')
  14. self.assertEqual(mod.content, 'Good Module')
  15. # A child that exists, but will generate an import error if loaded
  16. self.assertTrue(module_has_submodule(test_module, 'bad_module'))
  17. self.assertRaises(ImportError, import_module, 'regressiontests.utils.test_module.bad_module')
  18. # A child that doesn't exist
  19. self.assertFalse(module_has_submodule(test_module, 'no_such_module'))
  20. self.assertRaises(ImportError, import_module, 'regressiontests.utils.test_module.no_such_module')
  21. # Don't be confused by caching of import misses
  22. import types # causes attempted import of regressiontests.utils.types
  23. self.assertFalse(module_has_submodule(sys.modules['regressiontests.utils'], 'types'))
  24. class EggLoader(unittest.TestCase):
  25. def setUp(self):
  26. self.old_path = sys.path[:]
  27. self.egg_dir = '%s/eggs' % os.path.dirname(__file__)
  28. def tearDown(self):
  29. sys.path = self.old_path
  30. sys.path_importer_cache.clear()
  31. sys.modules.pop('egg_module.sub1.sub2.bad_module', None)
  32. sys.modules.pop('egg_module.sub1.sub2.good_module', None)
  33. sys.modules.pop('egg_module.sub1.sub2', None)
  34. sys.modules.pop('egg_module.sub1', None)
  35. sys.modules.pop('egg_module.bad_module', None)
  36. sys.modules.pop('egg_module.good_module', None)
  37. sys.modules.pop('egg_module', None)
  38. def test_shallow_loader(self):
  39. "Module existence can be tested inside eggs"
  40. egg_name = '%s/test_egg.egg' % self.egg_dir
  41. sys.path.append(egg_name)
  42. egg_module = import_module('egg_module')
  43. # An importable child
  44. self.assertTrue(module_has_submodule(egg_module, 'good_module'))
  45. mod = import_module('egg_module.good_module')
  46. self.assertEqual(mod.content, 'Good Module')
  47. # A child that exists, but will generate an import error if loaded
  48. self.assertTrue(module_has_submodule(egg_module, 'bad_module'))
  49. self.assertRaises(ImportError, import_module, 'egg_module.bad_module')
  50. # A child that doesn't exist
  51. self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
  52. self.assertRaises(ImportError, import_module, 'egg_module.no_such_module')
  53. def test_deep_loader(self):
  54. "Modules deep inside an egg can still be tested for existence"
  55. egg_name = '%s/test_egg.egg' % self.egg_dir
  56. sys.path.append(egg_name)
  57. egg_module = import_module('egg_module.sub1.sub2')
  58. # An importable child
  59. self.assertTrue(module_has_submodule(egg_module, 'good_module'))
  60. mod = import_module('egg_module.sub1.sub2.good_module')
  61. self.assertEqual(mod.content, 'Deep Good Module')
  62. # A child that exists, but will generate an import error if loaded
  63. self.assertTrue(module_has_submodule(egg_module, 'bad_module'))
  64. self.assertRaises(ImportError, import_module, 'egg_module.sub1.sub2.bad_module')
  65. # A child that doesn't exist
  66. self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
  67. self.assertRaises(ImportError, import_module, 'egg_module.sub1.sub2.no_such_module')
  68. class TestFinder(object):
  69. def __init__(self, *args, **kwargs):
  70. self.importer = zipimporter(*args, **kwargs)
  71. def find_module(self, path):
  72. importer = self.importer.find_module(path)
  73. if importer is None:
  74. return
  75. return TestLoader(importer)
  76. class TestLoader(object):
  77. def __init__(self, importer):
  78. self.importer = importer
  79. def load_module(self, name):
  80. mod = self.importer.load_module(name)
  81. mod.__loader__ = self
  82. return mod
  83. class CustomLoader(EggLoader):
  84. """The Custom Loader test is exactly the same as the EggLoader, but
  85. it uses a custom defined Loader and Finder that is intentionally
  86. split into two classes. Although the EggLoader combines both functions
  87. into one class, this isn't required.
  88. """
  89. def setUp(self):
  90. super(CustomLoader, self).setUp()
  91. sys.path_hooks.insert(0, TestFinder)
  92. sys.path_importer_cache.clear()
  93. def tearDown(self):
  94. super(CustomLoader, self).tearDown()
  95. sys.path_hooks.pop(0)