10000 Type hint groups · tableau/server-client-python@8a342c2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8a342c2

Browse files
committed
Type hint groups
1 parent ad57851 commit 8a342c2

File tree

4 files changed

+69
-55
lines changed

4 files changed

+69
-55
lines changed

tableauserverclient/models/group_item.py

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,78 +4,83 @@
44
from .reference_item import ResourceReference
55
from .user_item import UserItem
66

7+
from typing import Callable, List, Optional, TYPE_CHECKING
8+
9+
if TYPE_CHECKING:
10+
from ..server import Pager
11+
712

813
class GroupItem(object):
914

10-
tag_name = "group"
15+
tag_name: str = "group"
1116

1217
class LicenseMode:
13-
onLogin = "onLogin"
14-
onSync = "onSync"
18+
onLogin: str = "onLogin"
19+
onSync: str = "onSync"
1520

16-
def __init__(self, name=None, domain_name=None):
17-
self._id = None
18-
self._license_mode = None
19-
self._minimum_site_role = None
20-
self._users = None
21-
self.name = name
22-
self.domain_name = domain_name
21+
def __init__(self, name=None, domain_name=None) -> None:
22+
self._id: Optional[str] = None
23+
self._license_mode: Optional[str] = None
24+
self._minimum_site_role: Optional[str] = None
25+
self._users: Optional[Callable[..., "Pager"]] = None
26+
self.name: Optional[str] = name
27+
self.domain_name: Optional[str] = domain_name
2328

2429
@property
25-
def domain_name(self):
30+
def domain_name(self) -> Optional[str]:
2631
return self._domain_name
2732

2833
@domain_name.setter
29-
def domain_name(self, value):
34+
def domain_name(self, value: str) -> None:
3035
self._domain_name = value
3136

3237
@property
33-
def id(self):
38+
def id(self) -> Optional[str]:
3439
return self._id
3540

3641
@property
37-
def name(self):
42+
def name(self) -> Optional[str]:
3843
return self._name
3944

4045
@name.setter
4146
@property_not_empty
42-
def name(self, value):
47+
def name(self, value: str) -> None:
4348
self._name = value
4449

4550
@property
46-
def license_mode(self):
51+
def license_mode(self) -> Optional[str]:
4752
return self._license_mode
4853

4954
@license_mode.setter
5055
@property_is_enum(LicenseMode)
51-
def license_mode(self, value):
56+
def license_mode(self, value: str) -> None:
5257
self._license_mode = value
5358

5459
@property
55-
def minimum_site_role(self):
60+
def minimum_site_role(self) -> Optional[str]:
5661
return self._minimum_site_role
5762

5863
@minimum_site_role.setter
5964
@property_is_enum(UserItem.Roles)
60-
def minimum_site_role(self, value):
65+
def minimum_site_role(self, value: str) -> None:
6166
self._minimum_site_role = value
6267

6368
@property
64-
def users(self):
69+
def users(self) -> "Pager":
6570
if self._users is None:
6671
error = "Group must be populated with users first."
6772
raise UnpopulatedPropertyError(error)
6873
# Each call to `.users` should create a new pager, this just runs the callable
6974
return self._users()
7075

71-
def to_reference(self):
76+
def to_reference(self) -> ResourceReference:
7277
return ResourceReference(id_=self.id, tag_name=self.tag_name)
7378

74-
def _set_users(self, users):
79+
def _set_users(self, users: Callable[..., "Pager"]) -> None:
7580
self._users = users
7681

7782
@classmethod
78-
def from_response(cls, resp, ns):
83+
def from_response(cls, resp, ns) -> List["GroupItem"]:
7984
all_group_items = list()
8085
parsed_response = ET.fromstring(resp)
8186
all_group_xml = parsed_response.findall(".//t:group", namespaces=ns)
@@ -100,5 +105,5 @@ def from_response(cls, resp, ns):
100105
return all_group_items
101106

102107
@staticmethod
103-
def as_reference(id_):
108+
def as_reference(id_: str) -> ResourceReference:
104109
return ResourceReference(id_, GroupItem.tag_name)

tableauserverclient/models/workbook_item.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import copy
1313
import uuid
1414

15-
from typing import Dict, List, Optional, Set, TYPE_CHECKING
15+
from typing import Dict, List, Optional, Set, TYPE_CHECKING, Union
1616

1717
if TYPE_CHECKING:
1818
from .connection_item import ConnectionItem

tableauserverclient/server/endpoint/groups_endpoint.py

Lines changed: 19 additions & 10 deletions
100
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,20 @@
77

88
logger = logging.getLogger("tableau.endpoint.groups")
99

10+
from typing import List, Optional, TYPE_CHECKING, Tuple, Union
11+
12+
if TYPE_CHECKING:
13+
from ..request_options import RequestOptions
14+
1015

1116
class Groups(Endpoint):
1217
@property
13-
def baseurl(self):
18+
def baseurl(self) -> str:
1419
return "{0}/sites/{1}/groups".format(self.parent_srv.baseurl, self.parent_srv.site_id)
1520

1621
# Gets all groups
1722
@api(version="2.0")
18-
def get(self, req_options=None):
23+
def get(self, req_options: Optional["RequestOptions"] = None) -> Tuple[List[GroupItem], PaginationItem]:
1924
logger.info("Querying all groups on site")
2025
url = self.baseurl
2126
server_response = self.get_request(url, req_options)
@@ -25,7 +30,7 @@ def get(self, req_options=None):
2530

2631
# Gets all users in a given group
2732
@api(version="2.0")
28-
def populate_users(self, group_item, req_options=None):
33+
def populate_users(self, group_item, req_options: Optional["RequestOptions"] = None) -> None:
2934
if not group_item.id:
3035
error = "Group item missing ID. Group must be retrieved from server first."
3136
raise MissingRequiredFieldError(error)
@@ -40,7 +45,9 @@ def user_pager():
4045

4146
group_item._set_users(user_pager)
4247

43-
def _get_users_for_group(self, group_item, req_options=None):
48+
def _get_users_for_group(
49+
self, group_item, req_options: Optional["RequestOptions"] = None
50+
) -> Tuple[List[GroupItem], PaginationItem]:
4451
url = "{0}/{1}/users".format(self.baseurl, group_item.id)
4552
server_response = self.get_request(url, req_options)
4653
user_item = UserItem.from_response(server_response.content, self.parent_srv.namespace)
@@ -50,7 +57,7 @@ def _get_users_for_group(self, group_item, req_options=None):
5057

5158
# Deletes 1 group by id
5259
@api(version="2.0")
53-
def delete(self, group_id):
60+
def delete(self, group_id: str) -> None:
5461
if not group_id:
5562
error = "Group ID undefined."
5663
raise ValueError(error)
@@ -59,7 +66,9 @@ def delete(self, group_id):
5966
logger.info("Deleted single group (ID: {0})".format(group_id))
6067

6168
@api(version="2.0")
62-
def update(self, group_item, default_site_role=None, as_job=False):
69+
def update(
70+
self, group_item: GroupItem, default_site_role: Optional[str] = None, as_job: bool = False
71+
) -> Union[GroupItem, JobItem]:
6372
# (1/8/2021): Deprecated starting v0.15
6473
if default_site_role is not None:
6574
import warnings
@@ -90,15 +99,15 @@ def update(self, group_item, default_site_role=None, as_job=False):
9099

91100
# Create a 'local' Tableau group
92101
@api(version="2.0")
93-
def create(self, group_item):
102+
def create(self, group_item: GroupItem) -> GroupItem:
94103
url = self.baseurl
95104
create_req = RequestFactory.Group.create_local_req(group_item)
96105
server_response = self.post_request(url, create_req)
97106
return GroupItem.from_response(server_response.content, self.parent_srv.namespace)[0]
98107

99108
# Create a group based on Active Directory
109
@api(version="2.0")
101-
def create_AD_group(self, group_item, asJob=False):
110+
def create_AD_group(self, group_item: GroupItem, asJob: bool = False) -> Union[GroupItem, JobItem]:
102111
asJobparameter = "?asJob=true" if asJob else ""
103112
url = self.baseurl + asJobparameter
104113
create_req = RequestFactory.Group.create_ad_req(group_item)
@@ -110,7 +119,7 @@ def create_AD_group(self, group_item, asJob=False):
110119

111120
# Removes 1 user from 1 group
112121
@api(version="2.0")
113-
def remove_user(self, group_item, user_id):
122+
def remove_user(self, group_item: GroupItem, user_id: str) -> None:
114123
if not group_item.id:
115124
error = "Group item missing ID."
116125
raise MissingRequiredFieldError(error)
@@ -123,7 +132,7 @@ def remove_user(self, group_item, user_id):
123132

124133
# Adds 1 user to 1 group
125134
@api(version="2.0")
126-
def add_user(self, group_item, user_id):
135+
def add_user(self, group_item: GroupItem, user_id: str) -> UserItem:
127136
if not group_item.id:
128137
error = "Group item missing ID."
129138
raise MissingRequiredFieldError(error)

test/test_group.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020

2121
class GroupTests(unittest.TestCase):
22-
def setUp(self):
22+
def setUp(self) -> None:
2323
self.server = TSC.Server('http://test')
2424

2525
# Fake signin
@@ -28,7 +28,7 @@ def setUp(self):
2828

2929
self.baseurl = self.server.groups.baseurl
3030

31-
def test_get< 10000 /span>(self):
31+
def test_get(self) -> None:
3232
with open(GET_XML, 'rb') as f:
3333
response_xml = f.read().decode('utf-8')
3434
with requests_mock.mock() as m:
@@ -48,11 +48,11 @@ def test_get(self):
4848
self.assertEqual('TableauExample', all_groups[2].name)
4949
self.assertEqual('local', all_groups[2].domain_name)
5050

51-
def test_get_before_signin(self):
51+
def test_get_before_signin(self) -> None:
5252
self.server._auth_token = None
5353
self.assertRaises(TSC.NotSignedInError, self.server.groups.get)
5454

55-
def test_populate_users(self):
55+
def test_populate_users(self) -> None:
5656
with open(POPULATE_USERS, 'rb') as f:
5757
response_xml = f.read().decode('utf-8')
5858
with requests_mock.mock() as m:
@@ -69,12 +69,12 @@ def test_populate_users(self):
6969
self.assertEqual('Publisher', user.site_role)
7070
self.assertEqual('2016-08-16T23:17:06Z', format_datetime(user.last_login))
7171

72-
def test_delete(self):
72+
def test_delete(self) -> None:
7373
with requests_mock.mock() as m:
7474
m.delete(self.baseurl + '/e7833b48-c6f7-47b5-a2a7-36e7dd232758', status_code=204)
7575
self.server.groups.delete('e7833b48-c6f7-47b5-a2a7-36e7dd232758')
7676

77-
def test_remove_user(self):
77+
def test_remove_user(self) -> None:
7878
with open(POPULATE_USERS, 'rb') as f:
7979
response_xml_populate = f.read().decode('utf-8')
8080

@@ -98,7 +98,7 @@ def test_remove_user(self):
9898
m.get(self.baseurl + '/e7833b48-c6f7-47b5-a2a7-36e7dd232758/users', text=response_xml_empty)
9999
self.assertEqual(0, len(list(single_group.users)))
100100

101-
def test_add_user(self):
101+
def test_add_user(self) -> None:
102102
with open(ADD_USER, 'rb') as f:
103103
response_xml_add = f.read().decode('utf-8')
104104
with open(ADD_USER_POPULATE, 'rb') as f:
@@ -117,7 +117,7 @@ def test_add_user(self):
117117
self.assertEqual('testuser', user.name)
118118
self.assertEqual('ServerAdministrator', user.site_role)
119119

120-
def test_add_user_before_populating(self):
120+
def test_add_user_before_populating(self) -> None:
121121
with open(GET_XML, 'rb') as f:
122122
get_xml_response = f.read().decode('utf-8')
123123
with open(ADD_USER, 'rb') as f:
@@ -130,7 +130,7 @@ def test_add_user_before_populating(self):
130130
single_group = all_groups[0]
131131
self.server.groups.add_user(single_group, '5de011f8-5aa9-4d5b-b991-f462c8dd6bb7')
132132

133-
def test_add_user_missing_user_id(self):
133+
def test_add_user_missing_user_id(self) -> None:
134134
with open(POPULATE_USERS, 'rb') as f:
135135
response_xml = f.read().decode('utf-8')
136136
with requests_mock.mock() as m:
@@ -141,13 +141,13 @@ def test_add_user_missing_user_id(self):
141141

142142
self.assertRaises(ValueError, self.server.groups.add_user, single_group, '')
143143

144-
def test_add_user_missing_group_id(self):
144+
def test_add_user_missing_group_id(self) -> None:
145145
single_group = TSC.GroupItem('test')
146-
single_group._users = []
146+
single_group._users = [] # type: ignore[assignment]
147147
self.assertRaises(TSC.MissingRequiredFieldError, self.server.groups.add_user, single_group,
148148
'5de011f8-5aa9-4d5b-b991-f462c8dd6bb7')
149149

150-
def test_remove_user_before_populating(self):
150+
def test_remove_user_before_populating(self) -> None:
151151
with open(GET_XML, 'rb') as f:
152152
response_xml = f.read().decode('utf-8')
153153
with requests_mock.mock() as m:
@@ -159,7 +159,7 @@ def test_remove_user_before_populating(self):
159159
single_group = all_groups[0]
160160
self.server.groups.remove_user(single_group, '5de011f8-5aa9-4d5b-b991-f462c8dd6bb7')
161161

162-
def test_remove_user_missing_user_id(self):
162+
def test_remove_user_missing_user_id(self) -> None:
163163
with open(POPULATE_USERS, 'rb') as f:
164164
response_xml = f.read().decode('utf-8')
165165
with requests_mock.mock() as m:
@@ -170,13 +170,13 @@ def test_remove_user_missing_user_id(self):
170170

171171
self.assertRaises(ValueError, self.server.groups.remove_user, single_group, '')
172172

173-
def test_remove_user_missing_group_id(self):
173+
def test_remove_user_missing_group_id(self) -> None:
174174
single_group = TSC.GroupItem('test')
175-
single_group._users = []
175+
single_group._users = [] # type: ignore[assignment]
176176
self.assertRaises(TSC.MissingRequiredFieldError, self.server.groups.remove_user, single_group,
177177
'5de011f8-5aa9-4d5b-b991-f462c8dd6bb7')
178178

179-
def test_create_group(self):
179+
def test_create_group(self) -> None:
180180
with open(CREATE_GROUP, 'rb') as f:
181181
response_xml = f.read().decode('utf-8')
182182
with requests_mock.mock() as m:
@@ -186,7 +186,7 @@ def test_create_group(self):
186186
self.assertEqual(group.name, u'試供品')
187187
self.assertEqual(group.id, '3e4a9ea0-a07a-4fe6-b50f-c345c8c81034')
188188

189-
def test_create_ad_group(self):
189+
def test_create_ad_group(self) -> None:
190190
with open(CREATE_GROUP_AD, 'rb') as f:
191191
response_xml = f.read().decode('utf-8')
192192
with requests_mock.mock() as m:
@@ -199,7 +199,7 @@ def test_create_ad_group(self):
199199
self.assertEqual(group.minimum_site_role, 'Creator')
200200
self.assertEqual(group.domain_name, 'active-directory-domain-name')
201201

202-
def test_create_group_async(self):
202+
def test_create_group_async(self) -> None:
203203
with open(CREATE_GROUP_ASYNC, 'rb') as f:
204204
response_xml = f.read().decode('utf-8')
205205
with requests_mock.mock() as m:
@@ -210,7 +210,7 @@ def test_create_group_async(self):
210210
self.assertEqual(job.mode, 'Asynchronous')
211211
self.assertEqual(job.type, 'GroupImport')
212212

213-
def test_update(self):
213+
def test_update(self) -> None:
214214
with open(UPDATE_XML, 'rb') as f:
215215
response_xml = f.read().decode('utf-8')
216216
with requests_mock.mock() as m:
@@ -226,7 +226,7 @@ def test_update(self):
226226
self.assertEqual('onLogin', group.license_mode)
227227

228228
# async update is not supported for local groups
229-
def test_update_local_async(self):
229+
def test_update_local_async(self) -> None:
230230
group = TSC.GroupItem("myGroup")
231231
group._id = 'ef8b19c0-43b6-11e6-af50-63f5805dbe3c'
232232
self.assertRaises(ValueError, self.server.groups.update, group, as_job=True)

0 commit comments

Comments
 (0)
0