Run black on moto & test directories.
This commit is contained in:
parent
c820395dbf
commit
96e5b1993d
507 changed files with 52541 additions and 47814 deletions
|
|
@ -2,5 +2,5 @@ from __future__ import unicode_literals
|
|||
from .models import dynamodbstreams_backends
|
||||
from ..core.models import base_decorator
|
||||
|
||||
dynamodbstreams_backend = dynamodbstreams_backends['us-east-1']
|
||||
dynamodbstreams_backend = dynamodbstreams_backends["us-east-1"]
|
||||
mock_dynamodbstreams = base_decorator(dynamodbstreams_backends)
|
||||
|
|
|
|||
|
|
@ -10,51 +10,59 @@ from moto.dynamodb2.models import dynamodb_backends
|
|||
|
||||
|
||||
class ShardIterator(BaseModel):
|
||||
def __init__(self, streams_backend, stream_shard, shard_iterator_type, sequence_number=None):
|
||||
self.id = base64.b64encode(os.urandom(472)).decode('utf-8')
|
||||
def __init__(
|
||||
self, streams_backend, stream_shard, shard_iterator_type, sequence_number=None
|
||||
):
|
||||
self.id = base64.b64encode(os.urandom(472)).decode("utf-8")
|
||||
self.streams_backend = streams_backend
|
||||
self.stream_shard = stream_shard
|
||||
self.shard_iterator_type = shard_iterator_type
|
||||
if shard_iterator_type == 'TRIM_HORIZON':
|
||||
if shard_iterator_type == "TRIM_HORIZON":
|
||||
self.sequence_number = stream_shard.starting_sequence_number
|
||||
elif shard_iterator_type == 'LATEST':
|
||||
self.sequence_number = stream_shard.starting_sequence_number + len(stream_shard.items)
|
||||
elif shard_iterator_type == 'AT_SEQUENCE_NUMBER':
|
||||
elif shard_iterator_type == "LATEST":
|
||||
self.sequence_number = stream_shard.starting_sequence_number + len(
|
||||
stream_shard.items
|
||||
)
|
||||
elif shard_iterator_type == "AT_SEQUENCE_NUMBER":
|
||||
self.sequence_number = sequence_number
|
||||
elif shard_iterator_type == 'AFTER_SEQUENCE_NUMBER':
|
||||
elif shard_iterator_type == "AFTER_SEQUENCE_NUMBER":
|
||||
self.sequence_number = sequence_number + 1
|
||||
|
||||
@property
|
||||
def arn(self):
|
||||
return '{}/stream/{}|1|{}'.format(
|
||||
return "{}/stream/{}|1|{}".format(
|
||||
self.stream_shard.table.table_arn,
|
||||
self.stream_shard.table.latest_stream_label,
|
||||
self.id)
|
||||
self.id,
|
||||
)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
'ShardIterator': self.arn
|
||||
}
|
||||
return {"ShardIterator": self.arn}
|
||||
|
||||
def get(self, limit=1000):
|
||||
items = self.stream_shard.get(self.sequence_number, limit)
|
||||
try:
|
||||
last_sequence_number = max(int(i['dynamodb']['SequenceNumber']) for i in items)
|
||||
new_shard_iterator = ShardIterator(self.streams_backend,
|
||||
self.stream_shard,
|
||||
'AFTER_SEQUENCE_NUMBER',
|
||||
last_sequence_number)
|
||||
last_sequence_number = max(
|
||||
int(i["dynamodb"]["SequenceNumber"]) for i in items
|
||||
)
|
||||
new_shard_iterator = ShardIterator(
|
||||
self.streams_backend,
|
||||
self.stream_shard,
|
||||
"AFTER_SEQUENCE_NUMBER",
|
||||
last_sequence_number,
|
||||
)
|
||||
except ValueError:
|
||||
new_shard_iterator = ShardIterator(self.streams_backend,
|
||||
self.stream_shard,
|
||||
'AT_SEQUENCE_NUMBER',
|
||||
self.sequence_number)
|
||||
new_shard_iterator = ShardIterator(
|
||||
self.streams_backend,
|
||||
self.stream_shard,
|
||||
"AT_SEQUENCE_NUMBER",
|
||||
self.sequence_number,
|
||||
)
|
||||
|
||||
self.streams_backend.shard_iterators[new_shard_iterator.arn] = new_shard_iterator
|
||||
return {
|
||||
'NextShardIterator': new_shard_iterator.arn,
|
||||
'Records': items
|
||||
}
|
||||
self.streams_backend.shard_iterators[
|
||||
new_shard_iterator.arn
|
||||
] = new_shard_iterator
|
||||
return {"NextShardIterator": new_shard_iterator.arn, "Records": items}
|
||||
|
||||
|
||||
class DynamoDBStreamsBackend(BaseBackend):
|
||||
|
|
@ -72,23 +80,27 @@ class DynamoDBStreamsBackend(BaseBackend):
|
|||
return dynamodb_backends[self.region]
|
||||
|
||||
def _get_table_from_arn(self, arn):
|
||||
table_name = arn.split(':', 6)[5].split('/')[1]
|
||||
table_name = arn.split(":", 6)[5].split("/")[1]
|
||||
return self.dynamodb.get_table(table_name)
|
||||
|
||||
def describe_stream(self, arn):
|
||||
table = self._get_table_from_arn(arn)
|
||||
resp = {'StreamDescription': {
|
||||
'StreamArn': arn,
|
||||
'StreamLabel': table.latest_stream_label,
|
||||
'StreamStatus': ('ENABLED' if table.latest_stream_label
|
||||
else 'DISABLED'),
|
||||
'StreamViewType': table.stream_specification['StreamViewType'],
|
||||
'CreationRequestDateTime': table.stream_shard.created_on.isoformat(),
|
||||
'TableName': table.name,
|
||||
'KeySchema': table.schema,
|
||||
'Shards': ([table.stream_shard.to_json()] if table.stream_shard
|
||||
else [])
|
||||
}}
|
||||
resp = {
|
||||
"StreamDescription": {
|
||||
"StreamArn": arn,
|
||||
"StreamLabel": table.latest_stream_label,
|
||||
"StreamStatus": (
|
||||
"ENABLED" if table.latest_stream_label else "DISABLED"
|
||||
),
|
||||
"StreamViewType": table.stream_specification["StreamViewType"],
|
||||
"CreationRequestDateTime": table.stream_shard.created_on.isoformat(),
|
||||
"TableName": table.name,
|
||||
"KeySchema": table.schema,
|
||||
"Shards": (
|
||||
[table.stream_shard.to_json()] if table.stream_shard else []
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
return json.dumps(resp)
|
||||
|
||||
|
|
@ -98,22 +110,26 @@ class DynamoDBStreamsBackend(BaseBackend):
|
|||
if table_name is not None and table.name != table_name:
|
||||
continue
|
||||
if table.latest_stream_label:
|
||||
d = table.describe(base_key='Table')
|
||||
streams.append({
|
||||
'StreamArn': d['Table']['LatestStreamArn'],
|
||||
'TableName': d['Table']['TableName'],
|
||||
'StreamLabel': d['Table']['LatestStreamLabel']
|
||||
})
|
||||
d = table.describe(base_key="Table")
|
||||
streams.append(
|
||||
{
|
||||
"StreamArn": d["Table"]["LatestStreamArn"],
|
||||
"TableName": d["Table"]["TableName"],
|
||||
"StreamLabel": d["Table"]["LatestStreamLabel"],
|
||||
}
|
||||
)
|
||||
|
||||
return json.dumps({'Streams': streams})
|
||||
return json.dumps({"Streams": streams})
|
||||
|
||||
def get_shard_iterator(self, arn, shard_id, shard_iterator_type, sequence_number=None):
|
||||
def get_shard_iterator(
|
||||
self, arn, shard_id, shard_iterator_type, sequence_number=None
|
||||
):
|
||||
table = self._get_table_from_arn(arn)
|
||||
assert table.stream_shard.id == shard_id
|
||||
|
||||
shard_iterator = ShardIterator(self, table.stream_shard,
|
||||
shard_iterator_type,
|
||||
sequence_number)
|
||||
shard_iterator = ShardIterator(
|
||||
self, table.stream_shard, shard_iterator_type, sequence_number
|
||||
)
|
||||
self.shard_iterators[shard_iterator.arn] = shard_iterator
|
||||
|
||||
return json.dumps(shard_iterator.to_json())
|
||||
|
|
@ -123,7 +139,7 @@ class DynamoDBStreamsBackend(BaseBackend):
|
|||
return json.dumps(shard_iterator.get(limit))
|
||||
|
||||
|
||||
available_regions = boto3.session.Session().get_available_regions(
|
||||
'dynamodbstreams')
|
||||
dynamodbstreams_backends = {region: DynamoDBStreamsBackend(region=region)
|
||||
for region in available_regions}
|
||||
available_regions = boto3.session.Session().get_available_regions("dynamodbstreams")
|
||||
dynamodbstreams_backends = {
|
||||
region: DynamoDBStreamsBackend(region=region) for region in available_regions
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,34 +7,34 @@ from six import string_types
|
|||
|
||||
|
||||
class DynamoDBStreamsHandler(BaseResponse):
|
||||
|
||||
@property
|
||||
def backend(self):
|
||||
return dynamodbstreams_backends[self.region]
|
||||
|
||||
def describe_stream(self):
|
||||
arn = self._get_param('StreamArn')
|
||||
arn = self._get_param("StreamArn")
|
||||
return self.backend.describe_stream(arn)
|
||||
|
||||
def list_streams(self):
|
||||
table_name = self._get_param('TableName')
|
||||
table_name = self._get_param("TableName")
|
||||
return self.backend.list_streams(table_name)
|
||||
|
||||
def get_shard_iterator(self):
|
||||
arn = self._get_param('StreamArn')
|
||||
shard_id = self._get_param('ShardId')
|
||||
shard_iterator_type = self._get_param('ShardIteratorType')
|
||||
sequence_number = self._get_param('SequenceNumber')
|
||||
arn = self._get_param("StreamArn")
|
||||
shard_id = self._get_param("ShardId")
|
||||
shard_iterator_type = self._get_param("ShardIteratorType")
|
||||
sequence_number = self._get_param("SequenceNumber")
|
||||
# according to documentation sequence_number param should be string
|
||||
if isinstance(sequence_number, string_types):
|
||||
sequence_number = int(sequence_number)
|
||||
|
||||
return self.backend.get_shard_iterator(arn, shard_id,
|
||||
shard_iterator_type, sequence_number)
|
||||
return self.backend.get_shard_iterator(
|
||||
arn, shard_id, shard_iterator_type, sequence_number
|
||||
)
|
||||
|
||||
def get_records(self):
|
||||
arn = self._get_param('ShardIterator')
|
||||
limit = self._get_param('Limit')
|
||||
arn = self._get_param("ShardIterator")
|
||||
limit = self._get_param("Limit")
|
||||
if limit is None:
|
||||
limit = 1000
|
||||
return self.backend.get_records(arn, limit)
|
||||
|
|
|
|||
|
|
@ -1,10 +1,6 @@
|
|||
from __future__ import unicode_literals
|
||||
from .responses import DynamoDBStreamsHandler
|
||||
|
||||
url_bases = [
|
||||
"https?://streams.dynamodb.(.+).amazonaws.com"
|
||||
]
|
||||
url_bases = ["https?://streams.dynamodb.(.+).amazonaws.com"]
|
||||
|
||||
url_paths = {
|
||||
"{0}/$": DynamoDBStreamsHandler.dispatch,
|
||||
}
|
||||
url_paths = {"{0}/$": DynamoDBStreamsHandler.dispatch}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue