11from functools import partial , reduce
2- from typing import Callable , List , Tuple , Any , Optional , Generator , TYPE_CHECKING
2+ from typing import Callable , List , Tuple , Any , Optional , TYPE_CHECKING , Union
33from urllib .parse import quote
44from requests import Response
55
66from cloudfoundry_client .errors import InvalidEntity
7- from cloudfoundry_client .json_object import JsonObject
8- from cloudfoundry_client .request_object import Request
7+ from cloudfoundry_client .common_objects import JsonObject , Request , Pagination
98
109if TYPE_CHECKING :
1110 from cloudfoundry_client .client import CloudFoundryClient
@@ -42,8 +41,6 @@ def __init__(self, target_endpoint: str, client: "CloudFoundryClient", *args, **
4241
4342EntityBuilder = Callable [[List [Tuple [str , Any ]]], Entity ]
4443
45- PaginateEntities = Generator [Entity , None , None ]
46-
4744
4845class EntityManager (object ):
4946 list_query_parameters = ["page" , "results-per-page" , "order-direction" ]
@@ -62,19 +59,21 @@ def __init__(
6259 entity_builder if entity_builder is not None else lambda pairs : Entity (target_endpoint , client , pairs )
6360 )
6461
65- def _list (self , requested_path : str , entity_builder : Optional [EntityBuilder ] = None , ** kwargs ) -> PaginateEntities :
62+ def _list (self , requested_path : str , entity_builder : Optional [EntityBuilder ] = None , ** kwargs ) -> Pagination [ Entity ] :
6663 url_requested = self ._get_url_filtered ("%s%s" % (self .target_endpoint , requested_path ), ** kwargs )
67- response = self .client .get (url_requested )
68- entity_builder = self ._get_entity_builder (entity_builder )
69- while True :
70- response_json = self ._read_response (response , JsonObject )
71- for resource in response_json ["resources" ]:
72- yield entity_builder (list (resource .items ()))
73- if response_json ["next_url" ] is None :
74- break
75- else :
76- url_requested = "%s%s" % (self .target_endpoint , response_json ["next_url" ])
77- response = self .client .get (url_requested )
64+ current_builder = self ._get_entity_builder (entity_builder )
65+ response_json = self ._read_response (self .client .get (url_requested ), JsonObject )
66+ return Pagination (response_json , response_json .get ("total_results" , 0 ),
67+ self ._next_page ,
68+ lambda page : page ["resources" ],
69+ lambda json_object : current_builder (list (json_object .items ())))
70+
71+ def _next_page (self , current_page : JsonObject ) -> Union [None , JsonObject ]:
72+ next_url = current_page .get ("next_url" )
73+ if next_url is None :
74+ return None
75+ url_requested = "%s%s" % (self .target_endpoint , next_url )
76+ return self ._read_response (self .client .get (url_requested ), JsonObject )
7877
7978 def _create (self , data : dict , ** kwargs ) -> Entity :
8079 url = "%s%s" % (self .target_endpoint , self .entity_uri )
@@ -104,13 +103,13 @@ def _put(self, url: str, data: Optional[dict] = None, **kwargs):
104103 def _delete (self , url : str , ** kwargs ):
105104 self .client .delete (url , ** kwargs )
106105
107- def __iter__ (self ) -> PaginateEntities :
106+ def __iter__ (self ) -> Pagination [ Entity ] :
108107 return self .list ()
109108
110109 def __getitem__ (self , entity_guid ) -> Entity :
111110 return self .get (entity_guid )
112111
113- def list (self , ** kwargs ) -> PaginateEntities :
112+ def list (self , ** kwargs ) -> Pagination [ Entity ] :
114113 return self ._list (self .entity_uri , ** kwargs )
115114
116115 def get_first (self , ** kwargs ) -> Optional [Entity ]:
0 commit comments