Commit c6f90f00 authored by Alex Gaynor's avatar Alex Gaynor
Browse files

Fixed MultiValueDict's copy implementation to be consistant with all other copies.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14366 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 3d69b217
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
from types import GeneratorType

from django.utils.copycompat import deepcopy
from django.utils.copycompat import copy, deepcopy


class MergeDict(object):
@@ -263,7 +263,10 @@ class MultiValueDict(dict):
        super(MultiValueDict, self).__setitem__(key, [value])

    def __copy__(self):
        return self.__class__(super(MultiValueDict, self).items())
        return self.__class__([
            (k, v[:])
            for k, v in self.lists()
        ])

    def __deepcopy__(self, memo=None):
        import django.utils.copycompat as copy
@@ -361,8 +364,8 @@ class MultiValueDict(dict):
            yield self[key]

    def copy(self):
        """Returns a copy of this object."""
        return self.__deepcopy__()
        """Returns a shallow copy of this object."""
        return copy(self)

    def update(self, *args, **kwargs):
        """
@@ -491,4 +494,3 @@ class DictWrapper(dict):
        if use_func:
            return self.func(value)
        return value
+21 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ Tests for stuff in django.utils.datastructures.
import pickle
import unittest

from django.utils.copycompat import copy
from django.utils.datastructures import *


@@ -211,6 +212,26 @@ class MultiValueDictTests(DatastructuresTestCase):
        self.assertEquals(list(d.itervalues()),
                          ['Developer', 'Simon', 'Willison'])

    def test_copy(self):
        for copy_func in [copy, lambda d: d.copy()]:
            d1 = MultiValueDict({
                "developers": ["Carl", "Fred"]
            })
            self.assertEqual(d1["developers"], "Fred")
            d2 = copy_func(d1)
            d2.update({"developers": "Groucho"})
            self.assertEqual(d2["developers"], "Groucho")
            self.assertEqual(d1["developers"], "Fred")

            d1 = MultiValueDict({
                "key": [[]]
            })
            self.assertEqual(d1["key"], [])
            d2 = copy_func(d1)
            d2["key"].append("Penguin")
            self.assertEqual(d1["key"], ["Penguin"])
            self.assertEqual(d2["key"], ["Penguin"])


class DotExpandedDictTests(DatastructuresTestCase):