@@ -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 ))
0 commit comments