Skip to content
This repository was archived by the owner on Aug 2, 2019. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Looker SDK for Python

A Python library for Lookers's HTTP-based APIs.

- https://github.com/sdhoover/Python_SDK
- https://github.com/transverse/looker-python-sdk

Setup
-----
Expand Down
29 changes: 24 additions & 5 deletions looker/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,20 @@
import json
import email

class LookerClient(object):
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl


class TLSv1Adapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_TLSv1)


class LookerClient(object):
def __init__(self, token, secret, host, port=443):
self.token = token
self.secret = secret
Expand All @@ -22,7 +34,6 @@ def query(self, query, dictionary, fields, filters=None, limit=1000, output='jso


class Query(object):

# only support for JSON and GET
def __init__(self, credentials, query, dictionary, fields, filters=None, limit=1000, output='json', method='GET'):
self.credentials = credentials
Expand All @@ -39,7 +50,12 @@ def run(self):
uri = "/api/dictionaries/%s/queries/%s.%s" % (
self.dictionary, self.query, self.output)
url = "%s%s?%s" % (self.credentials.host, uri, self.__query_params())
r = requests.get(url, headers=self.__headers(uri))

# as of Looker 3.6x, TLSv1 support is only option, but requests library needs explicit override to make
# ssl library use TLSv1
s = requests.Session()
s.mount('https://', TLSv1Adapter())
r = s.get(url, headers=self.__headers(uri))
return json.loads(r.text)

def set_output(self, output):
Expand All @@ -53,11 +69,14 @@ def add_filters(self, filters):
## private methods ##

def __query_params(self):
fields_string = ",".join(sorted([field.lower() for field in self.fields]))
fields_string = ",".join([field.lower() for field in self.fields])
filters_list = []
for key, value in self.filters.iteritems():
filters_list.append("filters[%s]=%s" % (str(key).lower(), urllib.quote_plus(str(value))))
return "fields=%s&%s&limit=%i" % (fields_string, "&".join(sorted(filters_list)), self.limit)
if not len(filters_list) == 0:
return "fields=%s&%s&limit=%i" % (fields_string, "&".join(sorted(filters_list)), self.limit)
else:
return "fields=%s&limit=%i" % (fields_string, self.limit)

def __headers(self, uri):
today = email.Utils.formatdate(localtime=True)
Expand Down
14 changes: 10 additions & 4 deletions sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,25 @@
client = LookerClient('Mkz9GRYoIhyuJ898YG89Ig',
'v1+MNxMg1vdmljYbtBhEDFEQSlAUEZd4xWd',
'https://demo.looker.com')
# create a query object no filters
query1 = client.query('orders',
'thelook',
['orders.count', 'users.count'],
{})

# create a query object
query1 = client.query('orders',
query2 = client.query('orders',
'thelook',
['orders.count', 'users.count'],
{'users.state': '-%New%',
'orders.created_date': '90 days'})

# create another query object
query2 = client.query('orders', 'thelook',
query3 = client.query('orders', 'thelook',
['orders.count'],
{'users.created_date': '90 days'})
query2.add_filters({'orders.created_date': '90 days'})
query3.add_filters({'orders.created_date': '90 days'})

print query1.run()
print query2.run()
print query2.run()
print query3.run()
10 changes: 5 additions & 5 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from setuptools import setup

setup(name='looker_sdk',
version='0.1',
setup(name='looker-python-sdk',
version='0.2',
description='Python SDK for pulling data from Looker',
url='https://github.com/llooker/python_sdk',
author='Scott Hoover',
author_email='scott@looker.com',
url='https://github.com/transverse/looker-python-sdk',
author='Transverse, LLC',
author_email='info@gotransverse.com',
license='MIT',
packages=['looker'],
install_requires=['requests'],
Expand Down