11import os .path
22import tempfile
3+ from typing import AnyStr , Optional
34
45from diskcollections .interfaces import IClientSequence
56from diskcollections .py2to3 import TemporaryDirectory
67
8+ mode_str = "w+"
9+ mode_bytes = "w+b"
10+ modes = {mode_str , mode_bytes }
11+
712
813class TemporaryDirectoryClient (IClientSequence ):
914 """
@@ -15,9 +20,10 @@ class TemporaryDirectoryClient(IClientSequence):
1520 new content.
1621 """
1722
18- def __init__ (self , iterable = (), mode = "w+b" ):
23+ def __init__ (self , iterable = (), mode = mode_bytes ):
1924 super (TemporaryDirectoryClient , self ).__init__ ()
2025 self .__mode = mode
26+ self .__available_modes = modes - {mode }
2127 self .__files = []
2228 self .__directory = TemporaryDirectory ()
2329 self .extend (iterable )
@@ -49,22 +55,35 @@ def __getitem__(self, index):
4955 return file .read ()
5056
5157 def __setitem__ (self , index , value ):
52- file = tempfile .TemporaryFile (
53- mode = self .__mode , dir = self .__directory .name
54- )
55- file .write (bytes (value ))
58+ file = self .safe_write (value )
5659 self .__files [index ] = file
5760
5861 def __len__ (self ):
5962 return len (self .__files )
6063
6164 def insert (self , index , value ):
62- file = tempfile .TemporaryFile (
63- mode = self .__mode , dir = self .__directory .name
64- )
65- file .write (value )
65+ file = self .safe_write (value )
6666 self .__files .insert (index , file )
6767
68+ def __write (self , value , mode : Optional [str ] = None ):
69+ mode = mode or self .__mode
70+ file = tempfile .TemporaryFile (mode = mode , dir = self .__directory .name )
71+ file .write (value )
72+ return file
73+
74+ def safe_write (self , value ):
75+ try :
76+ return self .__write (value )
77+ except TypeError :
78+ pass
79+
80+ for mode in self .__available_modes :
81+ try :
82+ return self .__write (value , mode = mode )
83+ except TypeError as e :
84+ pass
85+ raise e
86+
6887
6988class PersistentDirectoryClient (IClientSequence ):
7089 """
@@ -79,6 +98,7 @@ class PersistentDirectoryClient(IClientSequence):
7998 def __init__ (self , directory , iterable = ()):
8099 super (PersistentDirectoryClient , self ).__init__ ()
81100 self .__mode = "w+"
101+ self .__available_modes = modes - {self .__mode }
82102 self .__files = []
83103
84104 if not os .path .exists (directory ):
@@ -102,9 +122,9 @@ def __delitem__(self, index):
102122 """Delete item from given index.
103123
104124 Delete means here:
105- - delete file undex `files[index]`
125+ - delete file under `files[index]`
106126 - when item is deleted then list become smaller
107- - rename and reopen higher then index files
127+ - rename and reopen higher than index files
108128 """
109129 file = self .__files [index ]
110130 del self .__files [index ]
@@ -144,16 +164,14 @@ def __getitem__(self, index):
144164
145165 def __setitem__ (self , index , value ):
146166 file_path = self .get_file_path (index )
147- file = open (file_path , mode = self .__mode )
148- file .write (value )
149- file .seek (0 )
167+ file = self .safe_write (file_path , value )
150168 self .__files [index ] = file
151169
152170 def __len__ (self ):
153171 return len (self .__files )
154172
155173 def get_file_path (self , index ):
156- return "%s/%s" % ( self .__directory , index )
174+ return f" { self .__directory } / { index } "
157175
158176 def insert (self , index , value ):
159177 """Insert value to index.
@@ -170,9 +188,7 @@ def insert(self, index, value):
170188 """
171189 if index >= len (self .__files ):
172190 file_path = self .get_file_path (index )
173- file = open (file_path , mode = self .__mode )
174- file .write (value )
175- file .seek (0 )
191+ file = self .safe_write (file_path , value )
176192 self .__files .insert (index , file )
177193 return
178194
@@ -186,9 +202,7 @@ def insert(self, index, value):
186202 os .rename (old_file_path , new_file_path )
187203
188204 file_path = self .get_file_path (index )
189- file = open (file_path , mode = self .__mode )
190- file .write (value )
191- file .seek (0 )
205+ file = self .safe_write (file_path , value )
192206 self .__files .insert (index , file )
193207
194208 for i in range (len (self .__files )):
@@ -200,3 +214,23 @@ def insert(self, index, value):
200214 file = open (file_path , mode = "r+" )
201215
202216 self .__files [i ] = file
217+
218+ def __write (self , file_path , value , mode : Optional [str ] = None ):
219+ mode = mode or self .__mode
220+ file = open (file_path , mode = mode )
221+ file .write (value )
222+ file .seek (0 )
223+ return file
224+
225+ def safe_write (self , file_path , value ):
226+ try :
227+ return self .__write (file_path , value )
228+ except TypeError :
229+ pass
230+
231+ for mode in self .__available_modes :
232+ try :
233+ return self .__write (file_path , value , mode = mode )
234+ except TypeError as e :
235+ pass
236+ raise e
0 commit comments