#!/usr/bin/env python -tt
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import abc
import functools
import logging
import six
from singleton.singleton_meta import SingletonMeta
from worker.step.step_worker import StepWorker
logging.basicConfig(level=logging.INFO)
LOGGER = logging.getLogger(__name__)
@six.add_metaclass(abc.ABCMeta)
class BaseWorkflow(metaclass=SingletonMeta):
"""This is a base class for implementing filesystem workflow"""
@property
@abc.abstractmethod
def operation_cls(self):
pass
def __init__(self, *args, **kwargs):
self.operation_obj = self.operation_cls(*args, **kwargs)
def __getattr__(self, item):
"""
Transparently redirect an object's property and method calls to another object, while preserving the method metadata integrity.
Args:
item(text_type): property or method name
Raises:
AttributeError: if the property/method can't find from operation instance.
"""
attr = getattr(self.operation_obj, item)
return functools.wraps(attr)(lambda *args, **kwargs: attr(*args, **kwargs)) if callable(attr) else attr
@staticmethod
def log_step(desc):
"""
logging immediately step description in log
Args:
desc(text_type): the step description
"""
StepWorker(desc).run()