1
1
import base64
2
+ from typing import Any , Callable , cast , Dict , List , Optional , TYPE_CHECKING
3
+
4
+ import requests
2
5
3
6
from gitlab import cli
4
7
from gitlab import exceptions as exc
22
25
class ProjectFile (SaveMixin , ObjectDeleteMixin , RESTObject ):
23
26
_id_attr = "file_path"
24
27
_short_print_attr = "file_path"
28
+ file_path : str
29
+ manager : "ProjectFileManager"
25
30
26
31
def decode (self ) -> bytes :
27
32
"""Returns the decoded content of the file.
@@ -31,7 +36,11 @@ def decode(self) -> bytes:
31
36
"""
32
37
return base64 .b64decode (self .content )
33
38
34
- def save (self , branch , commit_message , ** kwargs ):
39
+ # NOTE(jlvillal): Signature doesn't match SaveMixin.save() so ignore
40
+ # type error
41
+ def save ( # type: ignore
42
+ self , branch : str , commit_message : str , ** kwargs : Any
43
+ ) -> None :
35
44
"""Save the changes made to the file to the server.
36
45
37
46
The object is updated to match what the server returns.
@@ -50,7 +59,12 @@ def save(self, branch, commit_message, **kwargs):
50
59
self .file_path = self .file_path .replace ("/" , "%2F" )
51
60
super (ProjectFile , self ).save (** kwargs )
52
61
53
- def delete (self , branch , commit_message , ** kwargs ):
62
+ @exc .on_http_error (exc .GitlabDeleteError )
63
+ # NOTE(jlvillal): Signature doesn't match DeleteMixin.delete() so ignore
64
+ # type error
65
+ def delete ( # type: ignore
66
+ self , branch : str , commit_message : str , ** kwargs : Any
67
+ ) -> None :
54
68
"""Delete the file from the server.
55
69
56
70
Args:
@@ -80,7 +94,11 @@ class ProjectFileManager(GetMixin, CreateMixin, UpdateMixin, DeleteMixin, RESTMa
80
94
)
81
95
82
96
@cli .register_custom_action ("ProjectFileManager" , ("file_path" , "ref" ))
83
- def get (self , file_path , ref , ** kwargs ):
97
+ # NOTE(jlvillal): Signature doesn't match UpdateMixin.update() so ignore
98
+ # type error
99
+ def get ( # type: ignore
100
+ self , file_path : str , ref : str , ** kwargs : Any
101
+ ) -> ProjectFile :
84
102
"""Retrieve a single file.
85
103
86
104
Args:
@@ -95,15 +113,17 @@ def get(self, file_path, ref, **kwargs):
95
113
Returns:
96
114
object: The generated RESTObject
97
115
"""
98
- return GetMixin .get (self , file_path , ref = ref , ** kwargs )
116
+ return cast ( ProjectFile , GetMixin .get (self , file_path , ref = ref , ** kwargs ) )
99
117
100
118
@cli .register_custom_action (
101
119
"ProjectFileManager" ,
102
120
("file_path" , "branch" , "content" , "commit_message" ),
103
121
("encoding" , "author_email" , "author_name" ),
104
122
)
105
123
@exc .on_http_error (exc .GitlabCreateError )
106
- def create (self , data , ** kwargs ):
124
+ def create (
125
+ self , data : Optional [Dict [str , Any ]] = None , ** kwargs : Any
126
+ ) -> ProjectFile :
107
127
"""Create a new object.
108
128
109
129
Args:
@@ -120,15 +140,23 @@ def create(self, data, **kwargs):
120
140
GitlabCreateError: If the server cannot perform the request
121
141
"""
122
142
143
+ if TYPE_CHECKING :
144
+ assert data is not None
123
145
self ._check_missing_create_attrs (data )
124
146
new_data = data .copy ()
125
147
file_path = new_data .pop ("file_path" ).replace ("/" , "%2F" )
126
148
path = f"{ self .path } /{ file_path } "
127
149
server_data = self .gitlab .http_post (path , post_data = new_data , ** kwargs )
150
+ if TYPE_CHECKING :
151
+ assert isinstance (server_data , dict )
128
152
return self ._obj_cls (self , server_data )
129
153
130
154
@exc .on_http_error (exc .GitlabUpdateError )
131
- def update (self , file_path , new_data = None , ** kwargs ):
155
+ # NOTE(jlvillal): Signature doesn't match UpdateMixin.update() so ignore
156
+ # type error
157
+ def update ( # type: ignore
158
+ self , file_path : str , new_data : Optional [Dict [str , Any ]] = None , ** kwargs : Any
159
+ ) -> Dict [str , Any ]:
132
160
"""Update an object on the server.
133
161
134
162
Args:
@@ -149,13 +177,19 @@ def update(self, file_path, new_data=None, **kwargs):
149
177
data ["file_path" ] = file_path
150
178
path = f"{ self .path } /{ file_path } "
151
179
self ._check_missing_update_attrs (data )
152
- return self .gitlab .http_put (path , post_data = data , ** kwargs )
180
+ result = self .gitlab .http_put (path , post_data = data , ** kwargs )
181
+ if TYPE_CHECKING :
182
+ assert isinstance (result , dict )
153
183
154
184
@cli .register_custom_action (
155
185
"ProjectFileManager" , ("file_path" , "branch" , "commit_message" )
156
186
)
157
187
@exc .on_http_error (exc .GitlabDeleteError )
158
- def delete (self , file_path , branch , commit_message , ** kwargs ):
188
+ # NOTE(jlvillal): Signature doesn't match DeleteMixin.delete() so ignore
189
+ # type error
190
+ def delete ( # type: ignore
191
+ self , file_path : str , branch : str , commit_message : str , ** kwargs : Any
192
+ ) -> None :
159
193
"""Delete a file on the server.
160
194
161
195
Args:
@@ -175,8 +209,14 @@ def delete(self, file_path, branch, commit_message, **kwargs):
175
209
@cli .register_custom_action ("ProjectFileManager" , ("file_path" , "ref" ))
176
210
@exc .on_http_error (exc .GitlabGetError )
177
211
def raw (
178
- self , file_path , ref , streamed = False , action = None , chunk_size = 1024 , ** kwargs
179
- ):
212
+ self ,
213
+ file_path : str ,
214
+ ref : str ,
215
+ streamed : bool = False ,
216
+ action : Optional [Callable [..., Any ]] = None ,
217
+ chunk_size : int = 1024 ,
218
+ ** kwargs : Any ,
219
+ ) -> Optional [bytes ]:
180
220
"""Return the content of a file for a commit.
181
221
182
222
Args:
@@ -203,11 +243,13 @@ def raw(
203
243
result = self .gitlab .http_get (
204
244
path , query_data = query_data , streamed = streamed , raw = True , ** kwargs
205
245
)
246
+ if TYPE_CHECKING :
247
+ assert isinstance (result , requests .Response )
206
248
return utils .response_content (result , streamed , action , chunk_size )
207
249
208
250
@cli .register_custom_action ("ProjectFileManager" , ("file_path" , "ref" ))
209
251
@exc .on_http_error (exc .GitlabListError )
210
- def blame (self , file_path , ref , ** kwargs ) :
252
+ def blame (self , file_path : str , ref : str , ** kwargs : Any ) -> List [ Dict [ str , Any ]] :
211
253
"""Return the content of a file for a commit.
212
254
213
255
Args:
@@ -225,4 +267,7 @@ def blame(self, file_path, ref, **kwargs):
225
267
file_path = file_path .replace ("/" , "%2F" ).replace ("." , "%2E" )
226
268
path = f"{ self .path } /{ file_path } /blame"
227
269
query_data = {"ref" : ref }
228
- return self .gitlab .http_list (path , query_data , ** kwargs )
270
+ result = self .gitlab .http_list (path , query_data , ** kwargs )
271
+ if TYPE_CHECKING :
272
+ assert isinstance (result , list )
273
+ return result
0 commit comments