from __future__ import print_function # Python 2/3 compatibility
import boto3
import json
import decimal
from boto3.dynamodb.conditions import Key, Attr

# Helper class to convert a DynamoDB item to JSON
class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            if o % 1 > 0:
                return float(o)
            else:
                return int(o)
        return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', endpoint_url = 'http://localhost:4000')

table = dynamodb.Table('Movies')

fe = Key('year').between(1950, 1959)
pe = "#yr, title, info.rating"
# Expression Attribute Names for Projection Expression only
ean = { "#yr": "year" }
esk = None

response = table.scan(
    FilterExpression = fe,
    ProjectionExpression = pe,
    ExpressionAttributeNames = ean
)

for i in response['Items']:
    print(json.dumps(i, cls = DecimalEncoder))

while 'LastEvaluatedKey' in response:
    response = table.scan(
        ProjectionExpression = pe,
        FilterExpression = fe,
        ExpressionAttributeNames = ean,
        ExclusiveStartKey = response['LastEvaluatedKey']
    )

    for i in response['Items']:
        print(json.dumps(i, cls = DecimalEncoder))