Skip to content

Commit cbb519f

Browse files
committed
Merge pull request #206 from Syncano/LIB-656
[LIB-656] add cache_key support for data endpoints and script endpoints;
2 parents 4c4c8ef + 9a66243 commit cbb519f

File tree

5 files changed

+84
-6
lines changed

5 files changed

+84
-6
lines changed

syncano/models/archetypes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,11 @@ def to_python(self, data):
225225
:type data: dict
226226
:param data: Raw data
227227
"""
228+
228229
for field in self._meta.fields:
229230
field_name = field.name
230231

231-
if field.mapping is not None and self.pk:
232+
if field.mapping is not None and not self.is_new():
232233
field_name = field.mapping
233234

234235
if field_name in data:

syncano/models/data_views.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class EndpointData(Model):
2828
name = fields.StringField(max_length=64, primary_key=True)
2929
description = fields.StringField(required=False)
3030

31-
query = fields.JSONField(read_only=False, required=True)
31+
query = fields.JSONField(read_only=False, required=False)
3232

3333
class_name = fields.StringField(label='class name', mapping='class')
3434

@@ -78,12 +78,21 @@ def clear_cache(self):
7878
connection = self._get_connection()
7979
return connection.request('POST', endpoint)
8080

81-
def get(self):
81+
def get(self, cache_key=None):
8282
properties = self.get_endpoint_data()
8383
endpoint = self._meta.resolve_endpoint('get', properties)
8484
connection = self._get_connection()
85+
86+
kwargs = {}
87+
params = {}
88+
if cache_key is not None:
89+
params = {'cache_key': cache_key}
90+
91+
if params:
92+
kwargs = {'params': params}
93+
8594
while endpoint is not None:
86-
response = connection.request('GET', endpoint)
95+
response = connection.request('GET', endpoint, **kwargs)
8796
endpoint = response.get('next')
8897
for obj in response['objects']:
8998
yield obj

syncano/models/incentives.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ class Meta:
254254
}
255255
}
256256

257-
def run(self, **payload):
257+
def run(self, cache_key=None, **payload):
258258
"""
259259
Usage::
260260
@@ -271,7 +271,15 @@ def run(self, **payload):
271271
endpoint = self._meta.resolve_endpoint('run', properties)
272272
connection = self._get_connection(**payload)
273273

274-
response = connection.request('POST', endpoint, **{'data': payload})
274+
params = {}
275+
if cache_key is not None:
276+
params = {'cache_key': cache_key}
277+
278+
kwargs = {'data': payload}
279+
if params:
280+
kwargs.update({'params': params})
281+
282+
response = connection.request('POST', endpoint, **kwargs)
275283

276284
if isinstance(response, dict) and 'result' in response and 'stdout' in response['result']:
277285
response.update({'instance_name': self.instance_name,

syncano/models/instances.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class Instance(RenameMixin, Model):
5151
# snippets and data fields;
5252
scripts = fields.RelatedManagerField('Script')
5353
script_endpoints = fields.RelatedManagerField('ScriptEndpoint')
54+
data_endpoints = fields.RelatedManagerField('EndpointData')
5455
templates = fields.RelatedManagerField('ResponseTemplate')
5556

5657
triggers = fields.RelatedManagerField('Trigger')

tests/integration_test_cache.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# -*- coding: utf-8 -*-
2+
from syncano.models import RuntimeChoices
3+
from tests.integration_test import InstanceMixin, IntegrationTest
4+
5+
6+
class DataEndpointCacheTest(InstanceMixin, IntegrationTest):
7+
8+
@classmethod
9+
def setUpClass(cls):
10+
super(DataEndpointCacheTest, cls).setUpClass()
11+
cls.klass = cls.instance.classes.create(
12+
name='sample_klass',
13+
schema=[
14+
{'name': 'test1', 'type': 'string'},
15+
{'name': 'test2', 'type': 'string'}
16+
])
17+
18+
cls.data_object = cls.klass.objects.create(
19+
class_name=cls.klass.name,
20+
test1='123',
21+
test2='321',
22+
)
23+
24+
cls.data_endpoint = cls.instance.data_endpoints.create(
25+
name='test_data_endpoint',
26+
description='test description',
27+
class_name=cls.klass.name
28+
)
29+
30+
def test_cache_request(self):
31+
data_endpoint = list(self.data_endpoint.get(cache_key='12345'))
32+
33+
self.assertTrue(data_endpoint)
34+
35+
for data_object in data_endpoint:
36+
self.assertTrue(data_object)
37+
38+
39+
class ScriptEndpointCacheTest(InstanceMixin, IntegrationTest):
40+
41+
@classmethod
42+
def setUpClass(cls):
43+
super(ScriptEndpointCacheTest, cls).setUpClass()
44+
45+
cls.script = cls.instance.scripts.create(
46+
label='test_script',
47+
description='test script desc',
48+
source='print(12)',
49+
runtime_name=RuntimeChoices.PYTHON_V5_0,
50+
)
51+
52+
cls.script_endpoint = cls.instance.script_endpoints.create(
53+
name='test_script_endpoint',
54+
script=cls.script.id
55+
)
56+
57+
def test_cache_request(self):
58+
response = self.script_endpoint.run(cache_key='123456')
59+
self.assertEqual(response.result['stdout'], '12')

0 commit comments

Comments
 (0)