Skip to content

Commit aef005a

Browse files
authored
Merge pull request #81 from Kinto/collection_timestamp
Add `get_records_timestamp()`
2 parents 43af540 + eae13b7 commit aef005a

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed

CHANGELOG.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ This document describes changes between each past release.
77
6.1.0 (unreleased)
88
==================
99

10-
- Nothing changed yet.
10+
**New features**
11+
12+
- Add a ``get_records_timestamp`` method to get the collection ``ETag``. (#81)
1113

1214

1315
6.0.0 (2016-06-10)

README.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,10 @@ A record is a dict with the "permissions" and "data" keys.
157157
collection='todos', bucket='default')
158158
159159
# Retrieve all records.
160-
record = client.get_records(collection='todos', bucket='default')
160+
records = client.get_records(collection='todos', bucket='default')
161+
162+
# Retrieve records timestamp.
163+
records_timestamp = client.get_records_timestamp(collection='todos', bucket='default')
161164
162165
# Retrieve a specific record and update it.
163166
record = client.get_record('89881454-e4e9-4ef0-99a9-404d95900352',

kinto_http/__init__.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ def __init__(self, server_url=None, session=None, auth=None,
6969
self._bucket_name = bucket
7070
self._collection_name = collection
7171
self._server_settings = None
72+
self._records_timestamp = {}
7273

7374
def clone(self, **kwargs):
7475
kwargs.setdefault('session', self.session)
@@ -118,6 +119,11 @@ def _paginated(self, endpoint, records=None, if_none_match=None, **kwargs):
118119

119120
record_resp, headers = self.session.request(
120121
'get', endpoint, headers=headers, params=kwargs)
122+
123+
# Save the current records collection timestamp
124+
etag = headers.get('ETag', '').strip('"')
125+
self._records_timestamp[endpoint] = etag
126+
121127
if record_resp:
122128
records_tuples = [(r['id'], r) for r in record_resp['data']]
123129
records.update(collections.OrderedDict(records_tuples))
@@ -294,6 +300,20 @@ def delete_collections(self, bucket=None, safe=True, if_match=None):
294300

295301
# Records
296302

303+
def get_records_timestamp(self, collection=None, bucket=None,
304+
**kwargs):
305+
endpoint = self.get_endpoint('records',
306+
bucket=bucket,
307+
collection=collection)
308+
if endpoint not in self._records_timestamp:
309+
record_resp, headers = self.session.request('head', endpoint)
310+
311+
# Save the current records collection timestamp
312+
etag = headers.get('ETag', '').strip('"')
313+
self._records_timestamp[endpoint] = etag
314+
315+
return self._records_timestamp[endpoint]
316+
297317
def get_records(self, collection=None, bucket=None, **kwargs):
298318
"""Returns all the records"""
299319
endpoint = self.get_endpoint('records',

kinto_http/tests/test_client.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,34 @@ def test_collection_can_retrieve_all_records(self):
537537
records = self.client.get_records()
538538
assert list(records) == [{'id': 'foo'}, {'id': 'bar'}]
539539

540+
def test_collection_can_retrieve_records_timestamp(self):
541+
mock_response(self.session, data=[{'id': 'foo'}, {'id': 'bar'}],
542+
headers={"ETag": '"12345"'})
543+
timestamp = self.client.get_records_timestamp()
544+
assert timestamp == '12345'
545+
546+
def test_records_timestamp_is_cached(self):
547+
mock_response(self.session, data=[{'id': 'foo'}, {'id': 'bar'}],
548+
headers={"ETag": '"12345"'})
549+
self.client.get_records()
550+
timestamp = self.client.get_records_timestamp()
551+
assert timestamp == '12345'
552+
assert self.session.request.call_count == 1
553+
554+
def test_records_timestamp_is_cached_per_collection(self):
555+
mock_response(self.session, data=[{'id': 'foo'}, {'id': 'bar'}],
556+
headers={"ETag": '"12345"'})
557+
self.client.get_records(collection="foo")
558+
mock_response(self.session, data=[{'id': 'foo'}, {'id': 'bar'}],
559+
headers={"ETag": '"67890"'})
560+
self.client.get_records(collection="bar")
561+
562+
timestamp = self.client.get_records_timestamp("foo")
563+
assert timestamp == '12345'
564+
565+
timestamp = self.client.get_records_timestamp("bar")
566+
assert timestamp == '67890'
567+
540568
def test_pagination_is_followed(self):
541569
# Mock the calls to request.
542570
link = ('http://example.org/buckets/buck/collections/coll/records/'

0 commit comments

Comments
 (0)