diff planemo/lib/python3.7/site-packages/boto/s3/keyfile.py @ 0:d30785e31577 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:18:57 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/planemo/lib/python3.7/site-packages/boto/s3/keyfile.py	Fri Jul 31 00:18:57 2020 -0400
@@ -0,0 +1,134 @@
+# Copyright 2013 Google Inc.
+# Copyright 2011, Nexenta Systems Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# 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,
+# 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.
+
+"""
+Wrapper class to expose a Key being read via a partial implementaiton of the
+Python file interface. The only functions supported are those needed for seeking
+in a Key open for reading.
+"""
+
+import os
+from boto.exception import StorageResponseError
+
+class KeyFile():
+
+  def __init__(self, key):
+    self.key = key
+    self.key.open_read()
+    self.location = 0
+    self.closed = False
+    self.softspace = -1 # Not implemented.
+    self.mode = 'r'
+    self.encoding = 'Undefined in KeyFile'
+    self.errors = 'Undefined in KeyFile'
+    self.newlines = 'Undefined in KeyFile'
+    self.name = key.name
+
+  def tell(self):
+    if self.location is None:
+      raise ValueError("I/O operation on closed file")
+    return self.location
+
+  def seek(self, pos, whence=os.SEEK_SET):
+    self.key.close(fast=True)
+    if whence == os.SEEK_END:
+      # We need special handling for this case because sending an HTTP range GET
+      # with EOF for the range start would cause an invalid range error. Instead
+      # we position to one before EOF (plus pos) and then read one byte to
+      # position at EOF.
+      if self.key.size == 0:
+        # Don't try to seek with an empty key.
+        return
+      pos = self.key.size + pos - 1
+      if pos < 0:
+        raise IOError("Invalid argument")
+      self.key.open_read(headers={"Range": "bytes=%d-" % pos})
+      self.key.read(1)
+      self.location = pos + 1
+      return
+
+    if whence == os.SEEK_SET:
+      if pos < 0:
+        raise IOError("Invalid argument")
+    elif whence == os.SEEK_CUR:
+      pos += self.location
+    else:
+      raise IOError('Invalid whence param (%d) passed to seek' % whence)
+    try:
+      self.key.open_read(headers={"Range": "bytes=%d-" % pos})
+    except StorageResponseError as e:
+      # 416 Invalid Range means that the given starting byte was past the end
+      # of file. We catch this because the Python file interface allows silently
+      # seeking past the end of the file.
+      if e.status != 416:
+        raise
+
+    self.location = pos
+
+  def read(self, size):
+    self.location += size
+    return self.key.read(size)
+
+  def close(self):
+    self.key.close()
+    self.location = None
+    self.closed = True
+
+  def isatty(self):
+    return False
+
+  # Non-file interface, useful for code that wants to dig into underlying Key
+  # state.
+  def getkey(self):
+    return self.key
+
+  # Unimplemented interfaces below here.
+
+  def write(self, buf):
+    raise NotImplementedError('write not implemented in KeyFile')
+
+  def fileno(self):
+    raise NotImplementedError('fileno not implemented in KeyFile')
+
+  def flush(self):
+    raise NotImplementedError('flush not implemented in KeyFile')
+
+  def next(self):
+    raise NotImplementedError('next not implemented in KeyFile')
+
+  def readinto(self):
+    raise NotImplementedError('readinto not implemented in KeyFile')
+
+  def readline(self):
+    raise NotImplementedError('readline not implemented in KeyFile')
+
+  def readlines(self):
+    raise NotImplementedError('readlines not implemented in KeyFile')
+
+  def truncate(self):
+    raise NotImplementedError('truncate not implemented in KeyFile')
+
+  def writelines(self):
+    raise NotImplementedError('writelines not implemented in KeyFile')
+
+  def xreadlines(self):
+    raise NotImplementedError('xreadlines not implemented in KeyFile')