From c196e15cf7562695f871c5b2f65837aa5e9d9dd3 Mon Sep 17 00:00:00 2001 From: zmsmith Date: Sun, 10 Mar 2013 21:16:44 -0400 Subject: [PATCH] Table listing now supports limits and continuations --- moto/dynamodb/models.py | 4 +++- moto/dynamodb/responses.py | 17 +++++++++++++++-- tests/test_dynamodb/test_dynamodb.py | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/moto/dynamodb/models.py b/moto/dynamodb/models.py index 1c0f1521..3eab73db 100644 --- a/moto/dynamodb/models.py +++ b/moto/dynamodb/models.py @@ -1,5 +1,7 @@ import datetime +from collections import OrderedDict + from moto.core import BaseBackend from .utils import unix_time @@ -48,7 +50,7 @@ class Table(object): class DynamoDBBackend(BaseBackend): def __init__(self): - self.tables = {} + self.tables = OrderedDict() def create_table(self, name, **params): self.tables[name] = Table(name, **params) diff --git a/moto/dynamodb/responses.py b/moto/dynamodb/responses.py index add8fd5d..bac64729 100644 --- a/moto/dynamodb/responses.py +++ b/moto/dynamodb/responses.py @@ -32,12 +32,24 @@ class DynamoHandler(object): return "", dict(status=404) def ListTables(self, uri, body, headers): - tables = dynamodb_backend.tables.keys() + limit = body.get('Limit') + if body.get("ExclusiveStartTableName"): + last = body.get("ExclusiveStartTableName") + start = dynamodb_backend.tables.keys().index(last) + 1 + else: + start = 0 + all_tables = dynamodb_backend.tables.keys() + if limit: + tables = all_tables[start:start + limit] + else: + tables = all_tables[start:] response = {"TableNames": tables} + if limit and len(all_tables) > start + limit: + response["LastEvaluatedTableName"] = tables[-1] return json.dumps(response) def DescribeTable(self, uri, body, headers): - name = json.loads(body)['TableName'] + name = body['TableName'] try: table = dynamodb_backend.tables[name] except KeyError: @@ -47,4 +59,5 @@ class DynamoHandler(object): def handler(uri, body, headers): + body = json.loads(body or '{}') return DynamoHandler(uri, body, headers_to_dict(headers)).dispatch() diff --git a/tests/test_dynamodb/test_dynamodb.py b/tests/test_dynamodb/test_dynamodb.py index a5df4a0a..366994fc 100644 --- a/tests/test_dynamodb/test_dynamodb.py +++ b/tests/test_dynamodb/test_dynamodb.py @@ -16,6 +16,20 @@ def test_list_tables(): assert conn.list_tables() == ['TestTable'] +@mock_dynamodb +def test_list_tables_layer_1(): + dynamodb_backend.create_table("test_1") + dynamodb_backend.create_table("test_2") + conn = boto.connect_dynamodb('the_key', 'the_secret') + res = conn.layer1.list_tables(limit=1) + expected = {"TableNames": ["test_1"], "LastEvaluatedTableName": "test_1"} + res.should.equal(expected) + + res = conn.layer1.list_tables(limit=1, start_table="test_1") + expected = {"TableNames": ["test_2"]} + res.should.equal(expected) + + @mock_dynamodb def test_describe_missing_table(): conn = boto.connect_dynamodb('the_key', 'the_secret')