Skip to content

Commit da43ef7

Browse files
authored
Merge pull request #3073 from boegel/singleton_py3
correctly specify that ActiveMNS & co are singleton classes
2 parents 651087a + ecea633 commit da43ef7

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

easybuild/framework/easyconfig/easyconfig.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
from easybuild.tools.module_naming_scheme.utilities import avail_module_naming_schemes, det_full_ec_version
6868
from easybuild.tools.module_naming_scheme.utilities import det_hidden_modname, is_valid_module_name
6969
from easybuild.tools.modules import modules_tool
70-
from easybuild.tools.py2vs3 import OrderedDict, string_type
70+
from easybuild.tools.py2vs3 import OrderedDict, create_base_metaclass, string_type
7171
from easybuild.tools.systemtools import check_os_dependency
7272
from easybuild.tools.toolchain.toolchain import SYSTEM_TOOLCHAIN_NAME, is_system_toolchain
7373
from easybuild.tools.toolchain.toolchain import TOOLCHAIN_CAPABILITIES, TOOLCHAIN_CAPABILITY_CUDA
@@ -2212,10 +2212,12 @@ def fix_deprecated_easyconfigs(paths):
22122212
print_msg("\nAll done! Fixed %d easyconfigs (out of %d found).\n", fixed_cnt, cnt, prefix=False)
22132213

22142214

2215-
class ActiveMNS(object):
2216-
"""Wrapper class for active module naming scheme."""
2215+
# singleton metaclass: only one instance is created
2216+
BaseActiveMNS = create_base_metaclass('BaseActiveMNS', Singleton, object)
2217+
22172218

2218-
__metaclass__ = Singleton
2219+
class ActiveMNS(BaseActiveMNS):
2220+
"""Wrapper class for active module naming scheme."""
22192221

22202222
def __init__(self, *args, **kwargs):
22212223
"""Initialize logger."""

easybuild/tools/module_naming_scheme/mns.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,18 @@
3333
from easybuild.base import fancylogger
3434
from easybuild.tools.build_log import EasyBuildError
3535
from easybuild.tools.config import Singleton
36+
from easybuild.tools.py2vs3 import create_base_metaclass
3637

3738

3839
DEVEL_MODULE_SUFFIX = '-easybuild-devel'
3940

4041

41-
class ModuleNamingScheme(object):
42-
"""Abstract class for a module naming scheme implementation."""
42+
# singleton metaclass: only one instance is created
43+
BaseModuleNamingScheme = create_base_metaclass('BaseModuleNamingScheme', Singleton, object)
44+
4345

44-
# singleton metaclass: only one instance is created
45-
__metaclass__ = Singleton
46+
class ModuleNamingScheme(BaseModuleNamingScheme):
47+
"""Abstract class for a module naming scheme implementation."""
4648

4749
REQUIRED_KEYS = None
4850

easybuild/tools/package/utilities.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
from easybuild.tools.build_log import EasyBuildError
4343
from easybuild.tools.filetools import change_dir, which
4444
from easybuild.tools.package.package_naming_scheme.pns import PackageNamingScheme
45+
from easybuild.tools.py2vs3 import create_base_metaclass
4546
from easybuild.tools.run import run_cmd
4647
from easybuild.tools.utilities import get_subclasses, import_available_modules
4748

@@ -170,11 +171,14 @@ def check_pkg_support():
170171
raise EasyBuildError("Selected packaging tool '%s' not found", pkgtool)
171172

172173

173-
class ActivePNS(object):
174+
# singleton metaclass: only one instance is created
175+
BaseActivePNS = create_base_metaclass('BaseActivePNS', Singleton, object)
176+
177+
178+
class ActivePNS(BaseActivePNS):
174179
"""
175180
The wrapper class for Package Naming Schemes.
176181
"""
177-
__metaclass__ = Singleton
178182

179183
def __init__(self):
180184
"""Initialize logger and find available PNSes to load"""

test/framework/easyconfig.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1972,6 +1972,13 @@ def test_dep_graph_multi_deps(self):
19721972
except ImportError:
19731973
print("Skipping test_dep_graph, since pygraph is not available")
19741974

1975+
def test_ActiveMNS_singleton(self):
1976+
"""Make sure ActiveMNS is a singleton class."""
1977+
1978+
mns1 = ActiveMNS()
1979+
mns2 = ActiveMNS()
1980+
self.assertEqual(id(mns1), id(mns2))
1981+
19751982
def test_ActiveMNS_det_full_module_name(self):
19761983
"""Test det_full_module_name method of ActiveMNS."""
19771984
build_options = {

0 commit comments

Comments
 (0)