"""Basic class for extraction."""
import os
import cPickle as pickle
from abc import ABCMeta, abstractmethod
from ..utils.validation import check_filename_pickle_load
from ..utils.validation import check_filename_pickle_save
class BaseExtraction(object):
    """Basic class for extraction.
    Warning: This class should not be used directly. Use the derive classes
    instead.
    """
    __metaclass__ = ABCMeta
    @abstractmethod
    def __init__(self):
        """Constructor"""
        pass
    @abstractmethod
    def fit(self, modality, ground_truth=None, cat=None):
        """Find parameters for later transformation."""
        raise NotImplementedError
    @abstractmethod
    def transform(self, modality, ground_truth=None, cat=None):
        """Extract the data from the given modality."""
        raise NotImplementedError
    @staticmethod
    def load_from_pickles(filename):
        """ Function to load a normalization object.
        Parameters
        ----------
        filename : str
            Filename to the pickle file. The extension should be `.p`.
        Returns
        -------
        bpp : object
            Returns the loaded object.
        """
        # Check the consistency of the filename
        filename = check_filename_pickle_load(filename)
        # Load the pickle
        bpp = pickle.load(open(filename, 'rb'))
        return bpp
    def save_to_pickles(self, filename):
        """ Function to save a normalizatio object using pickles.
        Parameters
        ----------
        filename : str
            Filename to the pickle file. The extension should be `.p`.
        Returns
        -------
        None
        """
        # We need to check that the directory where the file will be exist
        dir_pickle = os.path.dirname(filename)
        if not os.path.exists(dir_pickle):
            os.makedirs(dir_pickle)
        # Check the consistency of the filename
        filename = check_filename_pickle_save(filename)
        # Create the pickle file
        pickle.dump(self, open(filename, 'wb'))
        return None