Skip to content

Commit 461e50e

Browse files
authored
Add environment support to sync (contentful#31)
1 parent fb2cafe commit 461e50e

File tree

8 files changed

+90
-20
lines changed

8 files changed

+90
-20
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# CHANGELOG
22

33
## Unreleased
4+
### Added
5+
* Added support of environments to `sync`.
46

57
## v1.7.0
68
### Added

contentful/client.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,15 +336,12 @@ def sync(self, query=None):
336336
<SyncPage next_sync_token='w5ZGw6JFwqZmVcKsE8Kow4grw45QdybC...'>
337337
"""
338338

339-
if self.environment != 'master':
340-
raise NotSupportedException('The sync endpoint is only available for the master environment.')
341-
342339
if query is None:
343340
query = {}
344341
self._normalize_sync(query)
345342

346343
return self._get(
347-
'/sync',
344+
self.environment_url('/sync'),
348345
query
349346
)
350347

contentful/resource.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def __init__(
4343
def _hydrate_sys(self, item):
4444
sys = {}
4545
for k, v in item.get('sys', {}).items():
46-
if k in ['space', 'contentType']:
46+
if k in ['space', 'contentType', 'environment']:
4747
v = self._build_link(v)
4848
if k in ['createdAt', 'updatedAt', 'deletedAt']:
4949
v = dateutil.parser.parse(v)

fixtures/client/sync.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ interactions:
99
Content-Type: [application/vnd.contentful.delivery.v1+json]
1010
User-Agent: [PythonContentfulClient/0.1.0]
1111
method: GET
12-
uri: https://cdn.contentful.com/spaces/cfexampleapi/sync?initial=true
12+
uri: https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?initial=true
1313
response:
1414
body:
1515
string: !!binary |
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept: ['*/*']
6+
Accept-Encoding: [gzip]
7+
Authorization: [Bearer bfbc63cf745a037125dbcc64f716a9a0e9d091df1a79e84920b890f87a6e7ab9]
8+
Connection: [keep-alive]
9+
Content-Type: [application/vnd.contentful.delivery.v1+json]
10+
User-Agent: [python-requests/2.12.1]
11+
X-Contentful-User-Agent: [sdk contentful.py/1.7.0; platform python/3.6.3; os
12+
macOS/16.7.0;]
13+
method: GET
14+
uri: https://cdn.contentful.com/spaces/a22o2qgm356c/environments/staging/sync?initial=true
15+
response:
16+
body:
17+
string: !!binary |
18+
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
45+
AA==
46+
headers:
47+
Accept-Ranges: [bytes]
48+
Access-Control-Allow-Headers: ['Accept,Accept-Language,Authorization,Cache-Control,Content-Length,Content-Range,Content-Type,DNT,Destination,Expires,If-Match,If-Modified-Since,If-None-Match,Keep-Alive,Last-Modified,Origin,Pragma,Range,User-Agent,X-Http-Method-Override,X-Mx-ReqToken,X-Requested-With,X-Contentful-Version,X-Contentful-Content-Type,X-Contentful-Organization,X-Contentful-Skip-Transformation,X-Contentful-User-Agent,X-Contentful-Enable-Alpha-Feature']
49+
Access-Control-Allow-Methods: ['GET,HEAD,OPTIONS']
50+
Access-Control-Allow-Origin: ['*']
51+
Access-Control-Expose-Headers: [Etag]
52+
Access-Control-Max-Age: ['86400']
53+
Age: ['0']
54+
Cache-Control: [max-age=0]
55+
Connection: [keep-alive]
56+
Content-Encoding: [gzip]
57+
Content-Length: ['1540']
58+
Content-Type: [application/vnd.contentful.delivery.v1+json]
59+
Date: ['Fri, 27 Apr 2018 12:10:19 GMT']
60+
ETag: [W/"92eb9c4a934fbd7ea0ddb14043495da1"]
61+
Server: [Contentful]
62+
Vary: [Accept-Encoding]
63+
Via: [1.1 varnish]
64+
X-Cache: [MISS]
65+
X-Cache-Hits: ['0']
66+
X-Content-Type-Options: [nosniff]
67+
X-Contentful-Request-Id: [14d452445089292caddea6d19c87a583]
68+
X-Served-By: [cache-hhn1541-HHN]
69+
X-Timer: ['S1524831019.669045,VS0,VE336']
70+
status: {code: 200, message: OK}
71+
version: 1

tests/client_test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,12 @@ def test_client_sync(self):
160160
self.assertEqual(str(sync), "<SyncPage next_sync_token='w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1wrzCrBzCqMOpZAwOOcOvCcOAwqHDv0XCiMKaOcOxZA8BJUzDr8K-wo1lNx7DnHE'>")
161161
self.assertEqual(str(sync.items[0]), "<Entry[1t9IbcfdCk6m04uISSsaIK] id='5ETMRzkl9KM4omyMwKAOki'>")
162162

163-
def test_client_sync_should_fail_on_non_master_environment(self):
164-
# We'll create the client without Content Type Cache, to avoid having to do a fake request.
165-
client = Client('cfexampleapi', 'b4c0n73n7fu1', content_type_cache=False, environment='foo')
163+
@vcr.use_cassette('fixtures/client/sync_environments.yaml')
164+
def test_client_sync_with_environments(self):
165+
client = Client('a22o2qgm356c', 'bfbc63cf745a037125dbcc64f716a9a0e9d091df1a79e84920b890f87a6e7ab9', environment='staging', content_type_cache=False)
166+
sync = client.sync({'initial': True})
166167

167-
with self.assertRaises(NotSupportedException):
168-
client.sync({'initial': True})
168+
self.assertEquals(sync.items[0].environment.id, 'staging')
169169

170170
@vcr.use_cassette('fixtures/client/array_endpoints.yaml')
171171
def test_client_creates_wrapped_arrays(self):

tests/resource_builder_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ def test__when_build_recieves_a_sync_page__returns_a_SyncPage(self):
1111
"type": "Array"
1212
},
1313
"items": [],
14-
"nextSyncUrl": "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
14+
"nextSyncUrl": "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
1515
},
1616
{
1717
"sys": {
1818
"type": "Array"
1919
},
2020
"items": [],
21-
"nextPageUrl": "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
21+
"nextPageUrl": "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
2222
}
2323
]
2424

tests/sync_page_test.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,10 @@ def test_sync_page_deleted_items(self):
146146
}
147147
}
148148
],
149-
"nextSyncUrl": "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
149+
"nextSyncUrl": "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
150150
})
151151

152-
self.assertEqual(sync_page.next_sync_url, "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM")
152+
self.assertEqual(sync_page.next_sync_url, "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM")
153153
self.assertEqual(sync_page.next_sync_token, "w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM")
154154
self.assertEqual(len(sync_page.items), 8)
155155
self.assertEqual(str(sync_page.items[-1]), "<DeletedEntry id='CVebBDcQsSsu6yKKIayy'>")
@@ -726,10 +726,10 @@ def test_sync_page_initial(self):
726726
}
727727
}
728728
],
729-
"nextSyncUrl": "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1wrzCrBzCqMOpZAwOOcOvCcOAwqHDv0XCiMKaOcOxZA8BJUzDr8K-wo1lNx7DnHE"
729+
"nextSyncUrl": "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1wrzCrBzCqMOpZAwOOcOvCcOAwqHDv0XCiMKaOcOxZA8BJUzDr8K-wo1lNx7DnHE"
730730
})
731731

732-
self.assertEqual(sync_page.next_sync_url, "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1wrzCrBzCqMOpZAwOOcOvCcOAwqHDv0XCiMKaOcOxZA8BJUzDr8K-wo1lNx7DnHE")
732+
self.assertEqual(sync_page.next_sync_url, "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1wrzCrBzCqMOpZAwOOcOvCcOAwqHDv0XCiMKaOcOxZA8BJUzDr8K-wo1lNx7DnHE")
733733
self.assertEqual(sync_page.next_sync_token, "w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1wrzCrBzCqMOpZAwOOcOvCcOAwqHDv0XCiMKaOcOxZA8BJUzDr8K-wo1lNx7DnHE")
734734
self.assertEqual(len(sync_page.items), 14)
735735
self.assertEqual(str(sync_page.items[-1]), "<Entry[cat] id='garfield'>")
@@ -759,10 +759,10 @@ def test__when_sync_has_multiple_pages__extracts_sync_token_from_next_page_url(s
759759
}
760760
}
761761
],
762-
"nextPageUrl": "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
762+
"nextPageUrl": "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
763763
})
764764

765-
self.assertEqual(sync_page.next_page_url, "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM")
765+
self.assertEqual(sync_page.next_page_url, "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM")
766766

767767

768768
def test__when_SyncPage_has_property_next_page_url__get_sync_token_extracts_token_from_it(self):
@@ -789,7 +789,7 @@ def test__when_SyncPage_has_property_next_page_url__get_sync_token_extracts_toke
789789
}
790790
}
791791
],
792-
"nextPageUrl": "https://cdn.contentful.com/spaces/cfexampleapi/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
792+
"nextPageUrl": "https://cdn.contentful.com/spaces/cfexampleapi/environments/master/sync?sync_token=w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM"
793793
})
794794

795795
self.assertEqual(sync_page._get_sync_token(), "w5ZGw6JFwqZmVcKsE8Kow4grw45QdybCnV_Cg8OASMKpwo1UY8K8bsKFwqJrw7DDhcKnM2RDOVbDt1E-wo7CnDjChMKKGsK1w5zCrA3CnU7CgEvDtsK6w7B2wrRZwrwPIgDCjVo8PMOoUcK2wqTCl8O1wpY8wpjCkGM")

0 commit comments

Comments
 (0)