Skip to content

Commit ab7ccbb

Browse files
authored
Merge pull request #23 from alpacahq/staging
Staging Support
2 parents 4f7b330 + 5208890 commit ab7ccbb

File tree

10 files changed

+26
-18
lines changed

10 files changed

+26
-18
lines changed

.circleci/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ jobs:
2323
- run:
2424
name: run tests
2525
command: |
26+
pip install flake8 && flake8 alpaca_trade_api tests
2627
python setup.py test
2728
2829
- save_cache:
@@ -58,6 +59,7 @@ jobs:
5859
name: run tests
5960
command: |
6061
python setup.py install
62+
pip install flake8 && flake8 alpaca_trade_api tests
6163
python setup.py test
6264
6365
- save_cache:

alpaca_trade_api/entity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def bars(self):
7474
t = []
7575
o = []
7676
h = []
77-
l = []
77+
l = [] # noqa: E741
7878
c = []
7979
v = []
8080
bars = []
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from .rest import REST # noqa
2-
from .stream import Stream # noqa
2+
from .stream import Stream # noqa

alpaca_trade_api/polygon/entity.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
NY = 'America/New_York'
55

6+
67
class Entity(object):
78
def __init__(self, raw):
89
self._raw = raw
@@ -22,7 +23,6 @@ def __repr__(self):
2223

2324
class Agg(Entity):
2425
def __getattr__(self, key):
25-
lkey = key.lower()
2626
if key in self._raw:
2727
val = self._raw[key]
2828
if key == 'day':
@@ -77,6 +77,7 @@ def df(self):
7777

7878
class _TradeOrQuote(object):
7979
'''Mixin for Trade and Quote'''
80+
8081
def __getattr__(self, key):
8182
if key in self._raw:
8283
val = self._raw[key]
@@ -116,13 +117,12 @@ def df(self):
116117
df.index = pd.to_datetime(
117118
df.index.astype('int64') * 1000000,
118119
utc=True,
119-
).tz_convert(NY)
120+
).tz_convert(NY)
120121

121122
self._df = df
122123
return self._df
123124

124125

125-
126126
class Trade(_TradeOrQuote, Entity):
127127
pass
128128

@@ -148,5 +148,6 @@ class Exchange(Entity):
148148
class SymbolTypeMap(Entity):
149149
pass
150150

151+
151152
class ConditionMap(Entity):
152-
pass
153+
pass

alpaca_trade_api/polygon/rest.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@
99

1010
class REST(object):
1111

12-
def __init__(self, api_key):
12+
def __init__(self, api_key, staging=False):
1313
self._api_key = api_key
14+
self._staging = staging
1415
self._session = requests.Session()
1516

1617
def _request(self, method, path, params=None):
1718
url = 'https://api.polygon.io/v1' + path
1819
params = params or {}
1920
params['apiKey'] = self._api_key
21+
if self._staging:
22+
params['staging'] = 'true'
2023
resp = self._session.request(method, url, params=params)
2124
resp.raise_for_status()
2225
return resp.json()

alpaca_trade_api/polygon/stream.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import asyncio
22
import re
33
from nats.aio.client import Client as NATS
4-
from nats.aio.errors import ErrConnectionClosed, ErrTimeout, ErrNoServers
54

65
from .entity import (
76
Quote, Trade, Agg, Entity,
87
)
98

10-
119
import json
12-
import time
1310

1411

1512
class Stream(object):
@@ -60,7 +57,7 @@ def _cast(self, subject, data):
6057
"s": "size",
6158
"t": "timestamp"
6259
}
63-
ent = Trade({map[k]: v for k, v in data.items()})
60+
ent = Trade({map[k]: v for k, v in data.items() if k in map})
6461
elif subject.startswith('Q.'):
6562
map = {
6663
"sym": "symbol",
@@ -73,7 +70,7 @@ def _cast(self, subject, data):
7370
"c": "condition",
7471
"t": "timestamp"
7572
}
76-
ent = Quote({map[k]: v for k, v in data.items()})
73+
ent = Quote({map[k]: v for k, v in data.items() if k in map})
7774
elif subject.startswith('AM.'):
7875
map = {
7976
"sym": "symbol",
@@ -90,7 +87,7 @@ def _cast(self, subject, data):
9087
"e": "end",
9188
}
9289
print(data)
93-
ent = Agg({map[k]: v for k, v in data.items()})
90+
ent = Agg({map[k]: v for k, v in data.items() if k in map})
9491
else:
9592
ent = Entity(data)
9693
return ent

alpaca_trade_api/rest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ def __init__(self, key_id=None, secret_key=None, base_url=None):
3535
self._session = requests.Session()
3636
self._retry = int(os.environ.get('APCA_MAX_RETRY', 3))
3737
self._retry_wait = int(os.environ.get('APCA_RETRY_WAIT', 3))
38-
self.polygon = polygon.REST(self._key_id)
38+
self.polygon = polygon.REST(
39+
self._key_id, 'staging' in self._base_url)
3940

4041
def _request(self, method, path, data=None, prefix='/v1'):
4142
url = self._base_url + prefix + path

alpaca_trade_api/stream2.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ async def _consume_msg(self):
5151
async def _ensure_nats(self):
5252
if self.polygon is not None:
5353
return
54-
self.polygon = polygon.Stream(self._key_id)
54+
key_id = self._key_id
55+
if 'staging' in self._base_url:
56+
key_id += '-staging'
57+
self.polygon = polygon.Stream(key_id)
5558
self.polygon.register(r'.*', self._dispatch_nats)
5659
await self.polygon.connect()
5760

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
'pytest-cov',
3939
'requests-mock',
4040
'coverage>=4.4.1',
41-
'mock>=1.0.1'
41+
'mock>=1.0.1',
42+
'flake8',
4243
],
4344
setup_requires=['pytest-runner', 'flake8'],
4445
)

tests/test_polygon/test_stream.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def NATS():
2525
def _run(coro):
2626
return asyncio.get_event_loop().run_until_complete(coro)
2727

28+
2829
def test_stream(NATS):
2930
NATS().connect = AsyncMock()
3031
s = stream.Stream('api-key')
@@ -43,10 +44,9 @@ async def on_subject(stream, subject, data):
4344
with pytest.raises(ValueError):
4445
s.register('illegal', lambda x: x)
4546

46-
4747
NATS().subscribe = AsyncMock(return_value=1)
4848
NATS().unsubscribe = AsyncMock()
4949
_run(s.subscribe(['topics']))
5050
assert s._ssids[0] == 1
5151
_run(s.subscribe([]))
52-
assert len(s._ssids) == 0
52+
assert len(s._ssids) == 0

0 commit comments

Comments
 (0)