Commit ef1e6ef1 authored by Honza Kral's avatar Honza Kral
Browse files

Merge branch 'ticket19872' of https://github.com/oinopion/django

parents 2b48fcc6 b88abd68
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -39,7 +39,9 @@ class cached_property(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, type):
    def __get__(self, instance, type=None):
        if instance is None:
            return self
        res = instance.__dict__[self.func.__name__] = self.func(instance)
        return res

+28 −1
Original line number Diff line number Diff line
from django.utils import unittest
from django.utils.functional import lazy, lazy_property
from django.utils.functional import lazy, lazy_property, cached_property


class FunctionalTestCase(unittest.TestCase):
@@ -37,3 +37,30 @@ class FunctionalTestCase(unittest.TestCase):

        self.assertRaises(NotImplementedError, lambda: A().do)
        self.assertEqual(B().do, 'DO IT')

    def test_cached_property(self):
        """
        Test that cached_property caches its value,
        and that it behaves like a property
        """

        class A(object):

            @cached_property
            def value(self):
                return 1, object()

        a = A()

        # check that it is cached
        self.assertEqual(a.value, a.value)

        # check that it returns the right thing
        self.assertEqual(a.value[0], 1)

        # check that state isn't shared between instances
        a2 = A()
        self.assertNotEqual(a.value, a2.value)

        # check that it behaves like a property when there's no instance
        self.assertIsInstance(A.value, cached_property)