Skip to content

Commit 6af8a01

Browse files
Denis AbakumovDenis Abakumov
authored andcommitted
[Bitbucket] Added Download class to retrieve pipeline-generated artifacts (Cloud)
1 parent a8eabbf commit 6af8a01

File tree

3 files changed

+131
-3
lines changed

3 files changed

+131
-3
lines changed

atlassian/bitbucket/cloud/common/users.py

100644100755
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from datetime import datetime
2+
13
from ..base import BitbucketCloudBase
24

35

@@ -31,6 +33,49 @@ def avatar(self):
3133
return self.get_data("links")["avatar"]["href"]
3234

3335

36+
class AppUser(BitbucketCloudBase):
37+
def __init__(self, url, data, *args, **kwargs):
38+
super(AppUser, self).__init__(url, *args, data=data, expected_type="app_user", **kwargs)
39+
40+
@property
41+
def display_name(self):
42+
"""User display name"""
43+
return str(self.get_data("display_name"))
44+
45+
@property
46+
def account_id(self):
47+
"""User account id"""
48+
return self.get_data("account_id")
49+
50+
@property
51+
def account_status(self):
52+
"""User account status"""
53+
return self.get_data("account_status")
54+
55+
@property
56+
def created_on(self):
57+
"""User creation date"""
58+
created_on = self.get_data("created_on")
59+
if created_on is None:
60+
return None
61+
return datetime.strptime(created_on, self.CONF_TIMEFORMAT)
62+
63+
@property
64+
def uuid(self):
65+
"""User id"""
66+
return self.get_data("uuid")
67+
68+
@property
69+
def kind(self):
70+
"""User kind"""
71+
return self.get_data("kind")
72+
73+
@property
74+
def links(self):
75+
"""User links"""
76+
return self.get_data("links")
77+
78+
3479
class Participant(BitbucketCloudBase):
3580
ROLE_REVIEWER = "REVIEWER"
3681
ROLE_PARTICIPANT = "PARTICIPANT"

atlassian/bitbucket/cloud/repositories/__init__.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
# coding=utf-8
22

33
from requests import HTTPError
4-
from ..base import BitbucketCloudBase
5-
from .issues import Issues
4+
65
from .branchRestrictions import BranchRestrictions
76
from .commits import Commits
8-
from .hooks import Hooks
97
from .defaultReviewers import DefaultReviewers
108
from .deploymentEnvironments import DeploymentEnvironments
9+
from .downloads import Downloads
1110
from .groupPermissions import GroupPermissions
11+
from .hooks import Hooks
12+
from .issues import Issues
1213
from .pipelines import Pipelines
1314
from .pullRequests import PullRequests
1415
from .refs import Branches, Tags
1516
from .repositoryVariables import RepositoryVariables
17+
from ..base import BitbucketCloudBase
1618

1719

1820
class RepositoriesBase(BitbucketCloudBase):
@@ -277,6 +279,7 @@ def __init__(self, data, *args, **kwargs):
277279
f"{self.url}/pipelines_config/variables", **self._new_session_args
278280
)
279281
self.__tags = Tags(f"{self.url}/refs/tags", **self._new_session_args)
282+
self.__downloads = Downloads(f"{self.url}/downloads", **self._new_session_args)
280283

281284
def update(self, **kwargs):
282285
"""
@@ -433,3 +436,8 @@ def repository_variables(self):
433436
def tags(self):
434437
"""The repository tags."""
435438
return self.__tags
439+
440+
@property
441+
def downloads(self):
442+
"""The repository downloads"""
443+
return self.__downloads
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from datetime import datetime
2+
3+
from ..base import BitbucketCloudBase
4+
from ..common.users import AppUser
5+
6+
7+
class Download(BitbucketCloudBase):
8+
def __init__(self, url, data, *args, **kwargs):
9+
super(Download, self).__init__(url, *args, data=data, expected_type="download", **kwargs)
10+
11+
@property
12+
def name(self):
13+
"""The download file name"""
14+
return self.get_data("name")
15+
16+
@property
17+
def size(self):
18+
"""The download size in bytes"""
19+
return self.get_data("size")
20+
21+
@property
22+
def created_on(self):
23+
"""The download created date"""
24+
created_on = self.get_data("created_on")
25+
if created_on is None:
26+
return None
27+
return datetime.strptime(created_on, self.CONF_TIMEFORMAT)
28+
29+
@property
30+
def user(self):
31+
"""The user who created this download"""
32+
return AppUser(None, self.get_data("user"))
33+
34+
@property
35+
def downloads(self):
36+
"""The number of times this file was downloaded"""
37+
return self.get_data("downloads")
38+
39+
@property
40+
def links(self):
41+
"""The download links"""
42+
return self.get_data("links")
43+
44+
def get_content(self):
45+
"""Download file content"""
46+
return self.get(self.url, absolute=True)
47+
48+
49+
class Downloads(BitbucketCloudBase):
50+
def __init__(self, url, *args, **kwargs):
51+
super(Downloads, self).__init__(url, *args, **kwargs)
52+
53+
def __get_object(self, data):
54+
url = self.url_joiner(self.url, data["name"])
55+
if data["links"] and data["links"]["self"] and data["links"]["self"]["href"]:
56+
url = data["links"]["self"]["href"]
57+
58+
return Download(
59+
url,
60+
data,
61+
**self._new_session_args
62+
) # fmt: skip
63+
64+
def each(self):
65+
"""
66+
Returns the list of downloads in this repository.
67+
68+
:return: A generator for the Download objects
69+
70+
API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-downloads/#api-repositories-workspace-repo-slug-downloads-get
71+
"""
72+
for issue in self._get_paged(None):
73+
yield self.__get_object(issue)
74+
75+
return

0 commit comments

Comments
 (0)