Skip to content

Commit 227e378

Browse files
committed
init commit
1 parent c583650 commit 227e378

File tree

9 files changed

+145
-0
lines changed

9 files changed

+145
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ __pycache__/
77
*.so
88

99
# Distribution / packaging
10+
.keys
1011
.Python
1112
build/
1213
develop-eggs/

quickbase_json/__init__.py

Whitespace-only changes.
File renamed without changes.

quickbase_json/helpers.py

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
class IncorrectParameters(Exception):
2+
def __init__(self, value, expected):
3+
self.value = value
4+
self.message = f'{value} is type {type(value)}. Expected {expected}.'
5+
super().__init__(self.message)
6+
7+
8+
def build_query_str(fid, operator, value):
9+
return f'{{{fid}.{operator}.{value}}}'
10+
11+
12+
class QuickbaseParameter:
13+
14+
def build(self):
15+
return 'Default String'
16+
17+
def __str__(self):
18+
return self.build()
19+
20+
21+
class Where(QuickbaseParameter):
22+
def __init__(self, fid: any, operator: str, value: any, **kwargs):
23+
"""
24+
Initializes the quickbase query.
25+
:param fid: Field Id, represents "where"
26+
:param operator: Quickbase Query Language operator. https://help.quickbase.com/api-guide/do_query.html#queryOperators
27+
:param value: Value to compare against
28+
:param kwargs:
29+
"""
30+
self.fid = fid
31+
self.operator = operator
32+
self.value = value
33+
34+
# add quotes for strings
35+
if isinstance(self.value, str):
36+
self.value = '"{}"'.format(self.value)
37+
38+
def build(self, **kwargs):
39+
40+
if kwargs.get('join') == 'OR':
41+
# check that value is a list
42+
if isinstance(self.value, list) is False:
43+
raise IncorrectParameters(self.value, list)
44+
45+
# build queries
46+
queries = []
47+
for v in self.value:
48+
queries.append(build_query_str(self.fid, self.operator, v))
49+
50+
# return chain of queries
51+
return 'OR'.join(queries)
52+
53+
return build_query_str(self.fid, self.operator, self.value)
54+
55+
56+
class Sort(QuickbaseParameter):
57+
def __init__(self, sort_pairs: list):
58+
"""
59+
Creates a sort parameter for quickbase query.
60+
:param sort_pairs: tuples of fid and order, i.e. (4, 'ASC')
61+
"""
62+
self.sort_pairs = sort_pairs
63+
64+
def build(self):
65+
66+
# ensure pairs is a list
67+
if not isinstance(self.sort_pairs, list):
68+
raise IncorrectParameters(self.sort_pairs, list)
69+
70+
sorters = []
71+
for pair in self.sort_pairs:
72+
sorters.append({'fieldId': pair[0], 'order': pair[1]})
73+
74+
return sorters
75+
76+
77+
class Group(QuickbaseParameter):
78+
def __init__(self, group_pairs: list):
79+
"""
80+
Creates a groupBy parameter for quickbase query.
81+
:param group_pairs: list of tuples, i.e. (3, 'equal-value')
82+
"""
83+
self.group_pairs = group_pairs
84+
85+
def build(self):
86+
87+
# ensure pairs is a list
88+
if not isinstance(self.group_pairs, list):
89+
raise IncorrectParameters(self.group_pairs, list)
90+
91+
sorters = []
92+
for pair in self.group_pairs:
93+
sorters.append({'fieldId': pair[0], 'grouping': pair[1]})
94+
95+
return sorters

requirements.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
setuptools~=45.2.0
2+
requests~=2.24.0
3+
requests~=2.24.0

requirements_dev.txt

Whitespace-only changes.

setup.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from setuptools import find_packages, setup
2+
setup(
3+
name='quickbase-json',
4+
packages=find_packages(include=['quickbase_json']),
5+
version='0.1.0',
6+
description='Quickbase JSON API wrapper for python',
7+
author='Robert Carroll',
8+
license='MIT',
9+
install_requires=['requests=>2.24.0'],
10+
setup_requires=['pytest-runner'],
11+
tests_require=['pytest==4.4.1'],
12+
test_suite='tests',
13+
)

tests/__init__.py

Whitespace-only changes.

tests/test_client.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import datetime
2+
3+
import pytest
4+
5+
from quickbase_json import client as qbc
6+
from quickbase_json.helpers import Where, IncorrectParameters
7+
from quickbase_json.helpers import Sort as qbs
8+
from quickbase_json.helpers import Group as qbg
9+
10+
11+
# test where
12+
@pytest.mark.parametrize('fid, operator, value, expected', [
13+
(3, 'EX', 12345, '{3.EX.12345}'),
14+
(3, 'XEX', 12345, '{3.XEX.12345}'),
15+
(10, 'EX', 12345, '{10.EX.12345}')
16+
])
17+
def test_where(fid, operator, value, expected):
18+
assert Where(fid, operator, value).build() == expected
19+
20+
21+
@pytest.mark.parametrize('fid, operator, value, expected', [
22+
(3, 'EX', [1, 2, 3, 4, 5], '{3.EX.1}OR{3.EX.2}OR{3.EX.3}OR{3.EX.4}OR{3.EX.5}'),
23+
(3, 'EX', [1], '{3.EX.1}')
24+
])
25+
def test_where_join(fid, operator, value, expected):
26+
assert Where(fid, operator, value).build(join='OR') == expected
27+
28+
29+
# test invalid parameters, given to where
30+
def test_invalid_params():
31+
with pytest.raises(IncorrectParameters):
32+
Where(3, 'EX', 12345).build(join='OR')
33+

0 commit comments

Comments
 (0)