8000 Jorwoods/type hint favorites (#936) · tableau/server-client-python@f40d4bc · GitHub
[go: up one dir, main page]

Skip to content

Commit f40d4bc

Browse files
authored
Jorwoods/type hint favorites (#936)
* Type hint Favorites * Type hint FavoriteRequest
1 parent 4d0142d commit f40d4bc

File tree

4 files changed

+96
-35
lines changed

4 files changed

+96
-35
lines changed

tableauserverclient/models/favorites_item.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,39 @@
44
from .view_item import ViewItem
55
from .project_item import ProjectItem
66
from .datasource_item import DatasourceItem
7+
from .flow_item import FlowItem
78

89
logger = logging.getLogger("tableau.models.favorites_item")
910

11+
from typing import Dict, List, Union
12+
13+
FavoriteType = Dict[
14+
str,
15+
List[
16+
Union[
17+
DatasourceItem,
18+
ProjectItem,
19+
FlowItem,
20+
ViewItem,
21+
WorkbookItem,
22+
]
23+
],
24+
]
25+
1026

1127
class FavoriteItem:
1228
class Type:
13-
Workbook = "workbook"
14-
Datasource = "datasource"
15-
View = "view"
16-
Project = "project"
29+
Workbook: str = "workbook"
30+
Datasource: str = "datasource"
31+
View: str = "view"
32+
Project: str = "project"
33+
Flow: str = "flow"
1734

1835
@classmethod
19-
def from_response(cls, xml, namespace):
20-
favorites = {
36+
def from_response(cls, xml: str, namespace: Dict) -> FavoriteType:
37+
favorites: FavoriteType = {
2138
"datasources": [],
39+
"flows": [],
2240
"projects": [],
2341
"views": [],
2442
"workbooks": [],
@@ -45,5 +63,10 @@ def from_response(cls, xml, namespace):
4563
fav_project._set_values(*fav_project._parse_element(project))
4664
if fav_project:
4765
favorites["projects"].append(fav_project)
66+
for flow in parsed_response.findall(".//t:favorite/t:flow", namespace):
67+
fav_flow = FlowItem("flows")
68+
fav_flow._set_values(*fav_flow._parse_element(flow, namespace))
69+
if fav_flow:
70+
favorites["flows"].append(fav_flow)
4871

4972
return favorites
Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,92 @@
11
from .endpoint import Endpoint, api
2-
from .exceptions import MissingRequiredFieldError
32
from .. import RequestFactory
43
from ...models import FavoriteItem
5-
from ..pager import Pager
6-
import xml.etree.ElementTree as ET
74
import logging
8-
import copy
95

106
logger = logging.getLogger("tableau.endpoint.favorites")
117

8+
from typing import Optional, TYPE_CHECKING
9+
10+
if TYPE_CHECKING:
11+
from ...models import DatasourceItem, FlowItem, ProjectItem, UserItem, ViewItem, WorkbookItem
12+
from ..request_options import RequestOptions
13+
1214

1315
class Favorites(Endpoint):
1416
@property
15-
def baseurl(self):
17+
def baseurl(self) -> str:
1618
return "{0}/sites/{1}/favorites".format(self.parent_srv.baseurl, self.parent_srv.site_id)
1719

1820
# Gets all favorites
1921
@api(version="2.5")
20-
def get(self, user_item, req_options=None):
22+
def get(self, user_item: "UserItem", req_options: Optional["RequestOptions"] = None) -> None:
2123
logger.info("Querying all favorites for user {0}".format(user_item.name))
2224
url = "{0}/{1}".format(self.baseurl, user_item.id)
2325
server_response = self.get_request(url, req_options)
2426

2527
user_item._favorites = FavoriteItem.from_response(server_response.content, self.parent_srv.namespace)
2628

2729
@api(version="2.0")
28-
def add_favorite_workbook(self, user_item, workbook_item):
30+
def add_favorite_workbook(self, user_item: "UserItem", workbook_item: "WorkbookItem") -> None:
2931
url = "{0}/{1}".format(self.baseurl, user_item.id)
3032
add_req = RequestFactory.Favorite.add_workbook_req(workbook_item.id, workbook_item.name)
3133
server_response = self.put_request(url, add_req)
3234
logger.info("Favorited {0} for user (ID: {1})".format(workbook_item.name, user_item.id))
3335

3436
@api(version="2.0")
35-
def add_favorite_view(self, user_item, view_item):
37+
def add_favorite_view(self, user_item: "UserItem", view_item: "ViewItem") -> None:
3638
url = "{0}/{1}".format(self.baseurl, user_item.id)
3739
add_req = RequestFactory.Favorite.add_view_req(view_item.id, view_item.name)
3840
server_response = self.put_request(url, add_req)
3941
logger.info("Favorited {0} for user (ID: {1})".format(view_item.name, user_item.id))
4042

4143
@api(version="2.3")
42-
def add_favorite_datasource(self, user_item, datasource_item):
44+
def add_favorite_datasource(self, user_item: "UserItem", datasource_item: "DatasourceItem") -> None:
4345
url = "{0}/{1}".format(self.baseurl, user_item.id)
4446
add_req = RequestFactory.Favorite.add_datasource_req(datasource_item.id, datasource_item.name)
4547
server_response = self.put_request(url, add_req)
4648
logger.info("Favorited {0} for user (ID: {1})".format(datasource_item.name, user_item.id))
4749

4850
@api(version="3.1")
49-
def add_favorite_project(self, user_item, project_item):
51+
def add_favorite_project(self, user_item: "UserItem", project_item: "ProjectItem") -> None:
5052
url = "{0}/{1}".format(self.baseurl, user_item.id)
5153
add_req = RequestFactory.Favorite.add_project_req(project_item.id, project_item.name)
5254
server_response = self.put_request(url, add_req)
5355
logger.info("Favorited {0} for user (ID: {1})".format(project_item.name, user_item.id))
5456

57+
@api(version="3.3")
58+
def add_favorite_flow(self, user_item: "UserItem", flow_item: "FlowItem") -> None:
59+
url = "{0}/{1}".format(self.baseurl, user_item.id)
60+
add_req = RequestFactory.Favorite.add_flow_req(flow_item.id, flow_item.name)
61+
server_response = self.put_request(url, add_req)
62+
logger.info("Favorited {0} for user (ID: {1})".format(flow_item.name, user_item.id))
63+
5564
@api(version="2.0")
56-
def delete_favorite_workbook(self, user_item, workbook_item):
65+
def delete_favorite_workbook(self, user_item: "UserItem", workbook_item: "WorkbookItem") -> None:
5766
url = "{0}/{1}/workbooks/{2}".format(self.baseurl, user_item.id, workbook_item.id)
5867
logger.info("Removing favorite {0} for user (ID: {1})".format(workbook_item.id, user_item.id))
5968
self.delete_request(url)
6069

6170
@api(version="2.0")
62-
def delete_favorite_view(self, user_item, view_item):
71+
def delete_favorite_view(self, user_item: "UserItem", view_item: "ViewItem") -> None:
6372
url = "{0}/{1}/views/{2}".format(self.baseurl, user_item.id, view_item.id)
6473
logger.info("Removing favorite {0} for user (ID: {1})".format(view_item.id, user_item.id))
6574
self.delete_request(url)
6675

6776
@api(version="2.3")
68-
def delete_favorite_datasource(self, user_item, datasource_item):
77+
def delete_favorite_datasource(self, user_item: "UserItem", datasource_item: "DatasourceItem") -> None:
6978
url = "{0}/{1}/datasources/{2}".format(self.baseurl, user_item.id, datasource_item.id)
7079
logger.info("Removing favorite {0} for user (ID: {1})".format(datasource_item.id, user_item.id))
7180
self.delete_request(url)
7281

7382
@api(version="3.1")
74-
def delete_favorite_project(self, user_item, project_item):
83+
def delete_favorite_project(self, user_item: "UserItem", project_item: "ProjectItem") -> None:
7584
url = "{0}/{1}/projects/{2}".format(self.baseurl, user_item.id, project_item.id)
7685
logger.info("Removing favorite {0} for user (ID: {1})".format(project_item.id, user_item.id))
7786
self.delete_request(url)
87+
88+
@api(version="3.3")
89+
def delete_favorite_flow(self, user_item: "UserItem", flow_item: "FlowItem") -> None:
90+
url = "{0}/{1}/projects/{2}".format(self.baseurl, user_item.id, flow_item.id)
91+
logger.info("Removing favorite {0} for user (ID: {1})".format(flow_item.id, user_item.id))
92+
self.delete_request(url)

tableauserverclient/server/request_factory.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from ..models import TaskItem, UserItem, GroupItem, PermissionsRule, FavoriteItem
77

8-
from typing import TYPE_CHECKING
8+
from typing import Optional, TYPE_CHECKING
99

1010
if TYPE_CHECKING:
1111
from ..models import DataAlertItem
@@ -242,7 +242,7 @@ def update_req(self, database_item):
242242

243243

244244
class FavoriteRequest(object):
245-
def _add_to_req(self, id_, target_type, label):
245+
def _add_to_req(self, id_: str, target_type: str, label: str) -> bytes:
246246
"""
247247
<favorite label="...">
248248
<target_type id="..." />
@@ -256,16 +256,39 @@ def _add_to_req(self, id_, target_type, label):
256256

257257
return ET.tostring(xml_request)
258258

259-
def add_datasource_req(self, id_, name):
259+
def add_datasource_req(self, id_: Optional[str], name: Optional[str]) -> bytes:
260+
if id_ is None:
261+
raise ValueError("id must exist to add to favorites")
262+
if name is None:
263+
raise ValueError("Name must exist to add to favorites.")
260264
return self._add_to_req(id_, FavoriteItem.Type.Datasource, name)
261265

262-
def add_project_req(self, id_, name):
266+
def add_flow_req(self, id_: Optional[str], name: Optional[str]) -> bytes:
267+
if id_ is None:
268+
raise ValueError("id must exist to add to favorites")
269+
if name is None:
270+
raise ValueError("Name must exist to add to favorites.")
271+
return self._add_to_req(id_, FavoriteItem.Type.Flow, name)
272+
273+
def add_project_req(self, id_: Optional[str], name: Optional[str]) -> bytes:
274+
if id_ is None:
275+
raise ValueError("id must exist to add to favorites")
276+
if name is None:
277+
raise ValueError("Name must exist to add to favorites.")
263278
return self._add_to_req(id_, FavoriteItem.Type.Project, name)
264279

265-
def add_view_req(self, id_, name):
280+
def add_view_req(self, id_: Optional[str], name: Optional[str]) -> bytes:
281+
if id_ is None:
282+
raise ValueError("id must exist to add to favorites")
283+
if name is None:
284+
raise ValueError("Name must exist to add to favorites.")
266285
return self._add_to_req(id_, FavoriteItem.Type.View, name)
267286

268-
def add_workbook_req(self, id_, name):
287+
def add_workbook_req(self, id_: Optional[str], name: Optional[str]) -> bytes:
288+
if id_ is None:
289+
raise ValueError("id must exist to add to favorites")
290+
if name is None:
291+
raise ValueError("Name must exist to add to favorites.")
269292
return self._add_to_req(id_, FavoriteItem.Type.Workbook, name)
270293

271294

test/test_favorites.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def setUp(self):
2828
self.user = TSC.UserItem("alice", TSC.UserItem.Roles.Viewer)
2929
self.user._id = "dd2239f6-ddf1-4107-981a-4cf94e415794"
3030

31-
def test_get(self):
31+
def test_get(self) -> None:
3232
response_xml = read_xml_asset(GET_FAVORITES_XML)
3333
with requests_mock.mock() as m:
3434
m.get("{0}/{1}".format(self.baseurl, self.user.id), text=response_xml)
@@ -49,7 +49,7 @@ def test_get(self):
4949
self.assertEqual(datasource.id, "e76a1461-3b1d-4588-bf1b-17551a879ad9")
5050
self.assertEqual(project.id, "1d0304cd-3796-429f-b815-7258370b9b74")
5151

52-
def test_add_favorite_workbook(self):
52+
def test_add_favorite_workbook(self) -> None:
5353
response_xml = read_xml_asset(ADD_FAVORITE_WORKBOOK_XML)
5454
workbook = TSC.WorkbookItem("")
5555
workbook._id = "6d13b0ca-043d-4d42-8c9d-3f3313ea3a00"
@@ -58,7 +58,7 @@ def test_add_favorite_workbook(self):
5858
m.put("{0}/{1}".format(self.baseurl, self.user.id), text=response_xml)
5959
self.server.favorites.add_favorite_workbook(self.user, workbook)
6060

61-
def test_add_favorite_view(self):
61+
def test_add_favorite_view(self) -> None:
6262
response_xml = read_xml_asset(ADD_FAVORITE_VIEW_XML)
6363
view = TSC.ViewItem()
6464
view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5"
@@ -67,7 +67,7 @@ def test_add_favorite_view(self):
6767
m.put("{0}/{1}".format(self.baseurl, self.user.id), text=response_xml)
6868
self.server.favorites.add_favorite_view(self.user, view)
6969

70-
def test_add_favorite_datasource(self):
70+
def test_add_favorite_datasource(self) -> None:
7171
response_xml = read_xml_asset(ADD_FAVORITE_DATASOURCE_XML)
7272
datasource = TSC.DatasourceItem("ee8c6e70-43b6-11e6-af4f-f7b0d8e20760")
7373
datasource._id = "e76a1461-3b1d-4588-bf1b-17551a879ad9"
@@ -76,7 +76,7 @@ def test_add_favorite_datasource(self):
7676
m.put("{0}/{1}".format(self.baseurl, self.user.id), text=response_xml)
7777
self.server.favorites.add_favorite_datasource(self.user, datasource)
7878

79-
def test_add_favorite_project(self):
79+
def test_add_favorite_project(self) -> None:
8080
self.server.version = "3.1"
8181
baseurl = self.server.favorites.baseurl
8282
response_xml = read_xml_asset(ADD_FAVORITE_PROJECT_XML)
@@ -86,31 +86,31 @@ def test_add_favorite_project(self):
8686
m.put("{0}/{1}".format(baseurl, self.user.id), text=response_xml)
8787
self.server.favorites.add_favorite_project(self.user, project)
8888

89-
def test_delete_favorite_workbook(self):
89+
def test_delete_favorite_workbook(self) -> None:
9090
workbook = TSC.WorkbookItem("")
9191
workbook._id = "6d13b0ca-043d-4d42-8c9d-3f3313ea3a00"
9292
workbook.name = "Superstore"
9393
with requests_mock.mock() as m:
9494
m.delete("{0}/{1}/workbooks/{2}".format(self.baseurl, self.user.id, workbook.id))
9595
self.server.favorites.delete_favorite_workbook(self.user, workbook)
9696

97-
def test_delete_favorite_view(self):
97+
def test_delete_favorite_view(self) -> None:
9898
view = TSC.ViewItem()
9999
view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5"
100100
view._name = "ENDANGERED SAFARI"
101101
with requests_mock.mock() as m:
102102
m.delete("{0}/{1}/views/{2}".format(self.baseurl, self.user.id, view.id))
103103
self.server.favorites.delete_favorite_view(self.user, view)
104104

105-
def test_delete_favorite_datasource(self):
105+
def test_delete_favorite_datasource(self) -> None:
106106
datasource = TSC.DatasourceItem("ee8c6e70-43b6-11e6-af4f-f7b0d8e20760")
107107
datasource._id = "e76a1461-3b1d-4588-bf1b-17551a879ad9"
108108
datasource.name = "SampleDS"
109109
with requests_mock.mock() as m:
110110
m.delete("{0}/{1}/datasources/{2}".format(self.baseurl, self.user.id, datasource.id))
111111
self.server.favorites.delete_favorite_datasource(self.user, datasource)
112112

113-
def test_delete_favorite_project(self):
113+
def test_delete_favorite_project(self) -> None:
114114
self.server.version = "3.1"
115115
baseurl = self.server.favorites.baseurl
116116
project = TSC.ProjectItem("Tableau")

0 commit comments

Comments
 (0)
0