Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/boto/sdb/item.py @ 0:d30785e31577 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
| author | guerler |
|---|---|
| date | Fri, 31 Jul 2020 00:18:57 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d30785e31577 |
|---|---|
| 1 # Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ | |
| 2 # | |
| 3 # Permission is hereby granted, free of charge, to any person obtaining a | |
| 4 # copy of this software and associated documentation files (the | |
| 5 # "Software"), to deal in the Software without restriction, including | |
| 6 # without limitation the rights to use, copy, modify, merge, publish, dis- | |
| 7 # tribute, sublicense, and/or sell copies of the Software, and to permit | |
| 8 # persons to whom the Software is furnished to do so, subject to the fol- | |
| 9 # lowing conditions: | |
| 10 # | |
| 11 # The above copyright notice and this permission notice shall be included | |
| 12 # in all copies or substantial portions of the Software. | |
| 13 # | |
| 14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
| 15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | |
| 16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | |
| 17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
| 18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
| 20 # IN THE SOFTWARE. | |
| 21 | |
| 22 import base64 | |
| 23 | |
| 24 class Item(dict): | |
| 25 """ | |
| 26 A ``dict`` sub-class that serves as an object representation of a | |
| 27 SimpleDB item. An item in SDB is similar to a row in a relational | |
| 28 database. Items belong to a :py:class:`Domain <boto.sdb.domain.Domain>`, | |
| 29 which is similar to a table in a relational database. | |
| 30 | |
| 31 The keys on instances of this object correspond to attributes that are | |
| 32 stored on the SDB item. | |
| 33 | |
| 34 .. tip:: While it is possible to instantiate this class directly, you may | |
| 35 want to use the convenience methods on :py:class:`boto.sdb.domain.Domain` | |
| 36 for that purpose. For example, :py:meth:`boto.sdb.domain.Domain.get_item`. | |
| 37 """ | |
| 38 def __init__(self, domain, name='', active=False): | |
| 39 """ | |
| 40 :type domain: :py:class:`boto.sdb.domain.Domain` | |
| 41 :param domain: The domain that this item belongs to. | |
| 42 | |
| 43 :param str name: The name of this item. This name will be used when | |
| 44 querying for items using methods like | |
| 45 :py:meth:`boto.sdb.domain.Domain.get_item` | |
| 46 """ | |
| 47 dict.__init__(self) | |
| 48 self.domain = domain | |
| 49 self.name = name | |
| 50 self.active = active | |
| 51 self.request_id = None | |
| 52 self.encoding = None | |
| 53 self.in_attribute = False | |
| 54 self.converter = self.domain.connection.converter | |
| 55 | |
| 56 def startElement(self, name, attrs, connection): | |
| 57 if name == 'Attribute': | |
| 58 self.in_attribute = True | |
| 59 self.encoding = attrs.get('encoding', None) | |
| 60 return None | |
| 61 | |
| 62 def decode_value(self, value): | |
| 63 if self.encoding == 'base64': | |
| 64 self.encoding = None | |
| 65 return base64.decodestring(value) | |
| 66 else: | |
| 67 return value | |
| 68 | |
| 69 def endElement(self, name, value, connection): | |
| 70 if name == 'ItemName': | |
| 71 self.name = self.decode_value(value) | |
| 72 elif name == 'Name': | |
| 73 if self.in_attribute: | |
| 74 self.last_key = self.decode_value(value) | |
| 75 else: | |
| 76 self.name = self.decode_value(value) | |
| 77 elif name == 'Value': | |
| 78 if self.last_key in self: | |
| 79 if not isinstance(self[self.last_key], list): | |
| 80 self[self.last_key] = [self[self.last_key]] | |
| 81 value = self.decode_value(value) | |
| 82 if self.converter: | |
| 83 value = self.converter.decode(value) | |
| 84 self[self.last_key].append(value) | |
| 85 else: | |
| 86 value = self.decode_value(value) | |
| 87 if self.converter: | |
| 88 value = self.converter.decode(value) | |
| 89 self[self.last_key] = value | |
| 90 elif name == 'BoxUsage': | |
| 91 try: | |
| 92 connection.box_usage += float(value) | |
| 93 except: | |
| 94 pass | |
| 95 elif name == 'RequestId': | |
| 96 self.request_id = value | |
| 97 elif name == 'Attribute': | |
| 98 self.in_attribute = False | |
| 99 else: | |
| 100 setattr(self, name, value) | |
| 101 | |
| 102 def load(self): | |
| 103 """ | |
| 104 Loads or re-loads this item's attributes from SDB. | |
| 105 | |
| 106 .. warning:: | |
| 107 If you have changed attribute values on an Item instance, | |
| 108 this method will over-write the values if they are different in | |
| 109 SDB. For any local attributes that don't yet exist in SDB, | |
| 110 they will be safe. | |
| 111 """ | |
| 112 self.domain.get_attributes(self.name, item=self) | |
| 113 | |
| 114 def save(self, replace=True): | |
| 115 """ | |
| 116 Saves this item to SDB. | |
| 117 | |
| 118 :param bool replace: If ``True``, delete any attributes on the remote | |
| 119 SDB item that have a ``None`` value on this object. | |
| 120 """ | |
| 121 self.domain.put_attributes(self.name, self, replace) | |
| 122 # Delete any attributes set to "None" | |
| 123 if replace: | |
| 124 del_attrs = [] | |
| 125 for name in self: | |
| 126 if self[name] is None: | |
| 127 del_attrs.append(name) | |
| 128 if len(del_attrs) > 0: | |
| 129 self.domain.delete_attributes(self.name, del_attrs) | |
| 130 | |
| 131 def add_value(self, key, value): | |
| 132 """ | |
| 133 Helps set or add to attributes on this item. If you are adding a new | |
| 134 attribute that has yet to be set, it will simply create an attribute | |
| 135 named ``key`` with your given ``value`` as its value. If you are | |
| 136 adding a value to an existing attribute, this method will convert the | |
| 137 attribute to a list (if it isn't already) and append your new value | |
| 138 to said list. | |
| 139 | |
| 140 For clarification, consider the following interactive session: | |
| 141 | |
| 142 .. code-block:: python | |
| 143 | |
| 144 >>> item = some_domain.get_item('some_item') | |
| 145 >>> item.has_key('some_attr') | |
| 146 False | |
| 147 >>> item.add_value('some_attr', 1) | |
| 148 >>> item['some_attr'] | |
| 149 1 | |
| 150 >>> item.add_value('some_attr', 2) | |
| 151 >>> item['some_attr'] | |
| 152 [1, 2] | |
| 153 | |
| 154 :param str key: The attribute to add a value to. | |
| 155 :param object value: The value to set or append to the attribute. | |
| 156 """ | |
| 157 if key in self: | |
| 158 # We already have this key on the item. | |
| 159 if not isinstance(self[key], list): | |
| 160 # The key isn't already a list, take its current value and | |
| 161 # convert it to a list with the only member being the | |
| 162 # current value. | |
| 163 self[key] = [self[key]] | |
| 164 # Add the new value to the list. | |
| 165 self[key].append(value) | |
| 166 else: | |
| 167 # This is a new attribute, just set it. | |
| 168 self[key] = value | |
| 169 | |
| 170 def delete(self): | |
| 171 """ | |
| 172 Deletes this item in SDB. | |
| 173 | |
| 174 .. note:: This local Python object remains in its current state | |
| 175 after deletion, this only deletes the remote item in SDB. | |
| 176 """ | |
| 177 self.domain.delete_item(self) |
