fuel-qa/fuelweb_test/helpers/metaclasses.py
Alexey Stepanov fec8282ec4 Minor refactor
1. SingletonMeta -> modified to allow handling multiple classes and moved to metaclasses too.
2. @logwrap : process asserts too

Changes reason:
 @logwrap was changed during test debug (was assert in wrapped function
 and stacktrace was not enough for reason understand) and moved out of
 test changest due to not mandatory for this test.
 Pros: Now assert, raised in wrapped function is recorded in log with
 details.

 SingletonMeta: was changed as "nice to have" during work on plugin
 helpers. Later plugin helpers was moved out of SshManager, and all code
 changes was moved to this changeset.
 Pros: Single way for handling the same tasks in different places.
 Previously SshManager used Metaclass, which could not be reused for
 more, than one class and Environment used __new__ directly written
 in class code.

Related-Bug: #1518979
Related-Bug: #1519050

Change-Id: I798302879400747909229cc208f97a669f25bbf3
2016-01-15 11:57:32 +00:00

28 lines
982 B
Python

# Copyright 2016 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
class SingletonMeta(type):
"""Metaclass for Singleton
Main goals: not need to implement __new__ in singleton classes
"""
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(
SingletonMeta, cls).__call__(*args, **kwargs)
return cls._instances[cls]