Added api cleaning tools.

This commit is contained in:
Davis Thames
2018-04-24 21:37:26 -05:00
parent 2fb5a0d977
commit 88094947d4
4 changed files with 118 additions and 0 deletions

View File

@@ -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

View 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
View File

58
tools/api_key_tool.py Normal file
View 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)