@@ -123,6 +123,47 @@ def set_file_content(self, record, file, file_key, stream, content_length):
123
123
super ().set_file_content (record , file , file_key , stream , content_length )
124
124
125
125
126
+ class RemoteTransfer (BaseTransfer ):
127
+ """Remote transfer."""
128
+
129
+ def __init__ (self , ** kwargs ):
130
+ """Constructor."""
131
+ super ().__init__ (TransferType .REMOTE , ** kwargs )
132
+
133
+ def init_file (self , record , file_metadata ):
134
+ """Initialize a file."""
135
+ uri = file_metadata .pop ("uri" , None )
136
+ if not uri :
137
+ raise Exception ("`uri` is required for remote files." )
138
+
139
+ file = record .files .create (
140
+ key = file_metadata .pop ("key" ),
141
+ obj = {
142
+ "file" : {
143
+ "uri" : uri ,
144
+ "storage_class" : "R" ,
145
+ # TODO: We should accept size and checksum, so that we could verify
146
+ # it below on commit.
147
+ "size" : None ,
148
+ "checksum" : None ,
149
+ }
150
+ },
151
+ data = file_metadata ,
152
+ )
153
+
154
+ return file
155
+
156
+ def set_file_content (self , * args , ** kwargs ):
157
+ """Do nothing since it's a remote file."""
158
+ pass
159
+
160
+ def commit_file (self , record , file_key ):
161
+ """Commit a file."""
162
+ # TODO: Try to verify (or populate) the size and checksum in a
163
+ # lightweight fashion (e.g. via a HEAD request to the remote)
164
+ record .files .commit (file_key )
165
+
166
+
126
167
class FetchTransfer (BaseTransfer ):
127
168
"""Fetch transfer."""
128
169
@@ -171,6 +212,8 @@ def get_transfer(cls, file_type, **kwargs):
171
212
"""Get transfer type."""
172
213
if file_type == TransferType .FETCH :
173
214
return FetchTransfer (** kwargs )
215
+ elif TransferType .REMOTE :
216
+ return RemoteTransfer (** kwargs )
174
217
else : # default to local
175
218
return LocalTransfer (** kwargs )
176
219
0 commit comments