def __str__(self):
return '<%s %s>' % (self.__class__.__name__, self.name)
+ def _setup_item(self, item):
+ """Perform any required initialization before returning an item.
+ """
+ pass
+
def current(self):
if len(self) == 0:
return None
- return self[self._index]
+ item = self[self._index]
+ self._setup_item(item)
+ return item
def jump(self, index):
if len(self) == 0:
def previous(self):
self.jump(self._index - 1)
- def filter(self, keeper_fn=lambda item:True):
+ def filter(self, keeper_fn=lambda item:True, *args, **kwargs):
c = copy.deepcopy(self)
for item in reversed(c):
- if keeper_fn(item) != True:
+ c._setup_item(item)
+ if keeper_fn(item, *args, **kwargs) != True:
c.remove(item)
try: # attempt to maintain the same current item
c._index = c.index(self.current())
def __init__(self, drivers, name=None):
super(Playlist, self).__init__(name=name)
self.drivers = drivers
- self._loaded = [] # List of loaded curves, see :meth:`._load`.
+ self._loaded = [] # List of loaded curves, see :meth:`._setup_item`.
self._max_loaded = 100 # curves to hold in memory simultaneously.
def append_curve_by_path(self, path, info=None, identify=True):
self.append(c)
return c
- def current(self):
- curve = super(Playlist, self).current()
- self._load(curve)
- return curve
-
- def _load(self, curve):
+ def _setup_item(self, curve):
if curve != None and curve not in self._loaded:
if curve not in self:
self.append(curve)
super(FilePlaylist, self).__init__(drivers, name)
self.set_path(path)
self._digest = None
+ self._ignored_keys = [
+ 'experiment', # class instance, not very exciting.
+ ]
def set_path(self, path):
if path != None:
>>> c.info['note'] = 'The second curve'
>>> p.append(c)
>>> p.digest()
- "\xa1\x99\x8a\x99\xed\xad\x13'\xa7w\x12\x00\x07Z\xb3\xd0zN\xa2\xe1"
+ '\\\x14\x87\x88*q\xf8\xaa\xa7\x84f\x82\xa1S>\xfd3+\xd0o'
"""
string = self.flatten()
return hashlib.sha1(string).digest()
>>> print p.flatten() # doctest: +NORMALIZE_WHITESPACE +REPORT_UDIFF
<?xml version="1.0" encoding="utf-8"?>
<playlist index="0" note="An example playlist" version="0.1">
- <curve note="The first curve" path="../curve/one"/>
- <curve note="The second curve" path="../curve/two"/>
+ <curve note="The first curve" path="curve/one"/>
+ <curve note="The second curve" path="curve/two"/>
</playlist>
<BLANKLINE>
>>> print p.flatten(absolute_paths=True) # doctest: +NORMALIZE_WHITESPACE +REPORT_UDIFF
if absolute_paths == False:
path = os.path.relpath(
path,
- os.path.abspath(os.path.expanduser(self.path)))
+ os.path.dirname(
+ os.path.abspath(
+ os.path.expanduser(self.path))))
curve_element.setAttribute('path', path)
for key,value in curve.info.items():
+ if key in self._ignored_keys:
+ continue
curve_element.setAttribute(key, str(value))
string = doc.toprettyxml(encoding='utf-8')
root.unlink() # break circular references for garbage collection