diff --git a/docs/docs/api-ref.md b/docs/docs/api-ref.md index 3819b70..cf6bc96 100644 --- a/docs/docs/api-ref.md +++ b/docs/docs/api-ref.md @@ -48,6 +48,30 @@ class Datasource(dsxml, filename=None) class Connection(connxml) ``` +The Connection class represents a tableau data connection. It can be from any type of connection found in `dbclass.py` via `is_valid_dbclass` + +**Params:** + +**Raises:** + +**Methods:** + +**Properities:** + +`self.server:` Returns a string containing the server. + +`self.dbname:` Returns a string containing the database name. + +`self.username:` Returns a string containing the username. + +`self.dbclass:` Returns a string containing the database class. + +`self.port:` Returns a string containing the port. + +`self.query_band:` Returns a string containing the query band. + +`self.initial_sql:` Returns a string containing the initial sql. + ## Fields ```python class Workbook(column_xml=None, metadata_xml=None) diff --git a/tableaudocumentapi/connection.py b/tableaudocumentapi/connection.py index 7bdc1a9..30343b5 100644 --- a/tableaudocumentapi/connection.py +++ b/tableaudocumentapi/connection.py @@ -18,12 +18,15 @@ def __init__(self, connxml): self._authentication = connxml.get('authentication') self._class = connxml.get('class') self._port = connxml.get('port', None) + self._query_band = connxml.get('query-band-spec', None) + self._initial_sql = connxml.get('one-time-sql', None) def __repr__(self): return "''".format(self._server, self._dbname, hex(id(self))) @classmethod - def from_attributes(cls, server, dbname, username, dbclass, port=None, authentication=''): + def from_attributes(cls, server, dbname, username, dbclass, port=None, query_band=None, + initial_sql=None, authentication=''): """Creates a new connection that can be added into a Data Source. defaults to `''` which will be treated as 'prompt' by Tableau.""" @@ -34,6 +37,8 @@ def from_attributes(cls, server, dbname, username, dbclass, port=None, authentic xml.username = username xml.dbclass = dbclass xml.port = port + xml.query_band = query_band + xml.initial_sql = initial_sql return xml @@ -149,3 +154,55 @@ def port(self, value): pass else: self._connectionXML.set('port', value) + + @property + def query_band(self): + """Query band passed on connection to database.""" + return self._query_band + + @query_band.setter + def query_band(self, value): + """Set the connection's query_band property. + + Args: + value: New query_band value. String. + + Returns: + Nothing. + """ + + self._query_band = value + # If query band is None we remove the element and don't write it to XML + if value is None: + try: + del self._connectionXML.attrib['query-band-spec'] + except KeyError: + pass + else: + self._connectionXML.set('query-band-spec', value) + + @property + def initial_sql(self): + """Initial SQL to be run.""" + return self._initial_sql + + @initial_sql.setter + def initial_sql(self, value): + """Set the connection's initial_sql property. + + Args: + value: New initial_sql value. String. + + Returns: + Nothing. + """ + + self._initial_sql = value + # If initial_sql is None we remove the element and don't write it to XML + if value is None: + try: + del self._connectionXML.attrib['one-time-sql'] + except KeyError: + pass + else: + self._connectionXML.set('one-time-sql', value) diff --git a/test/assets/CONNECTION.xml b/test/assets/CONNECTION.xml index beb606f..56d17d5 100644 --- a/test/assets/CONNECTION.xml +++ b/test/assets/CONNECTION.xml @@ -1 +1 @@ - + diff --git a/test/bvt.py b/test/bvt.py index e09ec55..23869fb 100644 --- a/test/bvt.py +++ b/test/bvt.py @@ -60,6 +60,8 @@ def test_can_read_attributes_from_connection(self): self.assertEqual(conn.dbclass, 'sqlserver') self.assertEqual(conn.authentication, 'sspi') self.assertEqual(conn.port, '1433') + self.assertEqual(conn.initial_sql, '') + self.assertEqual(conn.query_band, '') def test_can_write_attributes_to_connection(self): conn = Connection(self.connection) @@ -67,10 +69,14 @@ def test_can_write_attributes_to_connection(self): conn.server = 'mssql2014' conn.username = 'bob' conn.port = '1337' + conn.initial_sql = "insert values (1, 'winning') into schema.table" + conn.query_band = 'TableauReport=' self.assertEqual(conn.dbname, 'BubblesInMyDrink') self.assertEqual(conn.username, 'bob') self.assertEqual(conn.server, 'mssql2014') self.assertEqual(conn.port, '1337') + self.assertEqual(conn.initial_sql, "insert values (1, 'winning') into schema.table") + self.assertEqual(conn.query_band, 'TableauReport=') def test_can_delete_port_from_connection(self): conn = Connection(self.connection) @@ -78,6 +84,18 @@ def test_can_delete_port_from_connection(self): self.assertEqual(conn.port, None) self.assertIsNone(conn._connectionXML.get('port')) + def test_can_delete_initial_sql_from_connection(self): + conn = Connection(self.connection) + conn.initial_sql = None + self.assertEqual(conn.initial_sql, None) + self.assertIsNone(conn._connectionXML.get('initial_sql')) + + def test_can_delete_query_band_from_connection(self): + conn = Connection(self.connection) + conn.query_band = None + self.assertEqual(conn.query_band, None) + self.assertIsNone(conn._connectionXML.get('query_band')) + def test_bad_dbclass_rasies_attribute_error(self): conn = Connection(self.connection) conn.dbclass = 'sqlserver'