123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- # -*- coding: utf-8 -*-
- # Copyright (c) 2014-2016 Claudiu Popa <pcmanticore@gmail.com>
- # Copyright (c) 2014 Google, Inc.
- # Copyright (c) 2015 Florian Bruhin <me@the-compiler.org>
- # Copyright (c) 2015 Radosław Ganczarek <radoslaw@ganczarek.in>
-
- # Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
- # For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER
-
- """
- unit tests for module modutils (module manipulation utilities)
- """
- import email
- import os
- import sys
- import unittest
- from xml import etree
-
- import astroid
- from astroid.interpreter._import import spec
- from astroid import modutils
- from astroid.tests import resources
-
-
- def _get_file_from_object(obj):
- return modutils._path_from_filename(obj.__file__)
-
-
- class ModuleFileTest(unittest.TestCase):
- package = "mypypa"
-
- def tearDown(self):
- for k in list(sys.path_importer_cache):
- if 'MyPyPa' in k:
- del sys.path_importer_cache[k]
-
- def test_find_zipped_module(self):
- found_spec = spec.find_spec(
- [self.package], [resources.find('data/MyPyPa-0.1.0-py2.5.zip')])
- self.assertEqual(found_spec.type,
- spec.ModuleType.PY_ZIPMODULE)
- self.assertEqual(found_spec.location.split(os.sep)[-3:],
- ["data", "MyPyPa-0.1.0-py2.5.zip", self.package])
-
- def test_find_egg_module(self):
- found_spec = spec.find_spec(
- [self.package], [resources.find('data/MyPyPa-0.1.0-py2.5.egg')])
- self.assertEqual(found_spec.type,
- spec.ModuleType.PY_ZIPMODULE)
- self.assertEqual(found_spec.location.split(os.sep)[-3:],
- ["data", "MyPyPa-0.1.0-py2.5.egg", self.package])
-
-
- class LoadModuleFromNameTest(unittest.TestCase):
- """ load a python module from it's name """
-
- def test_knownValues_load_module_from_name_1(self):
- self.assertEqual(modutils.load_module_from_name('sys'), sys)
-
- def test_knownValues_load_module_from_name_2(self):
- self.assertEqual(modutils.load_module_from_name('os.path'), os.path)
-
- def test_raise_load_module_from_name_1(self):
- self.assertRaises(ImportError,
- modutils.load_module_from_name, 'os.path', use_sys=0)
-
-
- class GetModulePartTest(unittest.TestCase):
- """given a dotted name return the module part of the name"""
-
- def test_knownValues_get_module_part_1(self):
- self.assertEqual(modutils.get_module_part('astroid.modutils'),
- 'astroid.modutils')
-
- def test_knownValues_get_module_part_2(self):
- self.assertEqual(modutils.get_module_part('astroid.modutils.get_module_part'),
- 'astroid.modutils')
-
- def test_knownValues_get_module_part_3(self):
- """relative import from given file"""
- self.assertEqual(modutils.get_module_part('node_classes.AssName',
- modutils.__file__), 'node_classes')
-
- def test_knownValues_get_compiled_module_part(self):
- self.assertEqual(modutils.get_module_part('math.log10'), 'math')
- self.assertEqual(modutils.get_module_part('math.log10', __file__), 'math')
-
- def test_knownValues_get_builtin_module_part(self):
- self.assertEqual(modutils.get_module_part('sys.path'), 'sys')
- self.assertEqual(modutils.get_module_part('sys.path', '__file__'), 'sys')
-
- def test_get_module_part_exception(self):
- self.assertRaises(ImportError, modutils.get_module_part, 'unknown.module',
- modutils.__file__)
-
-
- class ModPathFromFileTest(unittest.TestCase):
- """ given an absolute file path return the python module's path as a list """
-
- def test_knownValues_modpath_from_file_1(self):
- from xml.etree import ElementTree
- self.assertEqual(modutils.modpath_from_file(ElementTree.__file__),
- ['xml', 'etree', 'ElementTree'])
-
- def test_knownValues_modpath_from_file_2(self):
- self.assertEqual(modutils.modpath_from_file('unittest_modutils.py',
- {os.getcwd(): 'arbitrary.pkg'}),
- ['arbitrary', 'pkg', 'unittest_modutils'])
-
- def test_raise_modpath_from_file_Exception(self):
- self.assertRaises(Exception, modutils.modpath_from_file, '/turlututu')
-
-
- class LoadModuleFromPathTest(resources.SysPathSetup, unittest.TestCase):
-
- def test_do_not_load_twice(self):
- modutils.load_module_from_modpath(['data', 'lmfp', 'foo'])
- modutils.load_module_from_modpath(['data', 'lmfp'])
- # pylint: disable=no-member; just-once is added by a test file dynamically.
- self.assertEqual(len(sys.just_once), 1)
- del sys.just_once
-
-
- class FileFromModPathTest(resources.SysPathSetup, unittest.TestCase):
- """given a mod path (i.e. splited module / package name), return the
- corresponding file, giving priority to source file over precompiled file
- if it exists"""
-
- def test_site_packages(self):
- filename = _get_file_from_object(modutils)
- result = modutils.file_from_modpath(['astroid', 'modutils'])
- self.assertEqual(os.path.realpath(result), os.path.realpath(filename))
-
- def test_std_lib(self):
- path = modutils.file_from_modpath(['os', 'path']).replace('.pyc', '.py')
- self.assertEqual(os.path.realpath(path),
- os.path.realpath(os.path.__file__.replace('.pyc', '.py')))
-
- def test_builtin(self):
- self.assertIsNone(modutils.file_from_modpath(['sys']))
-
- def test_unexisting(self):
- self.assertRaises(ImportError, modutils.file_from_modpath, ['turlututu'])
-
- def test_unicode_in_package_init(self):
- # file_from_modpath should not crash when reading an __init__
- # file with unicode characters.
- modutils.file_from_modpath(["data", "unicode_package", "core"])
-
-
- class GetSourceFileTest(unittest.TestCase):
-
- def test(self):
- filename = _get_file_from_object(os.path)
- self.assertEqual(modutils.get_source_file(os.path.__file__),
- os.path.normpath(filename))
-
- def test_raise(self):
- self.assertRaises(modutils.NoSourceFile, modutils.get_source_file, 'whatever')
-
-
- class StandardLibModuleTest(resources.SysPathSetup, unittest.TestCase):
- """
- return true if the module may be considered as a module from the standard
- library
- """
-
- def test_datetime(self):
- # This is an interesting example, since datetime, on pypy,
- # is under lib_pypy, rather than the usual Lib directory.
- self.assertTrue(modutils.is_standard_module('datetime'))
-
- def test_builtins(self):
- if sys.version_info < (3, 0):
- self.assertTrue(modutils.is_standard_module('__builtin__'))
- self.assertFalse(modutils.is_standard_module('builtins'))
- else:
- self.assertFalse(modutils.is_standard_module('__builtin__'))
- self.assertTrue(modutils.is_standard_module('builtins'))
-
- def test_builtin(self):
- self.assertTrue(modutils.is_standard_module('sys'))
- self.assertTrue(modutils.is_standard_module('marshal'))
-
- def test_nonstandard(self):
- self.assertFalse(modutils.is_standard_module('astroid'))
-
- def test_unknown(self):
- self.assertFalse(modutils.is_standard_module('unknown'))
-
- def test_4(self):
- self.assertTrue(modutils.is_standard_module('hashlib'))
- self.assertTrue(modutils.is_standard_module('pickle'))
- self.assertTrue(modutils.is_standard_module('email'))
- self.assertEqual(modutils.is_standard_module('io'),
- sys.version_info >= (2, 6))
- self.assertEqual(modutils.is_standard_module('StringIO'),
- sys.version_info < (3, 0))
- self.assertTrue(modutils.is_standard_module('unicodedata'))
-
- def test_custom_path(self):
- datadir = resources.find('')
- if datadir.startswith(modutils.EXT_LIB_DIR):
- self.skipTest('known breakage of is_standard_module on installed package')
-
- self.assertTrue(modutils.is_standard_module('data.module', (datadir,)))
- self.assertTrue(modutils.is_standard_module('data.module', (os.path.abspath(datadir),)))
-
- def test_failing_edge_cases(self):
- # using a subpackage/submodule path as std_path argument
- self.assertFalse(modutils.is_standard_module('xml.etree', etree.__path__))
- # using a module + object name as modname argument
- self.assertTrue(modutils.is_standard_module('sys.path'))
- # this is because only the first package/module is considered
- self.assertTrue(modutils.is_standard_module('sys.whatever'))
- self.assertFalse(modutils.is_standard_module('xml.whatever', etree.__path__))
-
-
- class IsRelativeTest(unittest.TestCase):
-
- def test_knownValues_is_relative_1(self):
- self.assertTrue(modutils.is_relative('utils', email.__path__[0]))
-
- def test_knownValues_is_relative_2(self):
- self.assertTrue(modutils.is_relative('ElementPath',
- etree.ElementTree.__file__))
-
- def test_knownValues_is_relative_3(self):
- self.assertFalse(modutils.is_relative('astroid', astroid.__path__[0]))
-
-
- class GetModuleFilesTest(unittest.TestCase):
-
- def test_get_module_files_1(self):
- package = resources.find('data/find_test')
- modules = set(modutils.get_module_files(package, []))
- expected = ['__init__.py', 'module.py', 'module2.py',
- 'noendingnewline.py', 'nonregr.py']
- self.assertEqual(modules,
- {os.path.join(package, x) for x in expected})
-
- def test_get_all_files(self):
- """test that list_all returns all Python files from given location
- """
- non_package = resources.find('data/notamodule')
- modules = modutils.get_module_files(non_package, [], list_all=True)
- self.assertEqual(
- modules,
- [os.path.join(non_package, 'file.py')],
- )
-
- def test_load_module_set_attribute(self):
- import xml.etree.ElementTree
- import xml
- del xml.etree.ElementTree
- del sys.modules['xml.etree.ElementTree']
- m = modutils.load_module_from_modpath(['xml', 'etree', 'ElementTree'])
- self.assertTrue(hasattr(xml, 'etree'))
- self.assertTrue(hasattr(xml.etree, 'ElementTree'))
- self.assertTrue(m is xml.etree.ElementTree)
-
-
- if __name__ == '__main__':
- unittest.main()
|