@@ -127,7 +127,8 @@ def readlines(self, hint=-1):
127127 def seek (self , offset , whence = os .SEEK_SET ):
128128 if whence not in (os .SEEK_CUR , os .SEEK_END , os .SEEK_SET ):
129129 raise ValueError ("invalid value for 'whence'" )
130- return self ._f .seek (offset , whence )
130+ self ._f .seek (offset , whence )
131+ return self ._f .tell ()
131132
132133 def seekable (self ):
133134 return True
@@ -155,12 +156,14 @@ def readinto(self, b):
155156 def write (self , b ):
156157 if not self .__mode .writing :
157158 raise IOError ('not open for reading' )
158- return self ._f .write (b )
159+ self ._f .write (b )
160+ return len (b )
159161
160162 def truncate (self , size = None ):
161163 if size is None :
162164 size = self ._f .tell ()
163- return self ._f .truncate (size )
165+ self ._f .truncate (size )
166+ return size
164167
165168
166169@contextlib .contextmanager
@@ -205,8 +208,10 @@ class S3FS(FS):
205208 key from standard configuration files.
206209 :param str aws_secret_access_key: The secret key, or None to read
207210 the key from standard configuration files.
208- :param str aws_sssion_token:
209- :param str region: Option S3 region.
211+ :param str endpoint_url: Alternative endpoint url (``None`` to use
212+ default).
213+ :param str aws_session_token:
214+ :param str region: Optional S3 region.
210215 :param str delimiter: The delimiter to separate folders, defaults to
211216 a forward slash.
212217
@@ -256,6 +261,7 @@ def __init__(self,
256261 aws_access_key_id = None ,
257262 aws_secret_access_key = None ,
258263 aws_session_token = None ,
264+ endpoint_url = None ,
259265 region = None ,
260266 delimiter = '/' ):
261267 _creds = (aws_access_key_id , aws_secret_access_key )
@@ -270,6 +276,7 @@ def __init__(self,
270276 self .aws_access_key_id = aws_access_key_id
271277 self .aws_secret_access_key = aws_secret_access_key
272278 self .aws_session_token = aws_session_token
279+ self .endpoint_url = endpoint_url
273280 self .region = region
274281 self .delimiter = delimiter
275282 self ._tlocal = threading .local ()
@@ -331,7 +338,13 @@ def _get_object(self, path, key):
331338 @property
332339 def s3 (self ):
333340 if not hasattr (self ._tlocal , 's3' ):
334- self ._tlocal .s3 = boto3 .resource ('s3' )
341+ self ._tlocal .s3 = boto3 .resource (
342+ 's3' ,
343+ aws_access_key_id = self .aws_access_key_id ,
344+ aws_secret_access_key = self .aws_secret_access_key ,
345+ aws_session_token = self .aws_session_token ,
346+ endpoint_url = self .endpoint_url
347+ )
335348 return self ._tlocal .s3
336349
337350 @property
@@ -341,7 +354,8 @@ def client(self):
341354 's3' ,
342355 aws_access_key_id = self .aws_access_key_id ,
343356 aws_secret_access_key = self .aws_secret_access_key ,
344- aws_session_token = self .aws_session_token
357+ aws_session_token = self .aws_session_token ,
358+ endpoint_url = self .endpoint_url
345359 )
346360 return self ._tlocal .client
347361
@@ -663,7 +677,7 @@ def gen_info():
663677
664678 def setbytes (self , path , contents ):
665679 if not isinstance (contents , bytes ):
666- raise ValueError ('contents must be bytes' )
680+ raise TypeError ('contents must be bytes' )
667681
668682 _path = self .validatepath (path )
669683 _key = self ._path_to_key (_path )
@@ -706,15 +720,20 @@ def copy(self, src_path, dst_path, overwrite=False):
706720 raise errors .ResourceNotFound (dst_path )
707721 _src_key = self ._path_to_key (_src_path )
708722 _dst_key = self ._path_to_key (_dst_path )
709- with s3errors (src_path ):
710- self .client .copy_object (
711- Bucket = self ._bucket_name ,
712- Key = _dst_key ,
713- CopySource = {
714- 'Bucket' :self ._bucket_name ,
715- 'Key' :_src_key
716- }
717- )
723+ try :
724+ with s3errors (src_path ):
725+ self .client .copy_object (
726+ Bucket = self ._bucket_name ,
727+ Key = _dst_key ,
728+ CopySource = {
729+ 'Bucket' :self ._bucket_name ,
730+ 'Key' :_src_key
731+ }
732+ )
733+ except errors .ResourceNotFound :
734+ if self .exists (src_path ):
735+ raise errors .FileExpected (src_path )
736+ raise
718737
719738 def move (self , src_path , dst_path , overwrite = False ):
720739 self .copy (src_path , dst_path , overwrite = overwrite )
0 commit comments