def test_include_easyblocks_priority(self): """Test whether easyblocks included via include_easyblocks() get prioroity over others.""" test_easyblocks = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sandbox', 'easybuild', 'easyblocks') # make sure that test 'foo' easyblock is there import easybuild.easyblocks.foo foo_path = os.path.dirname(os.path.dirname(easybuild.easyblocks.foo.__file__)) self.assertTrue(os.path.samefile(foo_path, test_easyblocks)) # inject custom 'foo' easyblocks myeasyblocks = os.path.join(self.test_prefix, 'myeasyblocks') mkdir(myeasyblocks) # include __init__.py file that should be ignored, and shouldn't cause trouble (bug #1697) write_file(os.path.join(myeasyblocks, '__init__.py'), "# dummy init, should not get included") # 'undo' import of foo easyblock del sys.modules['easybuild.easyblocks.foo'] foo_easyblock_txt = '\n'.join([ "from easybuild.framework.easyblock import EasyBlock", "class EB_Foo(EasyBlock):", " pass", ]) write_file(os.path.join(myeasyblocks, 'foo.py'), foo_easyblock_txt) include_easyblocks(self.test_prefix, [os.path.join(myeasyblocks, 'foo.py')]) foo_pyc_path = easybuild.easyblocks.foo.__file__ foo_real_py_path = os.path.realpath(os.path.join(os.path.dirname(foo_pyc_path), 'foo.py')) self.assertFalse(os.path.samefile(os.path.dirname(foo_pyc_path), test_easyblocks)) self.assertTrue(os.path.samefile(foo_real_py_path, os.path.join(myeasyblocks, 'foo.py'))) # 'undo' import of foo easyblock del sys.modules['easybuild.easyblocks.foo']
def test_include_easyblocks_priority(self): """Test whether easyblocks included via include_easyblocks() get prioroity over others.""" test_easyblocks = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sandbox', 'easybuild', 'easyblocks') # make sure that test 'foo' easyblocks is there import easybuild.easyblocks.foo foo_path = os.path.dirname(os.path.dirname(easybuild.easyblocks.foo.__file__)) self.assertTrue(os.path.samefile(foo_path, test_easyblocks)) # inject custom 'foo' easyblocks myeasyblocks = os.path.join(self.test_prefix, 'myeasyblocks') mkdir(myeasyblocks) # include __init__.py file that should be ignored, and shouldn't cause trouble (bug #1697) write_file(os.path.join(myeasyblocks, '__init__.py'), "# dummy init, should not get included") # 'undo' import of foo easyblock del sys.modules['easybuild.easyblocks.foo'] foo_easyblock_txt = '\n'.join([ "from easybuild.framework.easyblock import EasyBlock", "class EB_Foo(EasyBlock):", " pass", ]) write_file(os.path.join(myeasyblocks, 'foo.py'), foo_easyblock_txt) include_easyblocks(self.test_prefix, [os.path.join(myeasyblocks, 'foo.py')]) foo_pyc_path = easybuild.easyblocks.foo.__file__ foo_real_py_path = os.path.realpath(os.path.join(os.path.dirname(foo_pyc_path), 'foo.py')) self.assertFalse(os.path.samefile(os.path.dirname(foo_pyc_path), test_easyblocks)) self.assertTrue(os.path.samefile(foo_real_py_path, os.path.join(myeasyblocks, 'foo.py'))) # 'undo' import of foo easyblock del sys.modules['easybuild.easyblocks.foo']
def _postprocess_include(self): """Postprocess --include options.""" # set up included easyblocks, module naming schemes and toolchains/toolchain components if self.options.include_easyblocks: include_easyblocks(self.tmpdir, self.options.include_easyblocks) if self.options.include_module_naming_schemes: include_module_naming_schemes(self.tmpdir, self.options.include_module_naming_schemes) if self.options.include_toolchains: include_toolchains(self.tmpdir, self.options.include_toolchains)
def test_include_easyblocks(self): """Test include_easyblocks().""" test_easyblocks = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sandbox', 'easybuild', 'easyblocks') # put a couple of custom easyblocks in place, to test myeasyblocks = os.path.join(self.test_prefix, 'myeasyblocks') mkdir(os.path.join(myeasyblocks, 'generic'), parents=True) # include __init__.py files that should be ignored, and shouldn't cause trouble (bug #1697) write_file(os.path.join(myeasyblocks, '__init__.py'), "# dummy init, should not get included") write_file(os.path.join(myeasyblocks, 'generic', '__init__.py'), "# dummy init, should not get included") myfoo_easyblock_txt = '\n'.join([ "from easybuild.easyblocks.generic.configuremake import ConfigureMake", "class EB_Foo(ConfigureMake):", " pass", ]) write_file(os.path.join(myeasyblocks, 'myfoo.py'), myfoo_easyblock_txt) mybar_easyblock_txt = '\n'.join([ "from easybuild.framework.easyblock import EasyBlock", "class Bar(EasyBlock):", " pass", ]) write_file(os.path.join(myeasyblocks, 'generic', 'mybar.py'), mybar_easyblock_txt) # hijack $HOME to test expanding ~ in locations passed to include_easyblocks os.environ['HOME'] = myeasyblocks # expand set of known easyblocks with our custom ones glob_paths = [os.path.join('~', '*'), os.path.join(myeasyblocks, '*/*.py')] included_easyblocks_path = include_easyblocks(self.test_prefix, glob_paths) expected_paths = ['__init__.py', 'easyblocks/__init__.py', 'easyblocks/myfoo.py', 'easyblocks/generic/__init__.py', 'easyblocks/generic/mybar.py'] for filepath in expected_paths: fullpath = os.path.join(included_easyblocks_path, 'easybuild', filepath) self.assertTrue(os.path.exists(fullpath), "%s exists" % fullpath) # path to included easyblocks should be prepended to Python search path self.assertEqual(sys.path[0], included_easyblocks_path) # importing custom easyblocks should work import easybuild.easyblocks.myfoo myfoo_pyc_path = easybuild.easyblocks.myfoo.__file__ myfoo_real_py_path = os.path.realpath(os.path.join(os.path.dirname(myfoo_pyc_path), 'myfoo.py')) self.assertTrue(os.path.samefile(up(myfoo_real_py_path, 1), myeasyblocks)) import easybuild.easyblocks.generic.mybar mybar_pyc_path = easybuild.easyblocks.generic.mybar.__file__ mybar_real_py_path = os.path.realpath(os.path.join(os.path.dirname(mybar_pyc_path), 'mybar.py')) self.assertTrue(os.path.samefile(up(mybar_real_py_path, 2), myeasyblocks)) # existing (test) easyblocks are unaffected import easybuild.easyblocks.foofoo foofoo_path = os.path.dirname(os.path.dirname(easybuild.easyblocks.foofoo.__file__)) self.assertTrue(os.path.samefile(foofoo_path, test_easyblocks))