Loading django/utils/functional.py +9 −0 Original line number Diff line number Diff line Loading @@ -305,6 +305,15 @@ class SimpleLazyObject(LazyObject): def __reduce__(self): return (self.__newobj__, (self.__class__,), self.__getstate__()) # Return a meaningful representation of the lazy object for debugging # without evaluating the wrapped object. def __repr__(self): if self._wrapped is empty: repr_attr = self._setupfunc else: repr_attr = self._wrapped return '<SimpleLazyObject: %r>' % repr_attr # Need to pretend to be the wrapped class, for the sake of objects that care # about this (especially in equality tests) __class__ = property(new_method_proxy(operator.attrgetter("__class__"))) Loading docs/releases/1.6.txt +3 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,9 @@ Minor features :setting:`TEMPLATE_STRING_IF_INVALID` for variables not present in the context, just like other template constructs. * SimpleLazyObjects will now present more helpful representations in shell debugging situations. Backwards incompatible changes in 1.6 ===================================== Loading tests/utils_tests/simplelazyobject.py +12 −4 Original line number Diff line number Diff line Loading @@ -59,10 +59,18 @@ class TestUtilsSimpleLazyObject(TestCase): hash(SimpleLazyObject(complex_object))) def test_repr(self): # For debugging, it will really confuse things if there is no clue that # SimpleLazyObject is actually a proxy object. So we don't # proxy __repr__ self.assertTrue("SimpleLazyObject" in repr(SimpleLazyObject(complex_object))) # First, for an unevaluated SimpleLazyObject x = SimpleLazyObject(complex_object) # __repr__ contains __repr__ of setup function and does not evaluate # the SimpleLazyObject self.assertEqual("<SimpleLazyObject: %r>" % complex_object, repr(x)) self.assertEqual(empty, x._wrapped) # Second, for an evaluated SimpleLazyObject name = x.name # evaluate self.assertTrue(isinstance(x._wrapped, _ComplexObject)) # __repr__ contains __repr__ of wrapped object self.assertEqual("<SimpleLazyObject: %r>" % x._wrapped, repr(x)) def test_bytes(self): self.assertEqual(b"I am _ComplexObject('joe')", Loading Loading
django/utils/functional.py +9 −0 Original line number Diff line number Diff line Loading @@ -305,6 +305,15 @@ class SimpleLazyObject(LazyObject): def __reduce__(self): return (self.__newobj__, (self.__class__,), self.__getstate__()) # Return a meaningful representation of the lazy object for debugging # without evaluating the wrapped object. def __repr__(self): if self._wrapped is empty: repr_attr = self._setupfunc else: repr_attr = self._wrapped return '<SimpleLazyObject: %r>' % repr_attr # Need to pretend to be the wrapped class, for the sake of objects that care # about this (especially in equality tests) __class__ = property(new_method_proxy(operator.attrgetter("__class__"))) Loading
docs/releases/1.6.txt +3 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,9 @@ Minor features :setting:`TEMPLATE_STRING_IF_INVALID` for variables not present in the context, just like other template constructs. * SimpleLazyObjects will now present more helpful representations in shell debugging situations. Backwards incompatible changes in 1.6 ===================================== Loading
tests/utils_tests/simplelazyobject.py +12 −4 Original line number Diff line number Diff line Loading @@ -59,10 +59,18 @@ class TestUtilsSimpleLazyObject(TestCase): hash(SimpleLazyObject(complex_object))) def test_repr(self): # For debugging, it will really confuse things if there is no clue that # SimpleLazyObject is actually a proxy object. So we don't # proxy __repr__ self.assertTrue("SimpleLazyObject" in repr(SimpleLazyObject(complex_object))) # First, for an unevaluated SimpleLazyObject x = SimpleLazyObject(complex_object) # __repr__ contains __repr__ of setup function and does not evaluate # the SimpleLazyObject self.assertEqual("<SimpleLazyObject: %r>" % complex_object, repr(x)) self.assertEqual(empty, x._wrapped) # Second, for an evaluated SimpleLazyObject name = x.name # evaluate self.assertTrue(isinstance(x._wrapped, _ComplexObject)) # __repr__ contains __repr__ of wrapped object self.assertEqual("<SimpleLazyObject: %r>" % x._wrapped, repr(x)) def test_bytes(self): self.assertEqual(b"I am _ComplexObject('joe')", Loading