Working on persistence api

This commit is contained in:
Gert Wohlgemuth 2018-05-19 17:07:32 -07:00
parent 2da14fc554
commit 92d3afd6e8
4 changed files with 79 additions and 12 deletions

View File

@ -2,6 +2,7 @@ import boto3
import simplejson as json import simplejson as json
import decimal import decimal
class DecimalEncoder(json.JSONEncoder): class DecimalEncoder(json.JSONEncoder):
def default(self, o): def default(self, o):
if isinstance(o, decimal.Decimal): if isinstance(o, decimal.Decimal):
@ -30,16 +31,15 @@ class Persistence:
table = self.db.Table(self.table) table = self.db.Table(self.table)
response = table.scan() response = table.scan()
result = [] result = response['Items']
while 'LastEvaluatedKey' in response: while 'LastEvaluatedKey' in response:
for i in response['Items']:
result.append(i)
response = table.scan( response = table.scan(
ExclusiveStartKey=response['LastEvaluatedKey'] ExclusiveStartKey=response['LastEvaluatedKey']
) )
for i in response['Items']:
result.append(i)
return result return result
def load(self, sample): def load(self, sample):

View File

@ -19,11 +19,15 @@ def names(event, context):
""" """
table = Persistence(os.environ['strategyTable']) table = Persistence(os.environ['strategyTable'])
# map results and hide informations
data = list(map(lambda x: {'name': x['name'], 'public': x['public'], 'user': x['user']}, table.list()))
return { return {
"statusCode": 200, "statusCode": 200,
"body": json.dumps(table.list()) "body": json.dumps(data)
} }
def performance(event, context): def performance(event, context):
""" """
returns the performance of the specified strategy returns the performance of the specified strategy
@ -71,9 +75,8 @@ def submit(event, context):
# try to load the strategy # try to load the strategy
StrategyResolver().compile(data['name'], strategy) StrategyResolver().compile(data['name'], strategy)
# generate id
data['id'] = str(uuid.uuid4())
data['time'] = int(time.time() * 1000) data['time'] = int(time.time() * 1000)
data['type'] = "strategy"
# save to DB # save to DB
table = Persistence(os.environ['strategyTable']) table = Persistence(os.environ['strategyTable'])

View File

@ -1,6 +1,6 @@
import simplejson as json import simplejson as json
from base64 import urlsafe_b64encode from base64 import urlsafe_b64encode
from freqtrade.aws.strategy import submit import freqtrade.aws.strategy as aws
def test_strategy(lambda_context): def test_strategy(lambda_context):
@ -56,8 +56,44 @@ class TestStrategy(IStrategy):
"public": False "public": False
} }
print(json.dumps(request)) # db should be empty
assert (len(json.loads(aws.names({}, {})['body'])) == 0)
submit({ # now we add an entry
aws.submit({
"body": json.dumps(request) "body": json.dumps(request)
}, {}) }, {})
# now we should have items
assert (len(json.loads(aws.names({}, {})['body'])) == 1)
# able to add a second strategy with the sample name, but different user
request = {
"user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH",
"description": "simple test strategy",
"name": "TestStrategy",
"content": urlsafe_b64encode(content.encode('utf-8')),
"public": False
}
aws.submit({
"body": json.dumps(request)
}, {})
assert (len(json.loads(aws.names({}, {})['body'])) == 2)
# able to add a duplicated strategy, which should overwrite the existing strategy
request = {
"user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH",
"description": "simple test strategy",
"name": "TestStrategy",
"content": urlsafe_b64encode(content.encode('utf-8')),
"public": False
}
aws.submit({
"body": json.dumps(request)
}, {})
assert (len(json.loads(aws.names({}, {})['body'])) == 2)

View File

@ -497,6 +497,7 @@ def result():
with open('freqtrade/tests/testdata/UNITTEST_BTC-1m.json') as data_file: with open('freqtrade/tests/testdata/UNITTEST_BTC-1m.json') as data_file:
return Analyze.parse_ticker_dataframe(json.load(data_file)) return Analyze.parse_ticker_dataframe(json.load(data_file))
# FIX: # FIX:
# Create an fixture/function # Create an fixture/function
# that inserts a trade of some type and open-status # that inserts a trade of some type and open-status
@ -593,7 +594,6 @@ def buy_order_fee():
@pytest.fixture @pytest.fixture
def lambda_context(): def lambda_context():
# mock the different AWS features we need # mock the different AWS features we need
sns = moto.mock_sns() sns = moto.mock_sns()
sns.start() sns.start()
@ -608,6 +608,34 @@ def lambda_context():
client = session.client('sns') client = session.client('sns')
dynamodb = boto3.resource('dynamodb') dynamodb = boto3.resource('dynamodb')
os.environ["strategyTable"] = "StrategyTable"
dynamodb.create_table(
TableName=os.environ["strategyTable"],
KeySchema=[
{
'AttributeName': 'user',
'KeyType': 'HASH'
},
{
'AttributeName': 'name',
'KeyType': 'RANGE'
}
],
AttributeDefinitions=[
{
'AttributeName': 'user',
'AttributeType': 'S'
}, {
'AttributeName': 'name',
'AttributeType': 'S'
}
],
ProvisionedThroughput={
'ReadCapacityUnits': 1,
'WriteCapacityUnits': 1
}
)
# here we will define required tables later # here we will define required tables later
yield yield