Source code for pluginsmanager.observer.autosaver.autosaver

# Copyright 2017 SrMouraSilva
#
# 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.

from pathlib import Path

from pluginsmanager.banks_manager import BanksManager
from pluginsmanager.observer.autosaver.banks_files import BanksFiles
from pluginsmanager.observer.autosaver.index_file import IndexFile
from pluginsmanager.observer.update_type import UpdateType
from pluginsmanager.observer.updates_observer import UpdatesObserver


[docs]class Autosaver(UpdatesObserver): """ The UpdatesObserver :class:`.Autosaver` allows save any changes automatically in json data files. Save all plugins changes in json files in a specified path. It also allows loading of saved files:: >>> system_effect = SystemEffect('system', ('capture_1', 'capture_2'), ('playback_1', 'playback_2')) >>> >>> autosaver = Autosaver('my/path/data/') >>> banks_manager = autosaver.load(system_effect) When loads data with :class:`.Autosaver`, the autosaver has registered in observers of the banks_manager generated:: >>> autosaver in banks_manager.observers True For manual registering in :class:`.BanksManager` uses :func:`~pluginsmanager.banks_manager.BanksManager.register()`:: >>> banks_manager = BanksManager() >>> autosaver = Autosaver('my/path/data/') >>> autosaver in banks_manager.observers False >>> banks_manager.register(autosaver) >>> autosaver in banks_manager.observers True After registered, any changes in :class:`.Bank`, :class:`.Pedalboard`, :class:`.Effect`, :class:`~pluginsmanager.model.connection.Connection` or :class:`.Param` which belong to the structure of :class:`.BanksManager` instance are persisted automatically by :class:`.Autosaver`:: >>> banks_manager = BanksManager() >>> banks_manager.register(autosaver) >>> my_bank = Bank('My bank') >>> banks_manager.append(my_bank) >>> # The bank will be added in banksmanger >>> # and now is observable (and persisted) by autosaver It's possible disables autosaver for saves manually:: >>> autosaver.auto_save = False >>> autosaver.save(banks_manager) # save() method saves all banks data :param string data_path: Path that banks will be saved (each bank in one file) :param bool auto_save: Auto save any change? """
[docs] def __init__(self, data_path, auto_save=True): super().__init__() self.data_path = Path(data_path) self.index_file = IndexFile(self.data_path / Path('index_file')) self.banks_files = BanksFiles(self.data_path) self.auto_save = auto_save
[docs] def load(self, system_effect): """ Return a :class:`.BanksManager` instance contains the banks present in :attr:`~pluginsmanager.observer.autosaver.autosaver.Autosaver.data_path` :param SystemEffect system_effect: SystemEffect used in pedalboards :return BanksManager: :class:`.BanksManager` with banks persisted in :attr:`~pluginsmanager.observer.autosaver.autosaver.Autosaver.data_path` """ banks = self.banks_files.load(system_effect) banks_ordered = self.index_file.load(banks) manager = BanksManager() manager.register(self) for bank in banks_ordered: manager.append(bank) bank.manager = manager return manager
[docs] def save(self, banks_manager): """ Save all data from a banks_manager :param BanksManager banks_manager: BanksManager that your banks data will be persisted """ self.banks_files.delete_all_banks() self.banks_files.save(banks_manager) self.index_file.save(banks_manager)
[docs] def on_bank_updated(self, bank, update_type, index, origin, **kwargs): if not self.auto_save: return if update_type == UpdateType.DELETED: self.banks_files.delete_bank(bank) elif update_type == UpdateType.CREATED: self.banks_files.save_bank(bank) elif update_type == UpdateType.UPDATED: self.banks_files.save_bank(bank) old_bank = kwargs['old'] if old_bank.manager is None: self.banks_files.delete_bank(old_bank) self.index_file.save(origin)
[docs] def on_pedalboard_updated(self, pedalboard, update_type, index, origin, **kwargs): if not self.auto_save: return if update_type == UpdateType.DELETED: self.banks_files.save_bank(origin) else: self.banks_files.save_bank(pedalboard.bank)
[docs] def on_effect_updated(self, effect, update_type, index, origin, **kwargs): if not self.auto_save: return pedalboard = origin self.banks_files.save_bank(pedalboard.bank)
[docs] def on_effect_status_toggled(self, effect, **kwargs): if not self.auto_save: return self.banks_files.save_bank(effect.pedalboard.bank)
[docs] def on_param_value_changed(self, param, **kwargs): if not self.auto_save: return self.banks_files.save_bank(param.effect.pedalboard.bank)
[docs] def on_connection_updated(self, connection, update_type, pedalboard, **kwargs): if not self.auto_save: return self.banks_files.save_bank(pedalboard.bank)