1313import cgi
1414from contextlib import closing
1515
16+ from typing import Iterable , List , Optional , TYPE_CHECKING , Tuple , Union
17+
1618# The maximum size of a file that can be published in a single request is 64MB
1719FILESIZE_LIMIT = 1024 * 1024 * 64 # 64MB
1820
1921ALLOWED_FILE_EXTENSIONS = ["tfl" , "tflx" ]
2022
2123logger = logging .getLogger ("tableau.endpoint.flows" )
2224
25+ if TYPE_CHECKING :
26+ from .. import DQWItem
27+ from ..request_options import RequestOptions
28+ from ...models .permissions_item import Permission , PermissionsRule
29+
30+
31+ FilePath = Union [str , os .PathLike ]
32+
2333
2434class Flows (Endpoint ):
2535 def __init__ (self , parent_srv ):
@@ -29,12 +39,12 @@ def __init__(self, parent_srv):
2939 self ._data_quality_warnings = _DataQualityWarningEndpoint (self .parent_srv , "flow" )
3040
3141 @property
32- def baseurl (self ):
42+ def baseurl (self ) -> str :
3343 return "{0}/sites/{1}/flows" .format (self .parent_srv .baseurl , self .parent_srv .site_id )
3444
3545 # Get all flows
3646 @api (version = "3.3" )
37- def get (self , req_options = None ):
47+ def get (self , req_options : Optional [ "RequestOptions" ] = None ) -> Tuple [ List [ FlowItem ], PaginationItem ] :
3848 logger .info ("Querying all flows on site" )
3949 url = self .baseurl
4050 server_response = self .get_request (url , req_options )
@@ -44,7 +54,7 @@ def get(self, req_options=None):
4454
4555 # Get 1 flow by id
4656 @api (version = "3.3" )
47- def get_by_id (self , flow_id ) :
57+ def get_by_id (self , flow_id : str ) -> FlowItem :
4858 if not flow_id :
4959 error = "Flow ID undefined."
5060 raise ValueError (error )
@@ -55,7 +65,7 @@ def get_by_id(self, flow_id):
5565
5666 # Populate flow item's connections
5767 @api (version = "3.3" )
58- def populate_connections (self , flow_item ) :
68+ def populate_connections (self , flow_item : FlowItem ) -> None :
5969 if not flow_item .id :
6070 error = "Flow item missing ID. Flow must be retrieved from server first."
6171 raise MissingRequiredFieldError (error )
@@ -66,15 +76,15 @@ def connections_fetcher():
6676 flow_item ._set_connections (connections_fetcher )
6777 logger .info ("Populated connections for flow (ID: {0})" .format (flow_item .id ))
6878
69- def _get_flow_connections (self , flow_item , req_options = None ):
79+ def _get_flow_connections (self , flow_item , req_options : Optional [ "RequestOptions" ] = None ) -> List [ ConnectionItem ] :
7080 url = "{0}/{1}/connections" .format (self .baseurl , flow_item .id )
7181 server_response = self .get_request (url , req_options )
7282 connections = ConnectionItem .from_response (server_response .content , self .parent_srv .namespace )
7383 return connections
7484
7585 # Delete 1 flow by id
7686 @api (version = "3.3" )
77- def delete (self , flow_id ) :
87+ def delete (self , flow_id : str ) -> None :
7888 if not flow_id :
7989 error = "Flow ID undefined."
8090 raise ValueError (error )
@@ -84,7 +94,7 @@ def delete(self, flow_id):
8494
8595 # Download 1 flow by id
8696 @api (version = "3.3" )
87- def download (self , flow_id , filepath = None ):
97+ def download (self , flow_id : str , filepath : FilePath = None ) -> str :
8898 if not flow_id :
8999 error = "Flow ID undefined."
90100 raise ValueError (error )
@@ -105,7 +115,7 @@ def download(self, flow_id, filepath=None):
105115
106116 # Update flow
107117 @api (version = "3.3" )
108- def update (self , flow_item ) :
118+ def update (self , flow_item : FlowItem ) -> FlowItem :
109119 if not flow_item .id :
110120 error = "Flow item missing ID. Flow must be retrieved from server first."
111121 raise MissingRequiredFieldError (error )
@@ -122,7 +132,7 @@ def update(self, flow_item):
122132
123133 # Update flow connections
124134 @api (version = "3.3" )
125- def update_connection (self , flow_item , connection_item ) :
135+ def update_connection (self , flow_item : FlowItem , connection_item : ConnectionItem ) -> ConnectionItem :
126136 url = "{0}/{1}/connections/{2}" .format (self .baseurl , flow_item .id , connection_item .id )
127137
128138 update_req = RequestFactory .Connection .update_req (connection_item )
@@ -133,7 +143,7 @@ def update_connection(self, flow_item, connection_item):
133143 return connection
134144
135145 @api (version = "3.3" )
136- def refresh (self , flow_item ) :
146+ def refresh (self , flow_item : FlowItem ) -> JobItem :
137147 url = "{0}/{1}/run" .format (self .baseurl , flow_item .id )
138148 empty_req = RequestFactory .Empty .empty_req ()
139149 server_response = self .post_request (url , empty_req )
@@ -142,7 +152,9 @@ def refresh(self, flow_item):
142152
143153 # Publish flow
144154 @api (version = "3.3" )
145- def publish (self , flow_item , file_path , mode , connections = None ):
155+ def publish (
156+ self , flow_item : FlowItem , file_path : FilePath , mode : str , connections : Optional [List [ConnectionItem ]] = None
157+ ) -> FlowItem :
146158 if not os .path .isfile (file_path ):
147159 error = "File path does not lead to an existing file."
148160 raise IOError (error )
@@ -189,13 +201,8 @@ def publish(self, flow_item, file_path, mode, connections=None):
189201 logger .info ("Published {0} (ID: {1})" .format (filename , new_flow .id ))
190202 return new_flow
191203
192- server_response = self .post_request (url , xml_request , content_type )
193- new_flow = FlowItem .from_response (server_response .content , self .parent_srv .namespace )[0 ]
194- logger .info ("Published {0} (ID: {1})" .format (filename , new_flow .id ))
195- return new_flow
196-
197204 @api (version = "3.3" )
198- def populate_permissions (self , item ) :
205+ def populate_permissions (self , item : FlowItem ) -> None :
199206 self ._permissions .populate (item )
200207
201208 @api (version = "3.3" )
@@ -209,25 +216,25 @@ def update_permission(self, item, permission_item):
209216 self ._permissions .update (item , permission_item )
210217
211218 @api (version = "3.3" )
212- def update_permissions (self , item , permission_item ) :
219+ def update_permissions (self , item : FlowItem , permission_item : Iterable [ "PermissionsRule" ]) -> None :
213220 self ._permissions .update (item , permission_item )
214221
215222 @api (version = "3.3" )
216- def delete_permission (self , item , capability_item ) :
223+ def delete_permission (self , item : FlowItem , capability_item : "PermissionsRule" ) -> None :
217224 self ._permissions .delete (item , capability_item )
218225
219226 @api (version = "3.5" )
220- def populate_dqw (self , item ) :
227+ def populate_dqw (self , item : FlowItem ) -> None :
221228 self ._data_quality_warnings .populate (item )
222229
223230 @api (version = "3.5" )
224- def update_dqw (self , item , warning ) :
231+ def update_dqw (self , item : FlowItem , warning : "DQWItem" ) -> None :
225232 return self ._data_quality_warnings .update (item , warning )
226233
227234 @api (version = "3.5" )
228- def add_dqw (self , item , warning ) :
235+ def add_dqw (self , item : FlowItem , warning : "DQWItem" ) -> None :
229236 return self ._data_quality_warnings .add (item , warning )
230237
231238 @api (version = "3.5" )
232- def delete_dqw (self , item ) :
239+ def delete_dqw (self , item : FlowItem ) -> None :
233240 self ._data_quality_warnings .clear (item )
0 commit comments