def __init__(self, service_name, name, procedures, documentation, sort): super(Class, self).__init__() self.service_name = service_name self.name = name self.fullname = service_name + '.' + name self.documentation = documentation self.cref = 'T:%s.%s' % (service_name, name) members = [] properties = defaultdict(dict) for pname, pinfo in procedures.iteritems(): if 'id' in pinfo: del pinfo['id'] if Attributes.is_a_class_method(pname): members.append(ClassMethod(service_name, name, pname, **pinfo)) elif Attributes.is_a_class_static_method(pname): members.append( ClassStaticMethod(service_name, name, pname, **pinfo)) elif Attributes.is_a_class_property_accessor(pname): propname = Attributes.get_class_member_name(pname) proc = Procedure(service_name, pname, **pinfo) if Attributes.is_a_class_property_getter(pname): properties[propname]['getter'] = proc else: properties[propname]['setter'] = proc for propname, prop in properties.iteritems(): members.append(ClassProperty(service_name, name, propname, **prop)) self.members = OrderedDict( (member.name, member) for member in sorted(members, key=sort))
def __init__(self, service_name, name, procedures, documentation, sort): super(Class, self).__init__() self.service_name = service_name self.name = name self.fullname = service_name+'.'+name self.documentation = documentation self.cref = 'T:%s.%s' % (service_name, name) members = [] properties = defaultdict(dict) for pname, pinfo in procedures.iteritems(): if 'id' in pinfo: del pinfo['id'] if Attributes.is_a_class_method(pname): members.append(ClassMethod(service_name, name, pname, **pinfo)) elif Attributes.is_a_class_static_method(pname): members.append(ClassStaticMethod( service_name, name, pname, **pinfo)) elif Attributes.is_a_class_property_accessor(pname): propname = Attributes.get_class_member_name(pname) proc = Procedure(service_name, pname, **pinfo) if Attributes.is_a_class_property_getter(pname): properties[propname]['getter'] = proc else: properties[propname]['setter'] = proc for propname, prop in properties.iteritems(): members.append(ClassProperty(service_name, name, propname, **prop)) self.members = OrderedDict((member.name, member) for member in sorted(members, key=sort))
def __init__(self, service_name, class_name, name, parameters, documentation, return_type=None, return_is_nullable=False, game_scenes=None): super(ClassStaticMethod, self).__init__() name = Attributes.get_class_member_name(name) 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 = as_type(self.types, return_type) else: self.return_type = None self.return_is_nullable = return_is_nullable self.parameters = [ Parameter(documentation=documentation, **info) for info in parameters ] self.game_scenes = game_scenes self.documentation = documentation self.cref = 'M:%s.%s.%s' % (service_name, class_name, name)
def test_get_class_member_name(self): self.assertRaises(ValueError, Attributes.get_class_member_name, 'ProcedureName') self.assertRaises(ValueError, Attributes.get_class_member_name, 'get_PropertyName') self.assertRaises(ValueError, Attributes.get_class_member_name, 'set_PropertyName') self.assertEqual( 'MethodName', Attributes.get_class_member_name('ClassName_MethodName')) self.assertEqual( 'StaticMethodName', Attributes.get_class_member_name('ClassName_StaticMethodName')) self.assertEqual( 'PropertyName', Attributes.get_class_member_name('ClassName_get_PropertyName')) self.assertEqual( 'PropertyName', Attributes.get_class_member_name('ClassName_set_PropertyName'))
def test_get_class_member_name(self): self.assertRaises(ValueError, Attributes.get_class_member_name, 'ProcedureName') self.assertRaises(ValueError, Attributes.get_class_member_name, 'get_PropertyName') self.assertRaises(ValueError, Attributes.get_class_member_name, 'set_PropertyName') self.assertEqual('MethodName', Attributes.get_class_member_name( 'ClassName_MethodName')) self.assertEqual('StaticMethodName', Attributes.get_class_member_name( 'ClassName_StaticMethodName')) self.assertEqual('PropertyName', Attributes.get_class_member_name( 'ClassName_get_PropertyName')) self.assertEqual('PropertyName', Attributes.get_class_member_name( 'ClassName_set_PropertyName'))
def __init__(self, service_name, class_name, name, parameters, documentation, return_type=None, return_is_nullable=False): super(ClassStaticMethod, self).__init__() name = Attributes.get_class_member_name(name) 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 = as_type(self.types, return_type) else: self.return_type = None self.return_is_nullable = return_is_nullable self.parameters = [Parameter(documentation=documentation, **info) for info in parameters] self.documentation = documentation self.cref = 'M:%s.%s.%s' % (service_name, class_name, name)
def generate_context(self): procedures = {} properties = {} classes = {} enumerations = {} exceptions = {} 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, exception in self._defs['exceptions'].items(): exceptions[name] = { 'documentation': self.parse_documentation( exception['documentation']) } for name, procedure in self._defs['procedures'].items(): if Attributes.is_a_procedure(name): 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(name): property_name = self.parse_name( Attributes.get_property_name(name)) 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(name): property_name = self.parse_name( Attributes.get_property_name(name)) 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(name): class_name = Attributes.get_class_name(name) method_name = self.parse_name( Attributes.get_class_member_name(name)) 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(name): class_name = Attributes.get_class_name(name) method_name = self.parse_name( Attributes.get_class_member_name(name)) 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(name): class_name = Attributes.get_class_name(name) property_name = self.parse_name( Attributes.get_class_member_name(name)) 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(name): class_name = Attributes.get_class_name(name) property_name = self.parse_name( Attributes.get_class_member_name(name)) 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])) return objs return { 'service_name': self._service, 'procedures': sort(procedures), 'properties': sort(properties), 'classes': sort(classes), 'enumerations': sort(enumerations), 'exceptions': sort(exceptions) }
def generate_context(self): context = { 'service_name': self._service, 'service_id': self._defs['id'], 'procedures': {}, 'properties': {}, 'classes': {}, 'enumerations': {}, 'exceptions': {} } for name, cls in self._get_defs('classes'): context['classes'][name] = { 'methods': {}, 'static_methods': {}, 'properties': {}, 'documentation': self.parse_documentation( cls['documentation']) } for name, enumeration in self._get_defs('enumerations'): context['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, exception in self._get_defs('exceptions'): context['exceptions'][name] = { 'documentation': self.parse_documentation( exception['documentation']) } for name, procedure in self._get_defs('procedures'): if Attributes.is_a_procedure(name): context['procedures'][self.parse_name(name)] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'], '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(name): property_name = self.parse_name( Attributes.get_property_name(name)) if property_name not in context['properties']: context['properties'][property_name] = { 'type': self.parse_return_type( self.get_return_type(procedure)), 'getter': None, 'setter': None, 'documentation': self.parse_documentation( procedure['documentation']) } context['properties'][property_name]['getter'] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'] } elif Attributes.is_a_property_setter(name): property_name = self.parse_name( Attributes.get_property_name(name)) params = self.generate_context_parameters(procedure) if property_name not in context['properties']: context['properties'][property_name] = { 'type': params[0]['type'], 'getter': None, 'setter': None, 'documentation': self.parse_documentation( procedure['documentation']) } context['properties'][property_name]['setter'] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'] } elif Attributes.is_a_class_method(name): class_name = Attributes.get_class_name(name) method_name = self.parse_name( Attributes.get_class_member_name(name)) params = self.generate_context_parameters(procedure) context['classes'][class_name]['methods'][method_name] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'], '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(name): class_name = Attributes.get_class_name(name) cls = context['classes'][class_name] method_name = self.parse_name( Attributes.get_class_member_name(name)) cls['static_methods'][method_name] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'], '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(name): class_name = Attributes.get_class_name(name) cls = context['classes'][class_name] property_name = self.parse_name( Attributes.get_class_member_name(name)) if property_name not in cls['properties']: cls['properties'][property_name] = { 'type': self.parse_return_type( self.get_return_type(procedure)), 'getter': None, 'setter': None, 'documentation': self.parse_documentation( procedure['documentation']) } cls['properties'][property_name]['getter'] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'] } elif Attributes.is_a_class_property_setter(name): class_name = Attributes.get_class_name(name) cls = context['classes'][class_name] property_name = self.parse_name( Attributes.get_class_member_name(name)) if property_name not in cls['properties']: params = self.generate_context_parameters(procedure) cls['properties'][property_name] = { 'type': params[1]['type'], 'getter': None, 'setter': None, 'documentation': self.parse_documentation( procedure['documentation']) } cls['properties'][property_name]['setter'] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'] } # Sort the context def sort_dict(x): return collections.OrderedDict( sorted(x.items(), key=lambda x: x[0])) context['procedures'] = sort_dict(context['procedures']) context['properties'] = sort_dict(context['properties']) context['enumerations'] = sort_dict(context['enumerations']) context['classes'] = sort_dict(context['classes']) context['exceptions'] = sort_dict(context['exceptions']) for cls in context['classes'].values(): cls['methods'] = sort_dict(cls['methods']) cls['static_methods'] = sort_dict(cls['static_methods']) cls['properties'] = sort_dict(cls['properties']) return context
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 enumeration in service.enumerations: cls._add_service_enumeration(enumeration) # Add exception types to service for exception in service.exceptions: cls._add_service_exception(exception) # Add procedures for procedure in service.procedures: if Attributes.is_a_procedure(procedure.name): cls._add_service_procedure(procedure) # Add properties properties = defaultdict(lambda: [None, None]) for procedure in service.procedures: if Attributes.is_a_property_accessor(procedure.name): name = Attributes.get_property_name(procedure.name) if Attributes.is_a_property_getter(procedure.name): 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.name): class_name = Attributes.get_class_name(procedure.name) method_name = Attributes.get_class_member_name(procedure.name) 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.name): class_name = Attributes.get_class_name(procedure.name) method_name = Attributes.get_class_member_name(procedure.name) 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.name): class_name = Attributes.get_class_name(procedure.name) property_name = Attributes.get_class_member_name(procedure.name) key = (class_name, property_name) if Attributes.is_a_class_property_getter(procedure.name): 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 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 enumeration in service.enumerations: cls._add_service_enumeration(enumeration) # Add exception types to service for exception in service.exceptions: cls._add_service_exception(exception) # Add procedures for procedure in service.procedures: if Attributes.is_a_procedure(procedure.name): cls._add_service_procedure(procedure) # Add properties properties = defaultdict(lambda: [None, None]) for procedure in service.procedures: if Attributes.is_a_property_accessor(procedure.name): name = Attributes.get_property_name(procedure.name) if Attributes.is_a_property_getter(procedure.name): 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.name): class_name = Attributes.get_class_name(procedure.name) method_name = Attributes.get_class_member_name(procedure.name) 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.name): class_name = Attributes.get_class_name(procedure.name) method_name = Attributes.get_class_member_name(procedure.name) 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.name): class_name = Attributes.get_class_name(procedure.name) property_name = Attributes.get_class_member_name(procedure.name) key = (class_name, property_name) if Attributes.is_a_class_property_getter(procedure.name): 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): context = { 'service_name': self._service, 'service_id': self._defs['id'], 'procedures': {}, 'properties': {}, 'classes': {}, 'enumerations': {}, 'exceptions': {} } for name, cls in self._get_defs('classes'): context['classes'][name] = { 'methods': {}, 'static_methods': {}, 'properties': {}, 'documentation': self.parse_documentation(cls['documentation']) } for name, enumeration in self._get_defs('enumerations'): context['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, exception in self._get_defs('exceptions'): context['exceptions'][name] = { 'documentation': self.parse_documentation(exception['documentation']) } for name, procedure in self._get_defs('procedures'): if Attributes.is_a_procedure(name): context['procedures'][self.parse_name(name)] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'], '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(name): property_name = self.parse_name( Attributes.get_property_name(name)) if property_name not in context['properties']: context['properties'][property_name] = { 'type': self.parse_return_type( self.get_return_type(procedure)), 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } context['properties'][property_name]['getter'] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'] } elif Attributes.is_a_property_setter(name): property_name = self.parse_name( Attributes.get_property_name(name)) params = self.generate_context_parameters(procedure) if property_name not in context['properties']: context['properties'][property_name] = { 'type': params[0]['type'], 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } context['properties'][property_name]['setter'] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'] } elif Attributes.is_a_class_method(name): class_name = Attributes.get_class_name(name) method_name = self.parse_name( Attributes.get_class_member_name(name)) params = self.generate_context_parameters(procedure) context['classes'][class_name]['methods'][method_name] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'], '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(name): class_name = Attributes.get_class_name(name) cls = context['classes'][class_name] method_name = self.parse_name( Attributes.get_class_member_name(name)) cls['static_methods'][method_name] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'], '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(name): class_name = Attributes.get_class_name(name) cls = context['classes'][class_name] property_name = self.parse_name( Attributes.get_class_member_name(name)) if property_name not in cls['properties']: cls['properties'][property_name] = { 'type': self.parse_return_type( self.get_return_type(procedure)), 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } cls['properties'][property_name]['getter'] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'] } elif Attributes.is_a_class_property_setter(name): class_name = Attributes.get_class_name(name) cls = context['classes'][class_name] property_name = self.parse_name( Attributes.get_class_member_name(name)) if property_name not in cls['properties']: params = self.generate_context_parameters(procedure) cls['properties'][property_name] = { 'type': params[1]['type'], 'getter': None, 'setter': None, 'documentation': self.parse_documentation(procedure['documentation']) } cls['properties'][property_name]['setter'] = { 'procedure': procedure, 'remote_name': name, 'remote_id': procedure['id'] } # Sort the context def sort_dict(x): return collections.OrderedDict( sorted(x.items(), key=lambda x: x[0])) context['procedures'] = sort_dict(context['procedures']) context['properties'] = sort_dict(context['properties']) context['enumerations'] = sort_dict(context['enumerations']) context['classes'] = sort_dict(context['classes']) context['exceptions'] = sort_dict(context['exceptions']) for cls in context['classes'].values(): cls['methods'] = sort_dict(cls['methods']) cls['static_methods'] = sort_dict(cls['static_methods']) cls['properties'] = sort_dict(cls['properties']) return context