22import six
33from syncano .exceptions import SyncanoValueError
44
5+ from .classes import Class
56from .incentives import Script , ScriptEndpoint
67
78
@@ -17,6 +18,7 @@ class DependencyType(object):
1718 The type of the dependency object used in the custom socket;
1819 """
1920 SCRIPT = 'script'
21+ CLASS = 'class'
2022
2123
2224class BaseCall (object ):
@@ -109,14 +111,19 @@ def to_dependency_data(self):
109111 return dependency_data
110112
111113 def get_name (self ):
112- raise NotImplementedError ()
114+ if self .name is not None :
115+ return {'name' : self .name }
116+ return {'name' : self .dependency_object .name }
113117
114118 def get_dependency_data (self ):
115119 raise NotImplementedError ()
116120
117121 def create_from_raw_data (self , raw_data ):
118122 raise NotImplementedError ()
119123
124+ def _build_dict (self , instance ):
125+ return {field_name : getattr (instance , field_name ) for field_name in self .fields }
126+
120127
121128class ScriptDependency (BaseDependency ):
122129 """
@@ -147,11 +154,6 @@ def __init__(self, script_or_script_endpoint, name=None):
147154 self .dependency_object = script_or_script_endpoint
148155 self .name = name
149156
150- def get_name (self ):
151- if self .name is not None :
152- return {'name' : self .name }
153- return {'name' : self .dependency_object .name }
154-
155157 def get_dependency_data (self ):
156158
157159 if isinstance (self .dependency_object , ScriptEndpoint ):
@@ -161,9 +163,7 @@ def get_dependency_data(self):
161163 script = self .dependency_object
162164
163165 dependency_data = self .get_name ()
164- dependency_data .update ({
165- field_name : getattr (script , field_name ) for field_name in self .fields
166- })
166+ dependency_data .update (self ._build_dict (script ))
167167 return dependency_data
168168
169169 @classmethod
@@ -174,6 +174,41 @@ def create_from_raw_data(cls, raw_data):
174174 })
175175
176176
177+ class ClassDependency (BaseDependency ):
178+ """
179+ Class dependency object;
180+
181+ The JSON format is as follows::
182+ {
183+ 'type': 'class',
184+ 'name': '<class_name>',
185+ 'schema': [
186+ {"name": "f1", "type": "string"},
187+ {"name": "f2", "type": "string"},
188+ {"name": "f3", "type": "integer"}
189+ ],
190+ }
191+ """
192+ dependency_type = DependencyType .CLASS
193+ fields = [
194+ 'name' ,
195+ 'schema'
196+ ]
197+
198+ def __init__ (self , class_instance ):
199+ self .dependency_object = class_instance
200+ self .name = class_instance .name
201+
202+ def get_dependency_data (self ):
203+ data_dict = self ._build_dict (self .dependency_object )
204+ data_dict ['schema' ] = data_dict ['schema' ].schema
205+ return data_dict
206+
207+ @classmethod
208+ def create_from_raw_data (cls , raw_data ):
209+ return cls (** {'class_instance' : Class (** raw_data )})
210+
211+
177212class EndpointMetadataMixin (object ):
178213 """
179214 A mixin which allows to collect Endpoints objects and transform them to the appropriate JSON format.
@@ -239,6 +274,8 @@ def update_dependencies(self):
239274 def _get_depedency_klass (cls , depedency_type ):
240275 if depedency_type == DependencyType .SCRIPT :
241276 return ScriptDependency
277+ elif depedency_type == DependencyType .CLASS :
278+ return ClassDependency
242279
243280 def add_dependency (self , depedency ):
244281 self ._dependencies .append (depedency )
0 commit comments