Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit61e0fae

Browse files
ernestasknejch
authored andcommitted
feat(packages): Allow uploading bytes and files
This commit adds a keyword argument to GenericPackageManager.upload() toallow uploading bytes and file-like objects to the generic packageregistry. That necessitates changing file path to be a keyword argumentas well, which then cascades into a whole slew of checks to not allowpassing both and to not allow uploading file-like objects as JSON data.Closes#1815
1 parenta788cff commit61e0fae

File tree

5 files changed

+153
-13
lines changed

5 files changed

+153
-13
lines changed

‎gitlab/_backends/requests_backend.py‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__importannotations
22

33
importdataclasses
4-
fromtypingimportAny,Dict,Optional,TYPE_CHECKING,Union
4+
fromtypingimportAny,BinaryIO,Dict,Optional,TYPE_CHECKING,Union
55

66
importrequests
77
fromrequestsimportPreparedRequest
@@ -94,7 +94,7 @@ def client(self) -> requests.Session:
9494
@staticmethod
9595
defprepare_send_data(
9696
files:Optional[Dict[str,Any]]=None,
97-
post_data:Optional[Union[Dict[str,Any],bytes]]=None,
97+
post_data:Optional[Union[Dict[str,Any],bytes,BinaryIO]]=None,
9898
raw:bool=False,
9999
)->SendData:
100100
iffiles:
@@ -121,6 +121,9 @@ def prepare_send_data(
121121
ifrawandpost_data:
122122
returnSendData(data=post_data,content_type="application/octet-stream")
123123

124+
ifTYPE_CHECKING:
125+
assertnotisinstance(post_data,BinaryIO)
126+
124127
returnSendData(json=post_data,content_type="application/json")
125128

126129
defhttp_request(

‎gitlab/client.py‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,18 @@
33
importos
44
importre
55
importtime
6-
fromtypingimportAny,cast,Dict,List,Optional,Tuple,Type,TYPE_CHECKING,Union
6+
fromtypingimport (
7+
Any,
8+
BinaryIO,
9+
cast,
10+
Dict,
11+
List,
12+
Optional,
13+
Tuple,
14+
Type,
15+
TYPE_CHECKING,
16+
Union,
17+
)
718
fromurllibimportparse
819

920
importrequests
@@ -612,7 +623,7 @@ def http_request(
612623
verb:str,
613624
path:str,
614625
query_data:Optional[Dict[str,Any]]=None,
615-
post_data:Optional[Union[Dict[str,Any],bytes]]=None,
626+
post_data:Optional[Union[Dict[str,Any],bytes,BinaryIO]]=None,
616627
raw:bool=False,
617628
streamed:bool=False,
618629
files:Optional[Dict[str,Any]]=None,
@@ -993,7 +1004,7 @@ def http_put(
9931004
self,
9941005
path:str,
9951006
query_data:Optional[Dict[str,Any]]=None,
996-
post_data:Optional[Union[Dict[str,Any],bytes]]=None,
1007+
post_data:Optional[Union[Dict[str,Any],bytes,BinaryIO]]=None,
9971008
raw:bool=False,
9981009
files:Optional[Dict[str,Any]]=None,
9991010
**kwargs:Any,

‎gitlab/v4/objects/packages.py‎

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,16 @@
55
"""
66

77
frompathlibimportPath
8-
fromtypingimportAny,Callable,cast,Iterator,Optional,TYPE_CHECKING,Union
8+
fromtypingimport (
9+
Any,
10+
BinaryIO,
11+
Callable,
12+
cast,
13+
Iterator,
14+
Optional,
15+
TYPE_CHECKING,
16+
Union,
17+
)
918

1019
importrequests
1120

@@ -46,8 +55,9 @@ def upload(
4655
package_name:str,
4756
package_version:str,
4857
file_name:str,
49-
path:Union[str,Path],
58+
path:Optional[Union[str,Path]]=None,
5059
select:Optional[str]=None,
60+
data:Optional[Union[bytes,BinaryIO]]=None,
5161
**kwargs:Any,
5262
)->GenericPackage:
5363
"""Upload a file as a generic package.
@@ -64,19 +74,34 @@ def upload(
6474
Raises:
6575
GitlabConnectionError: If the server cannot be reached
6676
GitlabUploadError: If the file upload fails
67-
GitlabUploadError: If ``filepath`` cannot be read
77+
GitlabUploadError: If ``path`` cannot be read
78+
GitlabUploadError: If both ``path`` and ``data`` are passed
6879
6980
Returns:
7081
An object storing the metadata of the uploaded package.
7182
7283
https://docs.gitlab.com/ee/user/packages/generic_packages/
7384
"""
7485

75-
try:
76-
withopen(path,"rb")asf:
77-
file_data=f.read()
78-
exceptOSErrorase:
79-
raiseexc.GitlabUploadError(f"Failed to read package file{path}")frome
86+
ifpathisNoneanddataisNone:
87+
raiseexc.GitlabUploadError("No file contents or path specified")
88+
89+
ifpathisnotNoneanddataisnotNone:
90+
raiseexc.GitlabUploadError("File contents and file path specified")
91+
92+
file_data:Optional[Union[bytes,BinaryIO]]=data
93+
94+
ifnotfile_data:
95+
ifTYPE_CHECKING:
96+
assertpathisnotNone
97+
98+
try:
99+
withopen(path,"rb")asf:
100+
file_data=f.read()
101+
exceptOSErrorase:
102+
raiseexc.GitlabUploadError(
103+
f"Failed to read package file{path}"
104+
)frome
80105

81106
url=f"{self._computed_path}/{package_name}/{package_version}/{file_name}"
82107
query_data= {}ifselectisNoneelse {"select":select}

‎tests/functional/api/test_packages.py‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,38 @@ def test_upload_generic_package(tmp_path, project):
3838
assertpackage.message=="201 Created"
3939

4040

41+
deftest_download_generic_package_bytes(tmp_path,project):
42+
path=tmp_path/file_name
43+
44+
path.write_text(file_content)
45+
46+
package=project.generic_packages.upload(
47+
package_name=package_name,
48+
package_version=package_version,
49+
file_name=file_name,
50+
data=path.read_bytes(),
51+
)
52+
53+
assertisinstance(package,GenericPackage)
54+
assertpackage.message=="201 Created"
55+
56+
57+
deftest_download_generic_package_file(tmp_path,project):
58+
path=tmp_path/file_name
59+
60+
path.write_text(file_content)
61+
62+
package=project.generic_packages.upload(
63+
package_name=package_name,
64+
package_version=package_version,
65+
file_name=file_name,
66+
data=path.open(mode="rb"),
67+
)
68+
69+
assertisinstance(package,GenericPackage)
70+
assertpackage.message=="201 Created"
71+
72+
4173
deftest_upload_generic_package_select(tmp_path,project):
4274
path=tmp_path/file_name2
4375
path.write_text(file_content)

‎tests/unit/objects/test_packages.py‎

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
importpytest
77
importresponses
88

9+
fromgitlabimportexceptionsasexc
910
fromgitlab.v4.objectsimport (
1011
GenericPackage,
1112
GroupPackage,
@@ -281,6 +282,74 @@ def test_upload_generic_package(tmp_path, project, resp_upload_generic_package):
281282
assertisinstance(package,GenericPackage)
282283

283284

285+
deftest_upload_generic_package_nonexistent_path(tmp_path,project):
286+
withpytest.raises(exc.GitlabUploadError):
287+
project.generic_packages.upload(
288+
package_name=package_name,
289+
package_version=package_version,
290+
file_name=file_name,
291+
path="bad",
292+
)
293+
294+
295+
deftest_upload_generic_package_no_file_and_no_data(tmp_path,project):
296+
path=tmp_path/file_name
297+
298+
path.write_text(file_content,encoding="utf-8")
299+
300+
withpytest.raises(exc.GitlabUploadError):
301+
project.generic_packages.upload(
302+
package_name=package_name,
303+
package_version=package_version,
304+
file_name=file_name,
305+
)
306+
307+
308+
deftest_upload_generic_package_file_and_data(tmp_path,project):
309+
path=tmp_path/file_name
310+
311+
path.write_text(file_content,encoding="utf-8")
312+
313+
withpytest.raises(exc.GitlabUploadError):
314+
project.generic_packages.upload(
315+
package_name=package_name,
316+
package_version=package_version,
317+
file_name=file_name,
318+
path=path,
319+
data=path.read_bytes(),
320+
)
321+
322+
323+
deftest_upload_generic_package_bytes(tmp_path,project,resp_upload_generic_package):
324+
path=tmp_path/file_name
325+
326+
path.write_text(file_content,encoding="utf-8")
327+
328+
package=project.generic_packages.upload(
329+
package_name=package_name,
330+
package_version=package_version,
331+
file_name=file_name,
332+
data=path.read_bytes(),
333+
)
334+
335+
assertisinstance(package,GenericPackage)
336+
337+
338+
deftest_upload_generic_package_file(tmp_path,project,resp_upload_generic_package):
339+
path=tmp_path/file_name
340+
341+
path.write_text(file_content,encoding="utf-8")
342+
343+
package=project.generic_packages.upload(
344+
package_name=package_name,
345+
package_version=package_version,
346+
file_name=file_name,
347+
data=path.open(mode="rb"),
348+
)
349+
350+
assertisinstance(package,GenericPackage)
351+
352+
284353
deftest_download_generic_package(project,resp_download_generic_package):
285354
package=project.generic_packages.download(
286355
package_name=package_name,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp