| Index: boto/gs/key.py
|
| diff --git a/boto/gs/key.py b/boto/gs/key.py
|
| index 608a9a5e1f6bc6f8ede1c265c23370a187ab16db..de6e6f444458ef3cf1936dcc2b04183b633ea1dd 100644
|
| --- a/boto/gs/key.py
|
| +++ b/boto/gs/key.py
|
| @@ -14,11 +14,12 @@
|
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
| # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
| # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
| -# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| +# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
| # IN THE SOFTWARE.
|
|
|
| +import StringIO
|
| from boto.s3.key import Key as S3Key
|
|
|
| class Key(S3Key):
|
| @@ -107,7 +108,7 @@ class Key(S3Key):
|
| acl.add_group_grant(permission, group_id)
|
| self.set_acl(acl)
|
|
|
| - def set_contents_from_file(self, fp, headers={}, replace=True,
|
| + def set_contents_from_file(self, fp, headers=None, replace=True,
|
| cb=None, num_cb=10, policy=None, md5=None,
|
| res_upload_handler=None):
|
| """
|
| @@ -163,8 +164,7 @@ class Key(S3Key):
|
| just overriding/sharing code the way it currently works).
|
| """
|
| provider = self.bucket.connection.provider
|
| - if headers is None:
|
| - headers = {}
|
| + headers = headers or {}
|
| if policy:
|
| headers[provider.acl_header] = policy
|
| if hasattr(fp, 'name'):
|
| @@ -245,3 +245,56 @@ class Key(S3Key):
|
| self.set_contents_from_file(fp, headers, replace, cb, num_cb,
|
| policy, md5, res_upload_handler)
|
| fp.close()
|
| +
|
| + def set_contents_from_string(self, s, headers=None, replace=True,
|
| + cb=None, num_cb=10, policy=None, md5=None):
|
| + """
|
| + Store an object in S3 using the name of the Key object as the
|
| + key in S3 and the string 's' as the contents.
|
| + See set_contents_from_file method for details about the
|
| + parameters.
|
| +
|
| + :type headers: dict
|
| + :param headers: Additional headers to pass along with the
|
| + request to AWS.
|
| +
|
| + :type replace: bool
|
| + :param replace: If True, replaces the contents of the file if
|
| + it already exists.
|
| +
|
| + :type cb: function
|
| + :param cb: a callback function that will be called to report
|
| + progress on the upload. The callback should accept
|
| + two integer parameters, the first representing the
|
| + number of bytes that have been successfully
|
| + transmitted to S3 and the second representing the
|
| + size of the to be transmitted object.
|
| +
|
| + :type cb: int
|
| + :param num_cb: (optional) If a callback is specified with
|
| + the cb parameter this parameter determines the
|
| + granularity of the callback by defining
|
| + the maximum number of times the callback will
|
| + be called during the file transfer.
|
| +
|
| + :type policy: :class:`boto.s3.acl.CannedACLStrings`
|
| + :param policy: A canned ACL policy that will be applied to the
|
| + new key in S3.
|
| +
|
| + :type md5: A tuple containing the hexdigest version of the MD5
|
| + checksum of the file as the first element and the
|
| + Base64-encoded version of the plain checksum as the
|
| + second element. This is the same format returned by
|
| + the compute_md5 method.
|
| + :param md5: If you need to compute the MD5 for any reason prior
|
| + to upload, it's silly to have to do it twice so this
|
| + param, if present, will be used as the MD5 values
|
| + of the file. Otherwise, the checksum will be computed.
|
| + """
|
| + if isinstance(s, unicode):
|
| + s = s.encode("utf-8")
|
| + fp = StringIO.StringIO(s)
|
| + r = self.set_contents_from_file(fp, headers, replace, cb, num_cb,
|
| + policy, md5)
|
| + fp.close()
|
| + return r
|
|
|