From 2447725e98bc790ea2aa55761a53ffbaf46decc9 Mon Sep 17 00:00:00 2001 From: Alexander Mohr Date: Thu, 10 Aug 2017 17:14:31 -0700 Subject: [PATCH] fix list-object-versions with prefix (#1045) fix list-object-versions with prefix --- moto/s3/models.py | 5 +++-- moto/s3/responses.py | 5 +++-- tests/test_s3/test_s3.py | 8 ++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/moto/s3/models.py b/moto/s3/models.py index c1a4fb04d..4ea33adb6 100644 --- a/moto/s3/models.py +++ b/moto/s3/models.py @@ -422,14 +422,15 @@ class S3Backend(BaseBackend): encoding_type=None, key_marker=None, max_keys=None, - version_id_marker=None): + version_id_marker=None, + prefix=''): bucket = self.get_bucket(bucket_name) if any((delimiter, encoding_type, key_marker, version_id_marker)): raise NotImplementedError( "Called get_bucket_versions with some of delimiter, encoding_type, key_marker, version_id_marker") - return itertools.chain(*(l for _, l in bucket.keys.iterlists())) + return itertools.chain(*(l for key, l in bucket.keys.iterlists() if key.startswith(prefix))) def get_bucket_policy(self, bucket_name): return self.get_bucket(bucket_name).policy diff --git a/moto/s3/responses.py b/moto/s3/responses.py index ec1361cb8..dea80518d 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -215,7 +215,7 @@ class ResponseObject(_TemplateEnvironmentMixin): encoding_type = querystring.get('encoding-type', [None])[0] key_marker = querystring.get('key-marker', [None])[0] max_keys = querystring.get('max-keys', [None])[0] - prefix = querystring.get('prefix', [None])[0] + prefix = querystring.get('prefix', [''])[0] version_id_marker = querystring.get('version-id-marker', [None])[0] bucket = self.backend.get_bucket(bucket_name) @@ -225,7 +225,8 @@ class ResponseObject(_TemplateEnvironmentMixin): encoding_type=encoding_type, key_marker=key_marker, max_keys=max_keys, - version_id_marker=version_id_marker + version_id_marker=version_id_marker, + prefix=prefix ) latest_versions = self.backend.get_bucket_latest_versions( bucket_name=bucket_name diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 619a60302..3832026eb 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -770,6 +770,14 @@ def test_list_versions(): versions[1].version_id.should.equal('1') versions[1].get_contents_as_string().should.equal(b"Version 2") + key = Key(bucket, 'the2-key') + key.set_contents_from_string("Version 1") + + keys = list(bucket.list()) + keys.should.have.length_of(2) + versions = list(bucket.list_versions(prefix='the2-')) + versions.should.have.length_of(1) + @mock_s3_deprecated def test_acl_setting():