Correct pickling/unpickling of dynamic specs

Previously, __reduce__ was returning a reduction of the class, not the
instance.
This commit is contained in:
Matthew Tretter 2012-12-05 00:22:39 -05:00
parent 938e2e178b
commit 0ec6067c8d

View file

@ -143,15 +143,22 @@ class ImageSpec(BaseImageSpec):
return content return content
def create_spec_class(class_attrs):
cls = type('Spec', (DynamicSpec,), class_attrs)
cls._spec_attrs = class_attrs
return cls
def create_spec(class_attrs, kwargs):
cls = create_spec_class(class_attrs)
return cls(**kwargs)
class DynamicSpec(ImageSpec): class DynamicSpec(ImageSpec):
def __reduce__(self): def __reduce__(self):
return (create_spec_class, (self._spec_attrs,)) kwargs = dict(self.kwargs)
kwargs['source_file'] = self.source_file
return (create_spec, (self._spec_attrs, kwargs))
def create_spec_class(spec_attrs):
cls = type('Spec', (DynamicSpec,), spec_attrs)
cls._spec_attrs = spec_attrs
return cls
class SpecHost(object): class SpecHost(object):
@ -169,7 +176,6 @@ class SpecHost(object):
raise TypeError('You can provide either an image spec or' raise TypeError('You can provide either an image spec or'
' arguments for the ImageSpec constructor, but not both.') ' arguments for the ImageSpec constructor, but not both.')
else: else:
# spec = type('Spec', (ImageSpec,), spec_attrs) # TODO: Base class name on spec id?
spec = create_spec_class(spec_attrs) spec = create_spec_class(spec_attrs)
self._original_spec = spec self._original_spec = spec