1+ import datetime as dt
12from dataclasses import asdict , dataclass , fields
23from typing import ClassVar , Dict , Generator , Optional , Union
34from urllib .parse import urlencode
45
6+ from cuenca_validations import (
7+ QueryParams ,
8+ SantizedDict ,
9+ Status ,
10+ TransactionQuery ,
11+ )
12+
513from ..exc import MultipleResultsFound , NoResultFound
614from ..http import session
7- from ..types import SantizedDict
8- from ..validators import QueryParams
915
1016
1117@dataclass
1218class Resource :
13- _endpoint : ClassVar [str ]
19+ _resource : ClassVar [str ]
20+
21+ id : str
1422
15- def __init__ (self , ** _ ): # pragma no cover
23+ # purely for MyPy
24+ def __init__ (self , ** _ ): # pragma: no cover
1625 ...
1726
1827 @classmethod
@@ -38,7 +47,7 @@ def to_dict(self):
3847class Retrievable (Resource ):
3948 @classmethod
4049 def retrieve (cls , id : str ) -> Resource :
41- resp = session .get (f'{ cls ._endpoint } /{ id } ' )
50+ resp = session .get (f'/ { cls ._resource } /{ id } ' )
4251 return cls ._from_dict (resp )
4352
4453 def refresh (self ):
@@ -50,17 +59,20 @@ def refresh(self):
5059class Creatable (Resource ):
5160 @classmethod
5261 def _create (cls , ** data ) -> Resource :
53- resp = session .post (cls ._endpoint , data )
62+ resp = session .post (cls ._resource , data )
5463 return cls ._from_dict (resp )
5564
5665
66+ @dataclass
5767class Queryable (Resource ):
5868 _query_params : ClassVar = QueryParams
5969
70+ created_at : dt .datetime
71+
6072 @classmethod
6173 def one (cls , ** query_params ) -> Resource :
6274 q = cls ._query_params (limit = 2 , ** query_params )
63- resp = session .get (cls ._endpoint , q .dict ())
75+ resp = session .get (cls ._resource , q .dict ())
6476 items = resp ['items' ]
6577 len_items = len (items )
6678 if not len_items :
@@ -72,7 +84,7 @@ def one(cls, **query_params) -> Resource:
7284 @classmethod
7385 def first (cls , ** query_params ) -> Optional [Resource ]:
7486 q = cls ._query_params (limit = 1 , ** query_params )
75- resp = session .get (cls ._endpoint , q .dict ())
87+ resp = session .get (cls ._resource , q .dict ())
7688 try :
7789 item = resp ['items' ][0 ]
7890 except IndexError :
@@ -84,14 +96,23 @@ def first(cls, **query_params) -> Optional[Resource]:
8496 @classmethod
8597 def count (cls , ** query_params ) -> int :
8698 q = cls ._query_params (count = True , ** query_params )
87- resp = session .get (cls ._endpoint , q .dict ())
99+ resp = session .get (cls ._resource , q .dict ())
88100 return resp ['count' ]
89101
90102 @classmethod
91103 def all (cls , ** query_params ) -> Generator [Resource , None , None ]:
92104 q = cls ._query_params (** query_params )
93- next_page_url = f'{ cls ._endpoint } ?{ urlencode (q .dict ())} '
105+ next_page_url = f'{ cls ._resource } ?{ urlencode (q .dict ())} '
94106 while next_page_url :
95107 page = session .get (next_page_url )
96108 yield from (cls ._from_dict (item ) for item in page ['items' ])
97109 next_page_url = page ['next_page_url' ]
110+
111+
112+ @dataclass
113+ class Transaction (Retrievable , Queryable ):
114+ _query_params : ClassVar = TransactionQuery
115+
116+ amount : int # in centavos
117+ status : Status
118+ descriptor : str # how it appears for the customer
0 commit comments