<filename>mopidy_pummeluff/actions/base.py
'''
Python module for Mopidy Pummeluff base action.
'''

__all__ = (
    'Action',
)

from logging import getLogger
from inspect import getfullargspec

LOGGER = getLogger(__name__)


class Action:
    '''
    Base RFID tag class, which will implement the factory pattern in Python's
    own :py:meth:`__new__` method.
    '''

    @classmethod
    def execute(cls, core):
        '''
        Execute the action.

        :param mopidy.core.Core core: The mopidy core instance

        :raises NotImplementedError: When class method is not implemented
        '''
        name  = cls.__name__
        error = 'Missing execute class method in the %s class'
        LOGGER.error(error, name)
        raise NotImplementedError(error % name)

    def __init__(self, uid, alias=None, parameter=None):
        '''
        Concstructor.
        '''
        self.uid       = uid
        self.alias     = alias
        self.parameter = parameter
        self.scanned   = None

    def __str__(self):
        '''
        String representation of tag.

        :return: The alias
        :rtype: str
        '''
        return self.alias or self.uid

    def __repr__(self):
        '''
        Instance representation of tag.

        :return: The class name and UID
        :rtype: str
        '''
        identifier = self.alias or self.uid
        return f'<{self.__class__.__name__} {identifier}>'

    def __call__(self, core):
        '''
        Action method which is called when the tag is detected on the RFID
        reader.

        :param mopidy.core.Core core: The mopidy core instance
        '''
        args = [core]
        if self.parameter:
            args.append(self.parameter)
        self.execute(*args)

    def as_dict(self, include_scanned=False):
        '''
        Dict representation of the tag.

        :param bool include_scanned: Include scanned timestamp

        :return: The dict version of the tag
        :rtype: dict
        '''
        data = {
            'action_class': self.__class__.__name__,
            'uid': self.uid,
            'alias': self.alias or '',
            'parameter': self.parameter or '',
        }

        if include_scanned:
            data['scanned'] = self.scanned

        return data

    def validate(self):
        '''
        Validate parameter.

        :raises ValueError: When parameter is not allowed but defined
        '''
        parameterised = len(getfullargspec(self.execute).args) > 2

        if parameterised and not self.parameter:
            raise ValueError('Parameter required for this tag')

        if not parameterised and self.parameter:
            raise ValueError('No parameter allowed for this tag')

<filename>mopidy_pummeluff/actions/base.py
'''
Python module for Mopidy Pummeluff base action.
'''

__all__ = (
    'Action',
)

from logging import getLogger
from inspect import getfullargspec

LOGGER = getLogger(__name__)


class Action:
    '''
    Base RFID tag class, which will implement the factory pattern in Python's
    own :py:meth:`__new__` method.
    '''

    @classmethod
    def execute(cls, core):
        '''
        Execute the action.

        :param mopidy.core.Core core: The mopidy core instance

        :raises NotImplementedError: When class method is not implemented
        '''
        name  = cls.__name__
        error = 'Missing execute class method in the %s class'
        LOGGER.error(error, name)
        raise NotImplementedError(error % name)

    def __init__(self, uid, alias=None, parameter=None):
        '''
        Concstructor.
        '''
        self.uid       = uid
        self.alias     = alias
        self.parameter = parameter
        self.scanned   = None

    def __str__(self):
        '''
        String representation of tag.

        :return: The alias
        :rtype: str
        '''
        return self.alias or self.uid

    def __repr__(self):
        '''
        Instance representation of tag.

        :return: The class name and UID
        :rtype: str
        '''
        identifier = self.alias or self.uid
        return f'<{self.__class__.__name__} {identifier}>'

    def __call__(self, core):
        '''
        Action method which is called when the tag is detected on the RFID
        reader.

        :param mopidy.core.Core core: The mopidy core instance
        '''
        args = [core]
        if self.parameter:
            args.append(self.parameter)
        self.execute(*args)

    def as_dict(self, include_scanned=False):
        '''
        Dict representation of the tag.

        :param bool include_scanned: Include scanned timestamp

        :return: The dict version of the tag
        :rtype: dict
        '''
        data = {
            'action_class': self.__class__.__name__,
            'uid': self.uid,
            'alias': self.alias or '',
            'parameter': self.parameter or '',
        }

        if include_scanned:
            data['scanned'] = self.scanned

        return data

    def validate(self):
        '''
        Validate parameter.

        :raises ValueError: When parameter is not allowed but defined
        '''
        parameterised = len(getfullargspec(self.execute).args) > 2

        if parameterised and not self.parameter:
            raise ValueError('Parameter required for this tag')

        if not parameterised and self.parameter:
            raise ValueError('No parameter allowed for this tag')

Python module for Mopidy Pummeluff base action. Base RFID tag class, which will implement the factory pattern in Python's     own :py:meth:`__new__` method. Execute the action.          :param mopidy.core.Core core: The mopidy core instance          :raises NotImplementedError: When class method is not implemented Concstructor. String representation of tag.          :return: The alias         :rtype: str Instance representation of tag.          :return: The class name and UID         :rtype: str Action method which is called when the tag is detected on the RFID         reader.          :param mopidy.core.Core core: The mopidy core instance Dict representation of the tag.          :param bool include_scanned: Include scanned timestamp          :return: The dict version of the tag         :rtype: dict Validate parameter.          :raises ValueError: When parameter is not allowed but defined