Make export/restore state internal

- drop filename parameter
- make save_state/load_state internal
- remove save_state/load_state from docu and RPC.
- remove models load/save from docu
- build the config path
- folder for 'core' state files
- move restore_state-to-coverage-translation into a method
This commit is contained in:
Jens Luetjen 2016-01-14 19:56:38 +01:00
parent 4869619bb9
commit 606e87b1bb
5 changed files with 67 additions and 58 deletions

View File

@ -53,10 +53,6 @@ in core see :class:`~mopidy.core.CoreListener`.
.. automethod:: get_version
.. automethod:: save_state
.. automethod:: load_state
Tracklist controller
====================

View File

@ -87,13 +87,6 @@ Data model (de)serialization
.. autoclass:: mopidy.models.ModelJSONEncoder
Data model import/export
----------------------------
.. autofunction:: mopidy.models.storage.save
.. autofunction:: mopidy.models.storage.load
Data model field types
----------------------

View File

@ -18,7 +18,7 @@ from mopidy.core.mixer import MixerController
from mopidy.core.playback import PlaybackController
from mopidy.core.playlists import PlaylistsController
from mopidy.core.tracklist import TracklistController
from mopidy.internal import storage, validation, versioning
from mopidy.internal import path, storage, validation, versioning
from mopidy.internal.deprecation import deprecated_property
from mopidy.internal.models import CoreState
@ -144,24 +144,10 @@ class Core(
try:
coverage = []
if self._config and 'restore_state' in self._config['core']:
value = self._config['core']['restore_state']
if not value or 'off' == value:
pass
elif 'volume' == value:
coverage = ['volume']
elif 'load' == value:
coverage = ['tracklist', 'mode', 'volume', 'history']
elif 'last' == value:
coverage = ['tracklist', 'mode', 'play-last', 'volume',
'history']
elif 'play' == value:
coverage = ['tracklist', 'mode', 'play-always', 'volume',
'history']
else:
logger.warn('Unknown value for config '
'core.restore_state: %s', value)
coverage = self._config_to_coverage(
self._config['core']['restore_state'])
if len(coverage):
self.load_state('persistent', coverage)
self._load_state(coverage)
except Exception as e:
logger.warn('Restore state: Unexpected error: %s', str(e))
@ -170,23 +156,43 @@ class Core(
if self._config and 'restore_state' in self._config['core']:
amount = self._config['core']['restore_state']
if amount and 'off' != amount:
self.save_state('persistent')
self._save_state()
except Exception as e:
logger.warn('Export state: Unexpected error: %s', str(e))
logger.warn('Unexpected error while saving state: %s', str(e))
def save_state(self, name):
@staticmethod
def _config_to_coverage(value):
coverage = []
if not value or 'off' == value:
pass
elif 'volume' == value:
coverage = ['volume']
elif 'load' == value:
coverage = ['tracklist', 'mode', 'volume', 'history']
elif 'last' == value:
coverage = ['tracklist', 'mode', 'play-last', 'volume',
'history']
elif 'play' == value:
coverage = ['tracklist', 'mode', 'play-always', 'volume',
'history']
else:
logger.warn('Unknown value for config '
'core.restore_state: %s', value)
return coverage
def _get_data_dir(self):
# get or create data director for core
data_dir_path = bytes(
os.path.join(self._config['core']['data_dir'], 'core'))
path.get_or_create_dir(data_dir_path)
return data_dir_path
def _save_state(self):
"""
Save current state to disk.
:param name: a name (for later use with :meth:`load_state`)
:type name: str
"""
if not name:
raise TypeError('Missing file name.')
file_name = os.path.join(
self._config['core']['data_dir'], name)
file_name += '.state'
file_name = os.path.join(self._get_data_dir(), 'persistent.state')
logger.info('Save state to %s', file_name)
data = {}
@ -199,7 +205,7 @@ class Core(
storage.save(file_name, data)
logger.debug('Save state done.')
def load_state(self, name, coverage):
def _load_state(self, coverage):
"""
Restore state from disk.
@ -213,17 +219,11 @@ class Core(
- 'volume' set mixer volume
- 'history' restore history
:param name: a name (used previously with :meth:`save_state`)
:type path: str
:param coverage: amount of data to restore
:type coverage: list of string (see above)
"""
if not name:
raise TypeError('Missing file name.')
file_name = os.path.join(
self._config['core']['data_dir'], name)
file_name += '.state'
file_name = os.path.join(self._get_data_dir(), 'persistent.state')
logger.info('Load state from %s', file_name)
data = storage.load(file_name)

View File

@ -43,8 +43,6 @@ def make_jsonrpc_wrapper(core_actor):
objects={
'core.get_uri_schemes': core.Core.get_uri_schemes,
'core.get_version': core.Core.get_version,
'core.load_state': core.Core.load_state,
'core.save_state': core.Core.save_state,
'core.history': core.HistoryController,
'core.library': core.LibraryController,
'core.mixer': core.MixerController,
@ -57,8 +55,6 @@ def make_jsonrpc_wrapper(core_actor):
'core.describe': inspector.describe,
'core.get_uri_schemes': core_actor.get_uri_schemes,
'core.get_version': core_actor.get_version,
'core.load_state': core_actor.load_state,
'core.save_state': core_actor.save_state,
'core.history': core_actor.history,
'core.library': core_actor.library,
'core.mixer': core_actor.mixer,

View File

@ -54,7 +54,7 @@ class CoreActorExportRestoreTest(unittest.TestCase):
config = {
'core': {
'max_tracklist_length': 10000,
'restore_state': 'play',
'restore_state': 'last',
'data_dir': self.temp_dir,
}
}
@ -66,8 +66,32 @@ class CoreActorExportRestoreTest(unittest.TestCase):
pykka.ActorRegistry.stop_all()
shutil.rmtree(self.temp_dir)
def test_restore_on_start(self):
# cover mopidy.core.actor.on_start and .on_stop
# starting the actor by calling any function:
self.core.get_version()
pass
def test_export_state(self):
self.core.teardown()
# TODO: implement meaningful test
def test_restore_state(self):
self.core.setup()
# TODO: implement meaningful test
def test_export_coverage_none(self):
result = Core._config_to_coverage(None)
self.assertEqual(result, [])
result = Core._config_to_coverage('off')
self.assertEqual(result, [])
def test_export_coverage(self):
result = Core._config_to_coverage('volume')
self.assertEqual(result, ['volume'])
result = Core._config_to_coverage('load')
target = ['tracklist', 'mode', 'volume', 'history']
self.assertEqual(result, target)
result = Core._config_to_coverage('last')
target = ['tracklist', 'mode', 'play-last', 'volume', 'history']
self.assertEqual(result, target)
result = Core._config_to_coverage('play')
target = ['tracklist', 'mode', 'play-always', 'volume', 'history']
self.assertEqual(result, target)