Skip to content

Commit 15f7249

Browse files
committed
Merge branch 'master' into remove-deprecated-lists
2 parents 2426961 + 8716eec commit 15f7249

File tree

3 files changed

+75
-37
lines changed

3 files changed

+75
-37
lines changed

mergin/client.py

Lines changed: 65 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -290,41 +290,26 @@ def username(self):
290290
return None # not authenticated
291291
return self._user_info["username"]
292292

293-
def user_service(self):
293+
def workspace_service(self, workspace_id):
294294
"""
295-
Requests information about user from /user/service endpoint if such exists in self.url server.
295+
This Requests information about a workspace service from /workspace/{id}/service endpoint,
296+
if such exists in self.url server.
296297
297298
Returns response from server as JSON dict or None if endpoint is not found
298-
This can be removed once our SaaS server is upgraded to support workspaces
299299
"""
300+
resp = self.get(f"/v1/workspace/{workspace_id}/service")
301+
return json.loads(resp)
300302

301-
try:
302-
response = self.get("/v1/user/service")
303-
except ClientError as e:
304-
self.log.debug("Unable to query for /user/service endpoint")
305-
return
306-
307-
response = json.loads(response.read())
308-
309-
return response
310-
311-
def workspace_service(self, workspace_id):
303+
def workspace_usage(self, workspace_id):
312304
"""
313-
This Requests information about a workspace service from /workspace/{id}/service endpoint,
305+
This Requests information about a workspace usage from /workspace/{id}/usage endpoint,
314306
if such exists in self.url server.
315307
316308
Returns response from server as JSON dict or None if endpoint is not found
317309
"""
318310

319-
try:
320-
response = self.get(f"/v1/workspace/{workspace_id}/service")
321-
except ClientError as e:
322-
self.log.debug(f"Unable to query for /workspace/{workspace_id}/service endpoint")
323-
return
324-
325-
response = json.loads(response.read())
326-
327-
return response
311+
resp = self.get(f"/v1/workspace/{workspace_id}/usage")
312+
return json.load(resp)
328313

329314
def server_type(self):
330315
"""
@@ -654,41 +639,84 @@ def project_info(self, project_path_or_id, since=None, version=None):
654639
resp = self.get("/v1/project/{}".format(project_path_or_id), params)
655640
return json.load(resp)
656641

657-
def project_versions(self, project_path, since=None, to=None):
642+
def paginated_project_versions(self, project_path, page, per_page=100, descending=False):
643+
"""
644+
Get records of project's versions (history) using calculated pagination.
645+
wrapper around the /v1/project/versions/paginated/{} API end point
646+
647+
:param project_path: Project's full name (<namespace>/<name>)
648+
:type project_path: String | Int
649+
:param page: page number
650+
:type page: Int
651+
:param per_page: number of results per page default 100
652+
:type per_page: Int
653+
:param descending: order of sorting
654+
:type descending: Bool
655+
656+
:rtype: List[Dict], Int
657+
"""
658+
params = {"page": page, "per_page": per_page, "descending": descending}
659+
resp = self.get("/v1/project/versions/paginated/{}".format(project_path), params)
660+
resp_json = json.load(resp)
661+
return resp_json["versions"], resp_json["count"]
662+
663+
def project_versions_count(self, project_path):
664+
"""
665+
return the total count of versions
666+
To note we fetch only one page and one item as we only need the "count" response
667+
668+
:param project_path_or_id: Project's full name (<namespace>/<name>) or id
669+
:type project_path_or_id: String
670+
671+
:rtype: Int
672+
"""
673+
params = {"page": 1, "per_page": 1, "descending": False}
674+
resp = self.get("/v1/project/versions/paginated/{}".format(project_path), params)
675+
resp_json = json.load(resp)
676+
return resp_json["count"]
677+
678+
def project_versions(self, project_path, since=1, to=None):
658679
"""
659680
Get records of project's versions (history) in ascending order.
660681
If neither 'since' nor 'to' is specified it will return all versions.
661682
662683
:param project_path: Project's full name (<namespace>/<name>)
663684
:type project_path: String
664685
:param since: Version to track project history from
665-
:type since: String
686+
:type since: String | Int
666687
:param to: Version to track project history to
667-
:type to: String
688+
:type to: String | Int
668689
669690
:rtype: List[Dict]
670691
"""
671692
versions = []
672693
per_page = 100 # server limit
673-
num_since = int_version(since) if since else 1
674-
num_to = int_version(to) if to else None # we may not know yet
694+
695+
if type(since) == str:
696+
num_since = int_version(since)
697+
else:
698+
# keep the since parameter as is
699+
num_since = since
700+
701+
if type(to) == str:
702+
num_to = int_version(to)
703+
else:
704+
# keep the to parameter as is
705+
num_to = to
706+
675707
start_page = math.ceil(num_since / per_page)
676708
if not num_to:
677709
# let's get first page and count
678-
params = {"page": start_page, "per_page": per_page, "descending": False}
679-
resp = self.get("/v1/project/versions/paginated/{}".format(project_path), params)
680-
resp_json = json.load(resp)
681-
versions = resp_json["versions"]
682-
num_to = resp_json["count"]
710+
versions, num_to = self.paginated_project_versions(project_path, start_page, per_page)
711+
683712
latest_version = int_version(versions[-1]["name"])
684713
if latest_version < num_to:
685714
versions += self.project_versions(project_path, f"v{latest_version+1}", f"v{num_to}")
686715
else:
687716
end_page = math.ceil(num_to / per_page)
688717
for page in range(start_page, end_page + 1):
689-
params = {"page": page, "per_page": per_page, "descending": False}
690-
resp = self.get("/v1/project/versions/paginated/{}".format(project_path), params)
691-
versions += json.load(resp)["versions"]
718+
page_versions, _ = self.paginated_project_versions(project_path, page, per_page)
719+
versions += page_versions
692720

693721
# filter out versions not within range
694722
filtered_versions = list(filter(lambda v: (num_since <= int_version(v["name"]) <= num_to), versions))

mergin/client_pull.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,8 @@ def download_diffs_async(mc, project_directory, file_path, versions):
687687
fetch_files = []
688688

689689
for version in versions:
690+
if version not in file_history["history"]:
691+
continue # skip if this file was not modified at this version
690692
version_data = file_history["history"][version]
691693
if "diff" not in version_data:
692694
continue # skip if there is no diff in history

mergin/test/test_client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,6 +2008,14 @@ def test_project_versions_list(mc):
20082008
assert versions[0]["name"] == "v2"
20092009
assert versions[-1]["name"] == "v4"
20102010

2011+
versions_count = mc.project_versions_count(project)
2012+
assert versions_count == 5
2013+
2014+
versions, _ = mc.paginated_project_versions(project, page=1, descending=True)
2015+
assert len(versions) == 5
2016+
assert versions[0]["name"] == "v5"
2017+
assert versions[-1]["name"] == "v1"
2018+
20112019

20122020
def test_report(mc):
20132021
test_project = "test_report"

0 commit comments

Comments
 (0)