mirror of
https://github.com/hydrosquall/tiingo-python.git
synced 2025-12-17 20:04:19 +01:00
Added api cleaning tools.
This commit is contained in:
@@ -117,3 +117,12 @@ To regenerate fixture remove it from tests/fixtures and run tests again::
|
|||||||
|
|
||||||
$ rm tests/fixtures/NAME.yaml
|
$ rm tests/fixtures/NAME.yaml
|
||||||
$ py.test
|
$ py.test
|
||||||
|
|
||||||
|
In order for py.test to have run, you will have had to create an environment variable containing a valid tiingo API key so that the test runner can make a valid api call. One way to do that is to::
|
||||||
|
|
||||||
|
$ export TIINGO_API_KEY='...insert api key here...'
|
||||||
|
|
||||||
|
However, now this api key will become embedded in the test fixture file that is created per the prior procedure. In order to remove this api key from the new test fixtures, run the following from the top level directory::
|
||||||
|
|
||||||
|
$ python tools/api_key_tool.py
|
||||||
|
|
||||||
|
|||||||
51
tests/test_api_key_tools.py
Normal file
51
tests/test_api_key_tools.py
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
#
|
||||||
|
# Test setup based on https://gist.github.com/odyniec/d4ea0959d4e0ba17a980
|
||||||
|
#
|
||||||
|
|
||||||
|
import shutil, tempfile
|
||||||
|
from os import path
|
||||||
|
from unittest import TestCase
|
||||||
|
from tools.api_key_tool import api_key_remover, api_key_detector
|
||||||
|
|
||||||
|
|
||||||
|
class TestAPIKeyTools(TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.test_dir = tempfile.mkdtemp()
|
||||||
|
f = open(path.join(self.test_dir, 'test.yaml'), 'w')
|
||||||
|
txt = '''interactions:
|
||||||
|
- request:
|
||||||
|
body: null
|
||||||
|
headers:
|
||||||
|
Accept: ['*/*']
|
||||||
|
Accept-Encoding: ['gzip, deflate']
|
||||||
|
Authorization: [Token a00000000000000000000a00000000000000000a]
|
||||||
|
Connection: [keep-alive]
|
||||||
|
Content-Type: [application/json]
|
||||||
|
User-Agent: [tiingo-python-client 0.5.0]
|
||||||
|
method: GET
|
||||||
|
uri: https://api.tiingo.com/tiingo/daily/GOOGL/prices?format=json&resampleFreq=daily
|
||||||
|
response:
|
||||||
|
body: {string: '[{"adjClose":1037.29,"adjHigh":1044.65,"adjLow":1026.05,"adjOpen":1031.47,"adjVolume":1644794,"close":1037.29,"date":"2018-04-12T00:00:00+00:00","divCash":0.0,"high":1044.65,"low":1026.05,"open":1031.47,"splitFactor":1.0,"volume":1644794}]'}
|
||||||
|
headers:
|
||||||
|
Allow: ['GET, HEAD, OPTIONS']
|
||||||
|
Content-Length: ['239']
|
||||||
|
Content-Type: [application/json]
|
||||||
|
Date: ['Fri, 13 Apr 2018 02:42:05 GMT']
|
||||||
|
Server: [nginx/1.10.1]
|
||||||
|
Vary: ['Accept, Cookie']
|
||||||
|
X-Frame-Options: [SAMEORIGIN]
|
||||||
|
status: {code: 200, message: OK}
|
||||||
|
version: 1
|
||||||
|
'''
|
||||||
|
f.write(txt)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
shutil.rmtree(self.test_dir)
|
||||||
|
|
||||||
|
def test_key_detector(self):
|
||||||
|
assert api_key_detector(path.join(self.test_dir, 'test.yaml')) is True
|
||||||
|
|
||||||
|
def test_key_remover(self):
|
||||||
|
api_key_remover(path.join(self.test_dir, 'test.yaml'))
|
||||||
|
assert api_key_detector(path.join(self.test_dir, 'test.yaml')) is False
|
||||||
0
tools/__init__.py
Normal file
0
tools/__init__.py
Normal file
58
tools/api_key_tool.py
Normal file
58
tools/api_key_tool.py
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
from __future__ import print_function
|
||||||
|
import glob
|
||||||
|
import re
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
tokenString = '[Token '
|
||||||
|
fixturesDirectory = 'tests/fixtures/'
|
||||||
|
zeroapiregex = r'(\[Token )0{40}(\])'
|
||||||
|
anyapiregex = r'(\[Token ).{40}(\])'
|
||||||
|
zeroapistring = '[Token '+40*'0'+']'
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("path", help="path to test fixtures",
|
||||||
|
nargs='?', default=fixturesDirectory)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
def api_key_detector(file):
|
||||||
|
'''
|
||||||
|
Detect whether the file contains an api key in the Token object that is not 40*'0'.
|
||||||
|
See issue #86.
|
||||||
|
:param file: path-to-file to check
|
||||||
|
:return: boolean
|
||||||
|
'''
|
||||||
|
f = open(file, 'r')
|
||||||
|
text = f.read()
|
||||||
|
if re.search(anyapiregex, text) is not None and \
|
||||||
|
re.search(zeroapiregex, text) is None:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def api_key_remover(file):
|
||||||
|
'''
|
||||||
|
Change the api key in the Token object to 40*'0'. See issue #86.
|
||||||
|
:param file: path-to-file to change
|
||||||
|
'''
|
||||||
|
f = open(file, 'r')
|
||||||
|
text = f.read()
|
||||||
|
f.close()
|
||||||
|
text = re.sub(anyapiregex, zeroapistring, text)
|
||||||
|
f = open(file, 'w')
|
||||||
|
f.write(text)
|
||||||
|
f.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def main(path):
|
||||||
|
if path[-1] != '/':
|
||||||
|
raise ValueError('Final character in path must be /.')
|
||||||
|
nFilesChanged = 0
|
||||||
|
for file in glob.glob(path+'*.yaml'):
|
||||||
|
if api_key_detector(file):
|
||||||
|
api_key_remover(file)
|
||||||
|
nFilesChanged += 1
|
||||||
|
print("Changed {} files.".format(nFilesChanged))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main(args.path)
|
||||||
Reference in New Issue
Block a user