8000 Hacky implementation for Federated Datasources. Uses an XPath query t… · chid/document-api-python@1d07ff3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 1d07ff3

Browse files
committed
Hacky implementation for Federated Datasources. Uses an XPath query to get all connection elements (that matter) and return them as a list. This is 'functional' and doesn't break old style connections. I'm going to try something in a different PR that might be a better approach
1 parent 3b64cf3 commit 1d07ff3

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

tableaudocumentapi/datasource.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import xml.etree.ElementTree as ET
77
from tableaudocumentapi import Connection
88

9-
109
class Datasource(object):
1110
"""
1211
A class for writing datasources to Tableau files.
@@ -28,7 +27,10 @@ def __init__(self, dsxml, filename=None):
2827
self._datasourceTree = ET.ElementTree(self._datasourceXML)
2928
self._name = self._datasourceXML.get('name') or self._datasourceXML.get('formatted-name') # TDS files don't have a name attribute
3029
self._version = self._datasourceXML.get('version')
31-
self._connection = Connection(self._datasourceXML.find('connection'))
30+
if self._version == '10.0':
31+
self._connection = list(map(Connection,self._datasourceXML.findall('.//named-connections/named-connection/*')))
32+
else:
33+
self._connection = Connection(self._datasourceXML.find('connection'))
3234

3335
@classmethod
3436
def from_file(cls, filename):

test.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
</connection>
2222
</datasource>'''
2323

24+
TABLEAU_10_WORKBOOK = '''<?xml version='1.0' encoding='utf-8' ?><workbook source-build='0.0.0 (0000.16.0510.1300)' source-platform='mac' version='10.0' xmlns:user='http://www.tableausoftware.com/xml/user'><datasources><datasource caption='xy+ (Multiple Connections)' inline='true' name='federated.1s4nxn20cywkdv13ql0yk0g1mpdx' version='10.0'><connection class='federated'><named-connections><named-connection caption='mysql55.test.tsi.lan' name='mysql.1ewmkrw0mtgsev1dnurma1blii4x'><connection class='mysql' dbname='testv1' odbc-native-protocol='yes' port='3306' server='mysql55.test.tsi.lan' source-charset='' username='test' /></named-connection><named-connection caption='mssql2012.test.tsi.lan' name='sqlserver.1erdwp01uqynlb14ul78p0haai2r'><connection authentication='sqlserver' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username='test' /></named-connection></named-connections></connection></datasource></datasources></workbook>'''
25+
2426
TABLEAU_CONNECTION_XML = ET.fromstring(
2527
'''<connection authentication='sspi' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username=''></connection>''')
2628

@@ -113,6 +115,32 @@ def test_can_update_datasource_connection_and_save(self):
113115
new_wb = Workbook(self.workbook_file.name)
114116
self.assertEqual(new_wb.datasources[0].connection.dbname, 'newdb.test.tsi.lan')
115117

118+
def test_can_update_datasource_connection_and_saveV10(self):
119+
temp = io.FileIO('v10test.twb', 'w')
120+
temp.write(TABLEAU_10_WORKBOOK.encode())
121+
temp.seek(0)
122+
original_wb = Workbook(temp.name)
123+
original_wb.datasources[0].connection[0].dbname = 'newdb.test.tsi.lan'
124+
125+
original_wb.save()
126+
127+
new_wb = Workbook(temp.name)
128+
self.assertEqual(new_wb.datasources[0].connection[0].dbname, 'newdb.test.tsi.lan')
129+
130+
temp.close()
131+
132+
def test_can_extract_datasourceV10(self):
133+
temp = io.FileIO('v10test.twb', 'w')
134+
temp.write(TABLEAU_10_WORKBOOK.encode())
135+
temp.seek(0)
136+
wb = Workbook(temp.name)
137+
self.assertEqual(len(wb.datasources), 1)
138+
self.assertEqual(len(wb.datasources[0].connection), 2)
139+
self.assertIsInstance(wb.datasources[0].connection, list)
140+
self.assertIsInstance(wb.datasources[0], Datasource)
141+
self.assertEqual(wb.datasources[0].name,
142+
'federated.1s4nxn20cywkdv13ql0yk0g1mpdx')
143+
temp.close()
116144

117145
if __name__ == '__main__':
118146
unittest.main()

0 commit comments

Comments
 (0)
0