def test_get_class_method_name(self): self.assertRaises(ValueError, Attributes.get_class_method_name, []) self.assertRaises(ValueError, Attributes.get_class_method_name, ['Property.Get(PropertyName)']) self.assertRaises(ValueError, Attributes.get_class_method_name, ['Property.Set(PropertyName)']) self.assertEqual('MethodName', Attributes.get_class_method_name(['Class.Method(ServiceName.ClassName,MethodName)'])) self.assertEqual('MethodName', Attributes.get_class_method_name(['Class.StaticMethod(ServiceName.ClassName,MethodName)'])) self.assertRaises(ValueError, Attributes.get_class_method_name, ['Class.Property.Get(ServiceName.ClassName,PropertyName)']) self.assertRaises(ValueError, Attributes.get_class_method_name, ['Class.Property.Set(ServiceName.ClassName,PropertyName)'])
def create_service(client, service): """ Create a new service type """ cls = type(str(service.name), (ServiceBase,), {'_client': client, '_name': service.name}) # Add class types to service for cls2 in service.classes: cls._add_service_class(cls2) # Add enumeration types to service for enum in service.enumerations: cls._add_service_enumeration(enum) # Add procedures for procedure in service.procedures: if Attributes.is_a_procedure(procedure.attributes): cls._add_service_procedure(procedure) # Add properties properties = defaultdict(lambda: [None,None]) for procedure in service.procedures: if Attributes.is_a_property_accessor(procedure.attributes): name = Attributes.get_property_name(procedure.attributes) if Attributes.is_a_property_getter(procedure.attributes): properties[name][0] = procedure else: properties[name][1] = procedure for name, procedures in properties.items(): cls._add_service_property(name, procedures[0], procedures[1]) # Add class methods for procedure in service.procedures: if Attributes.is_a_class_method(procedure.attributes): class_name = Attributes.get_class_name(procedure.attributes) method_name = Attributes.get_class_method_name(procedure.attributes) cls._add_service_class_method(class_name, method_name, procedure) # Add static class methods for procedure in service.procedures: if Attributes.is_a_class_static_method(procedure.attributes): class_name = Attributes.get_class_name(procedure.attributes) method_name = Attributes.get_class_method_name(procedure.attributes) cls._add_service_class_static_method(class_name, method_name, procedure) # Add class properties properties = defaultdict(lambda: [None,None]) for procedure in service.procedures: if Attributes.is_a_class_property_accessor(procedure.attributes): class_name = Attributes.get_class_name(procedure.attributes) property_name = Attributes.get_class_property_name(procedure.attributes) key = (class_name, property_name) if Attributes.is_a_class_property_getter(procedure.attributes): properties[key][0] = procedure else: properties[key][1] = procedure for (class_name, property_name), procedures in properties.items(): cls._add_service_class_property(class_name, property_name, procedures[0], procedures[1]) return cls()
def __init__(self, service_name, class_name, name, parameters, attributes, documentation, return_type=None): super(ClassStaticMethod, self).__init__() name = Attributes.get_class_method_name(attributes) self.service_name = service_name self.class_name = class_name self.name = name self.fullname = service_name + '.' + class_name + '.' + name if return_type is not None: self.return_type = self.types.get_return_type( return_type, attributes) else: self.return_type = None self.parameters = [ Parameter(position=i, attributes=attributes, documentation=documentation, **info) for i, info in enumerate(parameters) ] self.attributes = attributes self.documentation = documentation self.cref = 'M:%s.%s.%s' % (service_name, class_name, name)
def test_get_class_method_name(self): self.assertRaises(ValueError, Attributes.get_class_method_name, []) self.assertRaises( ValueError, Attributes.get_class_method_name, ['Property.Get(PropertyName)']) self.assertRaises( ValueError, Attributes.get_class_method_name, ['Property.Set(PropertyName)']) self.assertEqual('MethodName', Attributes.get_class_method_name( ['Class.Method(ServiceName.ClassName,MethodName)'])) self.assertEqual('MethodName', Attributes.get_class_method_name( ['Class.StaticMethod(ServiceName.ClassName,MethodName)'])) self.assertRaises( ValueError, Attributes.get_class_method_name, ['Class.Property.Get(ServiceName.ClassName,PropertyName)']) self.assertRaises( ValueError, Attributes.get_class_method_name, ['Class.Property.Set(ServiceName.ClassName,PropertyName)'])
def __init__(self, service_name, class_name, name, parameters, attributes, documentation, return_type=None): super(ClassStaticMethod, self).__init__() name = Attributes.get_class_method_name(attributes) self.service_name = service_name self.class_name = class_name self.name = name self.fullname = service_name+'.'+class_name+'.'+name if return_type is not None: self.return_type = types.get_return_type(return_type, attributes) else: self.return_type = None self.parameters = [Parameter(position=i, attributes=attributes, documentation=documentation, **info) for i,info in enumerate(parameters)] self.attributes = attributes self.documentation = documentation self.cref = 'M:%s.%s.%s' % (service_name, class_name, name)
def create_service(client, service): """ Create a new service type """ cls = type( str(service.name), (ServiceBase,), { '_client': client, '_name': service.name, '__doc__': _parse_documentation(service.documentation) } ) # Add class types to service for cls2 in service.classes: cls._add_service_class(cls2) # Add enumeration types to service for enum in service.enumerations: cls._add_service_enumeration(enum) # Add procedures for procedure in service.procedures: if Attributes.is_a_procedure(procedure.attributes): cls._add_service_procedure(procedure) # Add properties properties = defaultdict(lambda: [None, None]) for procedure in service.procedures: if Attributes.is_a_property_accessor(procedure.attributes): name = Attributes.get_property_name(procedure.attributes) if Attributes.is_a_property_getter(procedure.attributes): properties[name][0] = procedure else: properties[name][1] = procedure for name, procedures in properties.items(): cls._add_service_property(name, procedures[0], procedures[1]) # Add class methods for procedure in service.procedures: if Attributes.is_a_class_method(procedure.attributes): class_name = Attributes.get_class_name(procedure.attributes) method_name = Attributes.get_class_method_name(procedure.attributes) cls._add_service_class_method(class_name, method_name, procedure) # Add static class methods for procedure in service.procedures: if Attributes.is_a_class_static_method(procedure.attributes): class_name = Attributes.get_class_name(procedure.attributes) method_name = Attributes.get_class_method_name(procedure.attributes) cls._add_service_class_static_method(class_name, method_name, procedure) # Add class properties properties = defaultdict(lambda: [None, None]) for procedure in service.procedures: if Attributes.is_a_class_property_accessor(procedure.attributes): class_name = Attributes.get_class_name(procedure.attributes) property_name = Attributes.get_class_property_name(procedure.attributes) key = (class_name, property_name) if Attributes.is_a_class_property_getter(procedure.attributes): properties[key][0] = procedure else: properties[key][1] = procedure for (class_name, property_name), procedures in properties.items(): cls._add_service_class_property(class_name, property_name, procedures[0], procedures[1]) return cls()
def generate_context(self): procedures = {} properties = {} classes = {} enumerations = {} for name,cls in self._defs['classes'].items(): classes[name] = { 'methods': {}, 'static_methods': {}, 'properties': {}, 'documentation': self.parse_documentation(cls['documentation']) } for name,enumeration in self._defs['enumerations'].items(): enumerations[name] = { 'values': [{ 'name': self.parse_name(x['name']), 'value': x['value'], 'documentation': self.parse_documentation(x['documentation']) } for x in enumeration['values']], 'documentation': self.parse_documentation(enumeration['documentation']) } for name,procedure in self._defs['procedures'].items(): if Attributes.is_a_procedure(procedure['attributes']): procedures[self.parse_name(name)] = { 'procedure': procedure, 'remote_name': name, 'parameters': self.generate_context_parameters(procedure), 'return_type': self.parse_return_type(procedure), 'documentation': self.parse_documentation(procedure['documentation']) } elif Attributes.is_a_property_getter(procedure['attributes']): property_name = self.parse_name(Attributes.get_property_name(procedure['attributes'])) if property_name not in properties: properties[property_name] = { 'type': self.parse_return_type(procedure), 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } properties[property_name]['getter'] = { 'procedure': procedure, 'remote_name': name } elif Attributes.is_a_property_setter(procedure['attributes']): property_name = self.parse_name(Attributes.get_property_name(procedure['attributes'])) if property_name not in properties: properties[property_name] = { 'type': self.generate_context_parameters(procedure)[0]['type'], 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } properties[property_name]['setter'] = { 'procedure': procedure, 'remote_name': name } elif Attributes.is_a_class_method(procedure['attributes']): class_name = Attributes.get_class_name(procedure['attributes']) method_name = self.parse_name(Attributes.get_class_method_name(procedure['attributes'])) classes[class_name]['methods'][method_name] = { 'procedure': procedure, 'remote_name': name, 'parameters': self.generate_context_parameters(procedure)[1:], 'return_type': self.parse_return_type(procedure), 'documentation': self.parse_documentation(procedure['documentation']) } elif Attributes.is_a_class_static_method(procedure['attributes']): class_name = Attributes.get_class_name(procedure['attributes']) method_name = self.parse_name(Attributes.get_class_method_name(procedure['attributes'])) classes[class_name]['static_methods'][method_name] = { 'procedure': procedure, 'remote_name': name, 'parameters': self.generate_context_parameters(procedure), 'return_type': self.parse_return_type(procedure), 'documentation': self.parse_documentation(procedure['documentation']) } elif Attributes.is_a_class_property_getter(procedure['attributes']): class_name = Attributes.get_class_name(procedure['attributes']) property_name = self.parse_name(Attributes.get_class_property_name(procedure['attributes'])) if property_name not in classes[class_name]['properties']: classes[class_name]['properties'][property_name] = { 'type': self.parse_return_type(procedure), 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } classes[class_name]['properties'][property_name]['getter'] = { 'procedure': procedure, 'remote_name': name } elif Attributes.is_a_class_property_setter(procedure['attributes']): class_name = Attributes.get_class_name(procedure['attributes']) property_name = self.parse_name(Attributes.get_class_property_name(procedure['attributes'])) if property_name not in classes[class_name]['properties']: classes[class_name]['properties'][property_name] = { 'type': self.generate_context_parameters(procedure)[1]['type'], 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } classes[class_name]['properties'][property_name]['setter'] = { 'procedure': procedure, 'remote_name': name } def sort(d): if type(d) == dict: return collections.OrderedDict(sorted([(x,sort(y)) for x,y in d.items()], key=lambda x: x[0])) else: return d return { 'service_name': self._service, 'procedures': sort(procedures), 'properties': sort(properties), 'classes': sort(classes), 'enumerations': sort(enumerations) }
def generate_context(self): procedures = {} properties = {} classes = {} enumerations = {} for name, cls in self._defs['classes'].items(): classes[name] = { 'methods': {}, 'static_methods': {}, 'properties': {}, 'documentation': self.parse_documentation(cls['documentation']) } for name, enumeration in self._defs['enumerations'].items(): enumerations[name] = { 'values': [{ 'name': self.parse_name(x['name']), 'value': x['value'], 'documentation': self.parse_documentation(x['documentation']) } for x in enumeration['values']], 'documentation': self.parse_documentation(enumeration['documentation']) } for name, procedure in self._defs['procedures'].items(): if Attributes.is_a_procedure(procedure['attributes']): procedures[self.parse_name(name)] = { 'procedure': procedure, 'remote_name': name, 'parameters': self.generate_context_parameters(procedure), 'return_type': self.parse_return_type(self.get_return_type(procedure)), 'documentation': self.parse_documentation(procedure['documentation']) } elif Attributes.is_a_property_getter(procedure['attributes']): property_name = self.parse_name( Attributes.get_property_name(procedure['attributes'])) if property_name not in properties: properties[property_name] = { 'type': self.parse_return_type( self.get_return_type(procedure)), 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } properties[property_name]['getter'] = { 'procedure': procedure, 'remote_name': name } elif Attributes.is_a_property_setter(procedure['attributes']): property_name = self.parse_name( Attributes.get_property_name(procedure['attributes'])) params = self.generate_context_parameters(procedure) if property_name not in properties: properties[property_name] = { 'type': params[0]['type'], 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } properties[property_name]['setter'] = { 'procedure': procedure, 'remote_name': name } elif Attributes.is_a_class_method(procedure['attributes']): class_name = Attributes.get_class_name(procedure['attributes']) method_name = self.parse_name( Attributes.get_class_method_name(procedure['attributes'])) params = self.generate_context_parameters(procedure) classes[class_name]['methods'][method_name] = { 'procedure': procedure, 'remote_name': name, 'parameters': params[1:], 'return_type': self.parse_return_type(self.get_return_type(procedure)), 'documentation': self.parse_documentation(procedure['documentation']) } elif Attributes.is_a_class_static_method(procedure['attributes']): class_name = Attributes.get_class_name(procedure['attributes']) method_name = self.parse_name( Attributes.get_class_method_name(procedure['attributes'])) classes[class_name]['static_methods'][method_name] = { 'procedure': procedure, 'remote_name': name, 'parameters': self.generate_context_parameters(procedure), 'return_type': self.parse_return_type(self.get_return_type(procedure)), 'documentation': self.parse_documentation(procedure['documentation']) } elif Attributes.is_a_class_property_getter( procedure['attributes']): class_name = Attributes.get_class_name(procedure['attributes']) property_name = self.parse_name( Attributes.get_class_property_name( procedure['attributes'])) if property_name not in classes[class_name]['properties']: classes[class_name]['properties'][property_name] = { 'type': self.parse_return_type( self.get_return_type(procedure)), 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } classes[class_name]['properties'][property_name]['getter'] = { 'procedure': procedure, 'remote_name': name } elif Attributes.is_a_class_property_setter( procedure['attributes']): class_name = Attributes.get_class_name(procedure['attributes']) property_name = self.parse_name( Attributes.get_class_property_name( procedure['attributes'])) if property_name not in classes[class_name]['properties']: params = self.generate_context_parameters(procedure) classes[class_name]['properties'][property_name] = { 'type': params[1]['type'], 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } classes[class_name]['properties'][property_name]['setter'] = { 'procedure': procedure, 'remote_name': name } def sort(objs): if isinstance(objs, dict): return collections.OrderedDict( sorted([(x, sort(y)) for x, y in objs.items()], key=lambda x: x[0])) else: return objs return { 'service_name': self._service, 'procedures': sort(procedures), 'properties': sort(properties), 'classes': sort(classes), 'enumerations': sort(enumerations) }
def generate_context(self): procedures = {} properties = {} classes = {} enumerations = {} for name, cls in self._defs["classes"].items(): classes[name] = { "methods": {}, "static_methods": {}, "properties": {}, "documentation": self.parse_documentation(cls["documentation"]), } for name, enumeration in self._defs["enumerations"].items(): enumerations[name] = { "values": [ { "name": self.parse_name(x["name"]), "value": x["value"], "documentation": self.parse_documentation(x["documentation"]), } for x in enumeration["values"] ], "documentation": self.parse_documentation(enumeration["documentation"]), } for name, procedure in self._defs["procedures"].items(): if Attributes.is_a_procedure(procedure["attributes"]): procedures[self.parse_name(name)] = { "procedure": procedure, "remote_name": name, "parameters": self.generate_context_parameters(procedure), "return_type": self.parse_return_type(procedure), "documentation": self.parse_documentation(procedure["documentation"]), } elif Attributes.is_a_property_getter(procedure["attributes"]): property_name = self.parse_name(Attributes.get_property_name(procedure["attributes"])) if property_name not in properties: properties[property_name] = { "type": self.parse_return_type(procedure), "getter": None, "setter": None, "documentation": self.parse_documentation(procedure["documentation"]), } properties[property_name]["getter"] = {"procedure": procedure, "remote_name": name} elif Attributes.is_a_property_setter(procedure["attributes"]): property_name = self.parse_name(Attributes.get_property_name(procedure["attributes"])) if property_name not in properties: properties[property_name] = { "type": self.generate_context_parameters(procedure)[0]["type"], "getter": None, "setter": None, "documentation": self.parse_documentation(procedure["documentation"]), } properties[property_name]["setter"] = {"procedure": procedure, "remote_name": name} elif Attributes.is_a_class_method(procedure["attributes"]): class_name = Attributes.get_class_name(procedure["attributes"]) method_name = self.parse_name(Attributes.get_class_method_name(procedure["attributes"])) classes[class_name]["methods"][method_name] = { "procedure": procedure, "remote_name": name, "parameters": self.generate_context_parameters(procedure)[1:], "return_type": self.parse_return_type(procedure), "documentation": self.parse_documentation(procedure["documentation"]), } elif Attributes.is_a_class_static_method(procedure["attributes"]): class_name = Attributes.get_class_name(procedure["attributes"]) method_name = self.parse_name(Attributes.get_class_method_name(procedure["attributes"])) classes[class_name]["static_methods"][method_name] = { "procedure": procedure, "remote_name": name, "parameters": self.generate_context_parameters(procedure), "return_type": self.parse_return_type(procedure), "documentation": self.parse_documentation(procedure["documentation"]), } elif Attributes.is_a_class_property_getter(procedure["attributes"]): class_name = Attributes.get_class_name(procedure["attributes"]) property_name = self.parse_name(Attributes.get_class_property_name(procedure["attributes"])) if property_name not in classes[class_name]["properties"]: classes[class_name]["properties"][property_name] = { "type": self.parse_return_type(procedure), "getter": None, "setter": None, "documentation": self.parse_documentation(procedure["documentation"]), } classes[class_name]["properties"][property_name]["getter"] = { "procedure": procedure, "remote_name": name, } elif Attributes.is_a_class_property_setter(procedure["attributes"]): class_name = Attributes.get_class_name(procedure["attributes"]) property_name = self.parse_name(Attributes.get_class_property_name(procedure["attributes"])) if property_name not in classes[class_name]["properties"]: classes[class_name]["properties"][property_name] = { "type": self.generate_context_parameters(procedure)[1]["type"], "getter": None, "setter": None, "documentation": self.parse_documentation(procedure["documentation"]), } classes[class_name]["properties"][property_name]["setter"] = { "procedure": procedure, "remote_name": name, } def sort(d): if type(d) == dict: return collections.OrderedDict(sorted([(x, sort(y)) for x, y in d.items()], key=lambda x: x[0])) else: return d return { "service_name": self._service, "procedures": sort(procedures), "properties": sort(properties), "classes": sort(classes), "enumerations": sort(enumerations), }