Skip to content

Commit 0a14ad7

Browse files
committed
reduced scope of option builder added tests
1 parent fc07672 commit 0a14ad7

File tree

4 files changed

+120
-50
lines changed

4 files changed

+120
-50
lines changed

examples/launchpad/README.md

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,27 @@ get_aggs, and snapshots
1414
...[DESCRIPTION PENDING]
1515

1616
## Example
17+
1718
```python
1819

19-
# import RESTClient
20-
from polygon import RESTClient
21-
from polygon.rest.models.request import RequestOptionBuilder
20+
# import RESTClient
21+
from polygon import RESTClient
22+
from polygon.rest.models.request import RequestOptionBuilder
2223

23-
# create client
24-
c = RESTClient(api_key="API_KEY")
24+
# create client
25+
c = RESTClient(api_key="API_KEY")
2526

26-
# create request options
27-
options = RequestOptionBuilder().required_edge_headers(
28-
edge_id="YOUR_EDGE_ID", # required
29-
edge_ip_address="IP_ADDRESS" # required
30-
).edge_user_agent_header(
31-
user_agent="USER_AGENT_ID" # optional
32-
)
27+
# create request options
28+
options = RequestOptionBuilder().required_edge_headers(
29+
edge_id="YOUR_EDGE_ID", # required
30+
edge_ip_address="IP_ADDRESS" # required
31+
).optional_edge_headers(
32+
user_agent="USER_AGENT_ID" # optional
33+
)
3334

34-
# get response
35-
res = c.get_ticker_events("META", options=options)
35+
# get response
36+
res = c.get_ticker_events("META", options=options)
3637

37-
# do something with response
38+
# do something with response
3839

3940
```

examples/launchpad/launchpad.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@
22
from polygon.rest.models.request import RequestOptionBuilder
33

44

5-
def getAggsLaunchpad():
5+
def get_aggs_launchpad():
66
client = RESTClient()
77

8+
"""
9+
options can be added to the RequestOptionBuilder both directly in
10+
initialization
11+
Example:
12+
`options = RequestOptionBuilder(edge_id="", edge_ip_address="")
13+
14+
or you can use the builder patten
15+
Example:
16+
options = RequestOptionBuilder()
17+
.required_edge_headers(edge_id="EDGE_ID", edge_ip_address="EDGE_ID_ADDRESS")
18+
.optional_edge_headers(user_agent="EDGE_USER_AGENT")
19+
"""
820
options = (
921
RequestOptionBuilder()
1022
.required_edge_headers(edge_id="EDGE_ID", edge_ip_address="EDGE_ID_ADDRESS")
11-
.edge_user_agent_header(user_agent="EDGE_USER_AGENT")
23+
.optional_edge_headers(user_agent="EDGE_USER_AGENT")
1224
)
1325

1426
trades = []
@@ -18,7 +30,7 @@ def getAggsLaunchpad():
1830

1931

2032
def main():
21-
getAggsLaunchpad()
33+
get_aggs_launchpad()
2234

2335

2436
if __name__ == "__main__":

polygon/rest/models/request.py

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,42 @@
1010
class RequestOptionBuilder:
1111
def __init__(
1212
self,
13-
options: Optional[Dict[str, Dict[str, str]]] = None,
14-
edge_headers: Optional[Dict[str, str]] = None,
13+
edge_id: Optional[str] = None,
14+
edge_ip_address: Optional[str] = None,
15+
edge_user: Optional[str] = None,
1516
):
1617
"""
17-
RequestOptionBuilder is a utility class used to format and produce options for Polygon Requests\
18-
:param options: preset options object to be the base of the options dictionary.
19-
:param options: preset options for launchpad edge headers
18+
RequestOptionBuilder is a utility class to build polygon api options used in requests.
19+
:param edge_id: is a required Launchpad header. It identifies the Edge User requesting data
20+
:param edge_ip_address: is a required Launchpad header. It denotes the originating IP Address of the Edge User
21+
:param edge_user: is an optional Launchpad header. It denotes the originating UserAgent of the Edge User requesting data.
2022
"""
21-
self.options = {} if options is None else options
22-
self.edge_headers = {} if edge_headers is None else edge_headers
23+
self.edge_headers: Dict[str, str] = {}
24+
self.__handle_edge_header_options(
25+
edge_id=edge_id, edge_ip_address=edge_ip_address, edge_user=edge_user
26+
)
27+
28+
def __handle_edge_header_options(
29+
self,
30+
edge_id: Optional[str],
31+
edge_ip_address: Optional[str] = None,
32+
edge_user: Optional[str] = None,
33+
):
34+
edge_headers = {}
35+
if edge_id is not None:
36+
edge_headers[X_POLYGON_EDGE_ID] = edge_id
37+
if edge_ip_address is not None:
38+
edge_headers[X_POLYGON_EDGE_IP_ADDRESS] = edge_ip_address
39+
if edge_user is not None:
40+
edge_headers[X_POLYGON_EDGE_USER_AGENT] = edge_user
41+
self.__set_edge_headers(edge_headers)
2342

2443
def __set_edge_headers(self, headers: Dict[str, str]):
2544
self.edge_headers = headers
2645

27-
def __add_to_options(self, key: str, **options):
28-
"""
29-
__add_to_options is a utility method used to add dicts and values
30-
to the options' dictionary.
31-
:param key: name of the dict a user is adding values to
32-
:param options: values to be added to specified dict
33-
:return: RequestOptionBuilder
34-
"""
35-
if key not in self.options:
36-
self.options[key] = {}
37-
38-
for k, v in options.items():
39-
self.options[key][k] = v
40-
41-
# python 3.8 does not support match case...
42-
if key == HEADER:
43-
self.__set_edge_headers(options[key])
46+
def __add_to_edge_headers(self, **headers):
47+
for k, v in headers.items():
48+
self.edge_headers[k] = v
4449

4550
def required_edge_headers(
4651
self,
@@ -54,14 +59,15 @@ def required_edge_headers(
5459
requesting data.
5560
:return: RequestOptionBuilder
5661
"""
57-
self.__add_to_options(
58-
key=HEADER,
59-
X_POLYGON_EDGE_ID=edge_id,
60-
X_POLYGON_EDGE_IP_ADDRESS=edge_ip_address,
62+
self.__add_to_edge_headers(
63+
**{
64+
X_POLYGON_EDGE_ID: edge_id,
65+
X_POLYGON_EDGE_IP_ADDRESS: edge_ip_address,
66+
} # object destructure is needed for correct key formatting.
6167
)
6268
return self
6369

64-
def edge_user_agent_header(
70+
def optional_edge_headers(
6571
self,
6672
user_agent: str,
6773
):
@@ -70,8 +76,9 @@ def edge_user_agent_header(
7076
:param user_agent: is an optional Launchpad header. It denotes the originating UserAgent of the Edge User requesting data.
7177
:return: RequestOptionBuilder
7278
"""
73-
self.__add_to_options(
74-
key=HEADER,
75-
X_POLYGON_EDGE_USER_AGENT=user_agent,
79+
self.__add_to_edge_headers(
80+
**{
81+
X_POLYGON_EDGE_USER_AGENT: user_agent,
82+
}
7683
)
7784
return self

test_rest/models/test_requests.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import unittest
2+
3+
from polygon.rest.models.request import (
4+
RequestOptionBuilder,
5+
X_POLYGON_EDGE_ID,
6+
X_POLYGON_EDGE_USER_AGENT,
7+
X_POLYGON_EDGE_IP_ADDRESS,
8+
)
9+
10+
11+
class RequestTest(unittest.TestCase):
12+
def test_empty_request_options(self):
13+
options = RequestOptionBuilder()
14+
15+
expected_edge_headers = {}
16+
assert expected_edge_headers == options.edge_headers
17+
18+
def test_request_options_with_initialized_values(self):
19+
options = RequestOptionBuilder(
20+
edge_id="test", edge_ip_address="test", edge_user="test"
21+
)
22+
23+
expected_object = {
24+
X_POLYGON_EDGE_ID: "test",
25+
X_POLYGON_EDGE_IP_ADDRESS: "test",
26+
X_POLYGON_EDGE_USER_AGENT: "test",
27+
}
28+
29+
assert expected_object == options.edge_headers
30+
31+
def test_request_options_builder(self):
32+
options = RequestOptionBuilder().required_edge_headers(
33+
edge_id="test", edge_ip_address="test"
34+
)
35+
36+
required_options = {
37+
X_POLYGON_EDGE_ID: "test",
38+
X_POLYGON_EDGE_IP_ADDRESS: "test",
39+
}
40+
print(options.edge_headers, required_options)
41+
self.assertDictEqual(required_options, options.edge_headers)
42+
43+
all_options = {
44+
X_POLYGON_EDGE_ID: "test",
45+
X_POLYGON_EDGE_IP_ADDRESS: "test",
46+
X_POLYGON_EDGE_USER_AGENT: "test",
47+
}
48+
49+
options = options.optional_edge_headers("test")
50+
self.assertDictEqual(all_options, options.edge_headers)

0 commit comments

Comments
 (0)