Fixed #30498 -- Fixed proxy class caching in lazy().

lazy() should prepare the proxy class only once (the first time it's
used) not on every call.

Regression in b4e76f30d1.
This commit is contained in:
Ran Benita 2019-05-03 13:46:21 +03:00 committed by Mariusz Felisiak
parent b711eafd2a
commit a2c31e12da
2 changed files with 12 additions and 1 deletions

View File

@ -79,7 +79,7 @@ def lazy(func, *resultclasses):
self.__kw = kw self.__kw = kw
if not self.__prepared: if not self.__prepared:
self.__prepare_class__() self.__prepare_class__()
self.__prepared = True self.__class__.__prepared = True
def __reduce__(self): def __reduce__(self):
return ( return (

View File

@ -1,3 +1,5 @@
from unittest import mock
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.utils.functional import cached_property, lazy from django.utils.functional import cached_property, lazy
@ -207,3 +209,12 @@ class FunctionalTests(SimpleTestCase):
original_object = b'J\xc3\xbcst a str\xc3\xadng' original_object = b'J\xc3\xbcst a str\xc3\xadng'
lazy_obj = lazy(lambda: original_object, bytes) lazy_obj = lazy(lambda: original_object, bytes)
self.assertEqual(repr(original_object), repr(lazy_obj())) self.assertEqual(repr(original_object), repr(lazy_obj()))
def test_lazy_class_preparation_caching(self):
# lazy() should prepare the proxy class only once i.e. the first time
# it's used.
lazified = lazy(lambda: 0, int)
__proxy__ = lazified().__class__
with mock.patch.object(__proxy__, '__prepare_class__') as mocked:
lazified()
mocked.assert_not_called()