8000 Resolve merge conflicts · onware/document-api-python@cbb596b · GitHub
[go: up one dir, main page]

Skip to content

Commit cbb596b

Browse files
committed
Resolve merge conflicts
2 parents 6663c87 + 4a09dfa commit cbb596b

File tree

8 files changed

+113
-9
lines changed

8 files changed

+113
-9
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,6 @@ target/
6060

6161
#Ipython Notebook
6262
.ipynb_checkpoints
63+
64+
#Other things
65+
.DS_Store

.travis.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
language: python
2+
python:
3+
- "2.7"
4+
- "3.3"
5+
- "3.4"
6+
- "3.5"
7+
- "pypy"
8+
# command to install dependencies
9+
install:
10+
- "pip install -e ."
11+
- "pip install pep8"
12+
# command to run tests
13+
script:
14+
# Tests
15+
- python test.py
16+
# pep8
17+
- pep8 --ignore=E501 .
18+
# Examples
19+
- (cd "Examples/Replicate Workbook" && python replicateWorkbook.py)
20+
- (cd "Examples/List TDS Info" && python listTDSInfo.py)
21+

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# document-api-python
22

3+
[![Build Status](https://travis-ci.org/tableau/document-api-python.svg?branch=master)](https://travis-ci.org/tableau/document-api-python)
4+
35
This repo contains Python source and example files for the Tableau Document API. We're just getting started and have plans to expand what you find here. Help us by submitting feedback, issues, and pull requests!
46

57
Document API

tableaudocumentapi/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
__version__ = '0.0.1'
2-
__VERSION__ = __version__
31
from .connection import Connection
42
from .datasource import Datasource, ConnectionParser
53
from .workbook import Workbook
4+
__version__ = '0.0.1'
5+
__VERSION__ = __version__

tableaudocumentapi/connection.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ def __init__(self, connxml):
2626
self._dbname = connxml.get('dbname')
2727
self._server = connxml.get('server')
2828
self._username = connxml.get('username')
29+
self._authentication = connxml.get('authentication')
30+
self._class = connxml.get('class')
31+
32+
def __repr__(self):
33+
return "'<Connection server='{}' dbname='{}' @ {}>'".format(self._server, self._dbname, hex(id(self)))
2934

3035
###########
3136
# dbname
@@ -92,3 +97,17 @@ def username(self, value):
9297
"""
9398
self._username = value
9499
self._connectionXML.set('username', value)
100+
101+
###########
102+
# authentication
103+
###########
104+
@property
105+
def authentication(self):
106+
return self._authentication
107+
108+
###########
109+
# dbclass
110+
###########
111+
@property
112+
def dbclass(self):
113+
return self._class

tableaudocumentapi/datasource.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def save(self):
7272
"""
7373

7474
# save the file
75< 8000 /code>-
self._datasourceTree.write(self._filename)
75+
self._datasourceTree.write(self._filename, encoding="utf-8", xml_declaration=True)
7676

7777
def save_as(self, new_filename):
7878
"""
@@ -85,7 +85,7 @@ def save_as(self, new_filename):
8585
Nothing.
8686
8787
"""
88-
self._datasourceTree.write(new_filename)
88+
self._datasourceTree.write(new_filename, encoding="utf-8", xml_declaration=True)
8989

9090
###########
9191
# name

tableaudocumentapi/workbook.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ def save(self):
115115
if zipfile.is_zipfile(self._filename):
116116
self._save_into_twbx(self._filename)
117117
else:
118-
self._workbookTree.write(self._filename)
118+
self._workbookTree.write(
119+
self._filename, encoding="utf-8", xml_declaration=True)
119120

120121
def save_as(self, new_filename):
121122
"""
@@ -128,10 +129,12 @@ def save_as(self, new_filename):
128129
Nothing.
129130
130131
"""
132+
131133
if zipfile.is_zipfile(self._filename):
132134
self._save_into_twbx(new_filename)
133135
else:
134-
self._workbookTree.write(new_filename)
136+
self._workbookTree.write(
137+
new_filename, encoding="utf-8", xml_declaration=True)
135138

136139
###########################################################################
137140
#
@@ -164,7 +167,8 @@ def _save_into_twbx(self, filename=None):
164167
twb_file = find_twb_in_zip(zf)
165168
zf.extractall(temp_path)
166169
# Write the new version of the twb to the temp directory
167-
self._workbookTree.write(os.path.join(temp_path, twb_file))
170+
self._workbookTree.write(os.path.join(
171+
temp_path, twb_file), encoding="utf-8", xml_declaration=True)
168172

169173
# Write the new twbx with the contents of the temp folder
170174
with zipfile.ZipFile(filename, "w", compression=zipfile.ZIP_DEFLATED) as new_twbx:

test.py

Lines changed: 57 additions & 2 deletions
8000
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
TABLEAU_93_TDS = '''<?xml version='1.0' encoding='utf-8' ?><datasource formatted-name='sqlserver.17u3bqc16tjtxn14e2hxh19tyvpo' inline='true' source-platform='mac' version='9.3' xmlns:user='http://www.tableausoftware.com/xml/user'><connection authentication='sspi' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username=''></connection></datasource>'''
1414

15-
TABLEAU_10_TDS = '''<?xml version='1.0' encoding='utf-8' ?><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>'''
15+
TABLEAU_10_TDS = '''<?xml version='1.0' encoding='utf-8' ?><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>'''
1616

1717
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></datasourc 8000 es></workbook>'''
1818

@@ -62,13 +62,16 @@ def test_can_read_attributes_from_connection(self):
6262
self.assertEqual(conn.dbname, 'TestV1')
6363
self.assertEqual(conn.username, '')
6464
self.assertEqual(conn.server, 'mssql2012.test.tsi.lan')
65+
self.assertEqual(conn.dbclass, 'sqlserver')
66+
self.assertEqual(conn.authentication, 'sspi')
6567

6668
def test_can_write_attributes_to_connection(self):
6769
conn = Connection(self.connection)
6870
conn.dbname = 'BubblesInMyDrink'
6971
conn.server = 'mssql2014.test.tsi.lan'
72+
conn.username = 'bob'
7073
self.assertEqual(conn.dbname, 'BubblesInMyDrink')
71-
self.assertEqual(conn.username, '')
74+
self.assertEqual(conn.username, 'bob')
7275
self.assertEqual(conn.server, 'mssql2014.test.tsi.lan')
7376

7477

@@ -101,6 +104,47 @@ def test_can_save_tds(self):
101104
new_tds = Datasource.from_file(self.tds_file.name)
102105
self.assertEqual(new_tds.connections[0].dbname, 'newdb.test.tsi.lan')
103106

107+
def test_save_has_xml_declaration(self):
108+
original_tds = Datasource.from_file(self.tds_file.name)
109+
original_tds.connections[0].dbname = 'newdb.test.tsi.lan'
110+
111+
original_tds.save()
112+
113+
with open(self.tds_file.name) as f:
114+
first_line = f.readline().strip() # first line should be xml tag
115+
self.assertEqual(
116+
first_line, "<?xml version='1.0' encoding='utf-8'?>")
117+
118+
119+
class DatasourceModelV10Tests(unittest.TestCase):
120+
121+
def setUp(self):
122+
self.tds_file = io.FileIO('test10.tds', 'w')
123+
self.tds_file.write(TABLEAU_10_TDS.encode('utf8'))
124+
self.tds_file.seek(0)
125+
126+
def tearDown(self):
127+
self.tds_file.close()
128+
os.unlink(self.tds_file.name)
129+
130+
def test_can_extract_datasource_from_file(self):
131+
ds = Datasource.from_file(self.tds_file.name)
132+
self.assertEqual(ds.name, 'federated.1s4nxn20cywkdv13ql0yk0g1mpdx')
133+
self.assertEqual(ds.version, '10.0')
134+
135+
def test_can_extract_connection(self):
136+
ds = Datasource.from_file(self.tds_file.name)
137+
self.assertIsInstance(ds.connections[0], Connection)
138+
self.assertIsInstance(ds.connections, list)
139+
140+
def test_can_save_tds(self):
141+
original_tds = Datasource.from_file(self.tds_file.name)
142+
original_tds.connections[0].dbname = 'newdb.test.tsi.lan'
143+
original_tds.save()
144+
145+
new_tds = Datasource.from_file(self.tds_file.name)
146+
self.assertEqual(new_tds.connections[0].dbname, 'newdb.test.tsi.lan')
147+
104148

105149
class WorkbookModelTests(unittest.TestCase):
106150

@@ -160,6 +204,17 @@ def test_can_update_datasource_connection_and_saveV10(self):
160204
self.assertEqual(new_wb.datasources[0].connections[
161205
0].dbname, 'newdb.test.tsi.lan')
162206

207+
def test_save_has_xml_declaration(self):
208+
original_wb = Workbook(self.workbook_file.name)
209+
original_wb.datasources[0].connections[0].dbname = 'newdb.test.tsi.lan'
210+
211+
original_wb.save()
212+
213+
with open(self.workbook_file.name) as f:
214+
first_line = f.readline().strip() # first line should be xml tag
215+
self.assertEqual(
216+
first_line, "<?xml version='1.0' encoding='utf-8'?>")
217+
163218

164219
class WorkbookModelV10TWBXTests(unittest.TestCase):
165220

0 commit comments

Comments
 (0)
0