app/soc/logic/no_overwrite_sorted_dict.py
author Sverre Rabbelier <srabbelier@gmail.com>
Sun, 02 Nov 2008 17:26:06 +0000
changeset 429 e50e18936f06
parent 275 78fd8c2ed80a
permissions -rw-r--r--
Fixed typo in e-mail address Instead of 'sverre@rabbelier.nl' everything read 'sverer@rabbelier.nl'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
275
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     1
#!/usr/bin/python2.5
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     2
#
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     3
# Copyright 2008 the Melange authors.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     4
#
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     5
# Licensed under the Apache License, Version 2.0 (the "License");
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     6
# you may not use this file except in compliance with the License.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     7
# You may obtain a copy of the License at
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     8
#
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     9
#   http://www.apache.org/licenses/LICENSE-2.0
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    10
#
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    11
# Unless required by applicable law or agreed to in writing, software
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    12
# distributed under the License is distributed on an "AS IS" BASIS,
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    14
# See the License for the specific language governing permissions and
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    15
# limitations under the License.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    16
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    17
"""Like Django SortedDict, but no repeated assignments to the same key.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    18
"""
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    19
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    20
__authors__ = [
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    21
  '"Todd Larsen" <tlarsen@google.com>',
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    22
  ]
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    23
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    24
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    25
from django.utils import datastructures
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    26
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    27
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    28
class NoOverwriteSortedDict(datastructures.SortedDict):
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    29
  """SortedDict where each key can be given a value only once.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    30
  
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    31
  The purpose of this data structure is to be able to detect when
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    32
  an attempt is made to overwrite the value of an existing key
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    33
  in the SortedDict.  This is to catch, for example, cases such as
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    34
  a registry where two different callers attempt to register the
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    35
  same view, handler, etc.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    36
 
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    37
  It is still possible to pop or del a key out of the dict and then
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    38
  add it back to the dict.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    39
  """
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    40
  
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    41
  KEY_ALREADY_PRESENT_ERROR_FMT = \
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    42
    '%s already present, value cannot be overwritten'
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    43
  
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    44
  def __init__(self, data=None):
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    45
    if data is None:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    46
      data = {}
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    47
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    48
    # call SortedDict's parent __init__()
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    49
    # (bypassing the __init__() of SortedDict itself, since it will not
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    50
    # enforce our no-overwrite requirement)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    51
    super(datastructures.SortedDict, self).__init__(data)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    52
    
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    53
    if isinstance(data, dict):
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    54
      self.keyOrder = data.keys()
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    55
    else:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    56
      self.keyOrder = []
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    57
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    58
      for key, value in data:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    59
        if key in self.keyOrder:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    60
          # key has already been given a value, and that value is not
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    61
          # permitted to be overwritten, so raise an error
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    62
          raise KeyError(self.KEY_ALREADY_PRESENT_ERROR_FMT % key)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    63
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    64
        self.keyOrder.append(key)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    65
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    66
  def __setitem__(self, key, value):
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    67
    if key in self.keyOrder:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    68
      # key has already been given a value, and that value is not permitted
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    69
      # to be overwritten, so raise an error
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    70
      raise KeyError(self.KEY_ALREADY_PRESENT_ERROR_FMT % key)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    71
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    72
    super(NoOverwriteSortedDict, self).__setitem__(key, value)