mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-01 16:52:26 +08:00
ENH: Coerce user input with API method decorator
Previously we have capitalized input strings at different levels in our code: in the user-facing API methods and in the asset finder. This commit moves input string capitalization exclusively to the API method to which the string was supplied. Specifically, the string is capitalized by a preprocess API method decorator. The preprocess decorator passes the input string to the newly defined ensure_upper_case() method, which returns a TypeError if the argument supplied is not a string. ensure_upper_case() is defined in a new file, zipline/utils/input_validation.py. The existing expect_types() method is also moved there. Various tests in tests/test_assets.py are modified to account for the fact that the asset finder method lookup_symol() no longer capitalizes its supplied argument.
This commit is contained in:
@@ -425,6 +425,23 @@ class TestMiscellaneousAPI(TestCase):
|
||||
self.assertIsInstance(algo.sid(3), Equity)
|
||||
self.assertIsInstance(algo.sid(4), Equity)
|
||||
|
||||
# Supplying a non-string argument to symbol()
|
||||
# should result in a TypeError.
|
||||
with self.assertRaises(TypeError):
|
||||
algo.symbol(1)
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.symbol((1,))
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.symbol({1})
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.symbol([1])
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.symbol({'foo': 'bar'})
|
||||
|
||||
def test_future_symbol(self):
|
||||
""" Tests the future_symbol API function.
|
||||
"""
|
||||
@@ -450,6 +467,23 @@ class TestMiscellaneousAPI(TestCase):
|
||||
with self.assertRaises(SymbolNotFound):
|
||||
algo.future_symbol('FOOBAR')
|
||||
|
||||
# Supplying a non-string argument to future_symbol()
|
||||
# should result in a TypeError.
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_symbol(1)
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_symbol((1,))
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_symbol({1})
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_symbol([1])
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_symbol({'foo': 'bar'})
|
||||
|
||||
def test_future_chain(self):
|
||||
""" Tests the future_chain API function.
|
||||
"""
|
||||
@@ -493,6 +527,23 @@ class TestMiscellaneousAPI(TestCase):
|
||||
with self.assertRaises(UnsupportedDatetimeFormat):
|
||||
algo.future_chain('CL', '2015-09-')
|
||||
|
||||
# Supplying a non-string argument to future_chain()
|
||||
# should result in a TypeError.
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_chain(1)
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_chain((1,))
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_chain({1})
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_chain([1])
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
algo.future_chain({'foo': 'bar'})
|
||||
|
||||
def test_set_symbol_lookup_date(self):
|
||||
"""
|
||||
Test the set_symbol_lookup_date API method.
|
||||
|
||||
Reference in New Issue
Block a user