Best Python code snippet using playwright-python
genheaders.py
Source:genheaders.py
...68 for method in _class.listenerInterface.methods:69 classDict['wrapperCbs'].append(CppTranslator._generate_wrapper_callback(self, _class, method))70 71 if ismonolistenable:72 classDict['cCbsGetter'] = _class.name.to_snake_case(fullName=True) + '_get_callbacks'73 classDict['cppListenerName'] = CppTranslator.translate_class_name(_class.listenerInterface.name)74 classDict['parentClassName'] = 'ListenableObject'75 elif ismultilistenable:76 classDict['parentClassName'] = 'MultiListenableObject'77 classDict['listenerCreator'] = 'linphone_factory_create_' + _class.listenerInterface.name.to_snake_case()[:-len('_listener')] + '_cbs'78 classDict['callbacksAdder'] = _class.name.to_snake_case(fullName=True)+ '_add_callbacks'79 classDict['callbacksRemover'] = _class.name.to_snake_case(fullName=True)+ '_remove_callbacks'80 classDict['userDataSetter'] = _class.listenerInterface.name.to_snake_case(fullName=True)[:-len('_listener')] + '_cbs_set_user_data'81 82 for property in _class.properties:83 try:84 classDict['methods'] += CppTranslator.translate_property(self, property)85 except AbsApi.Error as e:86 print('error while translating {0} property: {1}'.format(property.name.to_snake_case(), e.args[0]))87 88 for method in _class.instanceMethods:89 try:90 methodDict = CppTranslator.translate_method(self, method)91 classDict['methods'].append(methodDict)92 except AbsApi.Error as e:93 print('Could not translate {0}: {1}'.format(method.name.to_snake_case(fullName=True), e.args[0]))94 95 for method in _class.classMethods:96 try:97 methodDict = CppTranslator.translate_method(self, method)98 classDict['staticMethods'].append(methodDict)99 except AbsApi.Error as e:100 print('Could not translate {0}: {1}'.format(method.name.to_snake_case(fullName=True), e.args[0]))101 102 return classDict103 104 def _generate_wrapper_callback(self, listenedClass, method):105 namespace = method.find_first_ancestor_by_type(AbsApi.Namespace)106 listenedClass = method.find_first_ancestor_by_type(AbsApi.Interface).listenedClass107 108 params = {}109 params['name'] = method.name.to_camel_case(lower=True)[2:] + 'Cb'110 params['name'] = params['name'][0].lower() + params['name'][1:]111 args = []112 wrappedArgs = []113 for arg in method.args:114 args.append(arg.type.cname + ' ' + arg.name.to_c())115 wrappedArgs.append(CppTranslator._wrap_c_expression_to_cpp(self, arg.name.to_c(), arg.type, usedNamespace=namespace))116 params['params'] = ', '.join(args)117 params['returnType'] = method.returnType.cname118 119 wrapperCbDict = {}120 wrapperCbDict['decl'] = 'static {returnType} {name}({params});'.format(**params)121 wrapperCbDict['cbName'] = params['name']122 wrapperCbDict['declArgs'] = params['params']123 #wrapperCbDict['methodName'] = method.name.to_camel_case(lower=True)124 #wrapperCbDict['wrappedArgs'] = ', '.join(wrappedArgs)125 wrapperCbDict['firstArgName'] = method.args[0].name.to_c()126 wrapperCbDict['returnType'] = params['returnType']127 wrapperCbDict['hasReturnValue'] = (params['returnType'] != 'void')128 wrapperCbDict['hasNotReturnValue'] = not wrapperCbDict['hasReturnValue']129 wrapperCbDict['callbackSetter'] = listenedClass.name.to_snake_case(fullName=True) + '_cbs_set_' + method.name.to_snake_case()[3:]130 wrapperCbDict['cppMethodCallingLine'] = 'listener->{methodName}({wrappedArgs})'.format(131 methodName=method.name.to_camel_case(lower=True),132 wrappedArgs=', '.join(wrappedArgs))133 wrapperCbDict['cppMethodCallingLine'] = CppTranslator._wrap_cpp_expression_to_c(self,134 wrapperCbDict['cppMethodCallingLine'],135 method.returnType)136 return wrapperCbDict137 138 def translate_interface(self, interface):139 if interface.name.to_camel_case(fullName=True) in self.ignore:140 raise AbsApi.Error('{0} has been escaped'.format(interface.name.to_camel_case(fullName=True)))141 142 intDict = {}143 intDict['inheritFrom'] = {'name': 'Listener'}144 intDict['className'] = CppTranslator.translate_class_name(interface.name)145 intDict['constructor'] = None146 intDict['parentClassName'] = 'Listener'147 intDict['isNotListener'] = False148 intDict['methods'] = []149 for method in interface.methods:150 try:151 methodDict = CppTranslator.translate_method(self, method, genImpl=False)152 intDict['methods'].append(methodDict)153 except AbsApi.Error as e:154 print('Could not translate {0}: {1}'.format(method.name.to_snake_case(fullName=True), e.args[0]))155 156 return intDict157 158 def translate_property(self, property):159 res = []160 if property.getter is not None:161 res.append(CppTranslator.translate_method(self, property.getter))162 if property.setter is not None:163 res.append(CppTranslator.translate_method(self, property.setter))164 return res165 166 def translate_method(self, method, genImpl=True):167 if method.name.to_snake_case(fullName=True) in self.ignore:168 raise AbsApi.Error('{0} has been escaped'.format(method.name.to_snake_case(fullName=True)))169 170 namespace = method.find_first_ancestor_by_type(AbsApi.Namespace)171 172 methodElems = {}173 methodElems['return'] = CppTranslator.translate_type(self, method.returnType)174 methodElems['name'] = CppTranslator.translate_method_name(method.name)175 176 methodElems['params'] = ''177 for arg in method.args:178 if arg is not method.args[0]:179 methodElems['params'] += ', '180 methodElems['params'] += CppTranslator.translate_argument(self, arg)181 182 methodElems['const'] = ' const' if method.constMethod else ''183 methodElems['semicolon'] = ';'184 if type(method.parent) is AbsApi.Class and method.type == AbsApi.Method.Type.Class:185 methodElems['methodType'] = 'static '186 elif type(method.parent) is AbsApi.Interface:187 methodElems['methodType'] = 'virtual '188 if isinstance(method.returnType, AbsApi.BaseType) and method.returnType.name == 'void':189 methodElems['semicolon'] = ' {}'190 else:191 methodElems['semicolon'] = ' = 0;'192 else:193 methodElems['methodType'] = ''194 195 methodDict = {}196 methodDict['prototype'] = '{methodType}{return} {name}({params}){const}{semicolon}'.format(**methodElems)197 198 if genImpl:199 if not CppTranslator.is_ambigous_type(self, method.returnType):200 methodElems['implReturn'] = CppTranslator.translate_type(self, method.returnType, namespace=namespace)201 else:202 methodElems['implReturn'] = CppTranslator.translate_type(self, method.returnType, namespace=None)203 204 methodElems['longname'] = CppTranslator.translate_method_name(method.name, recursive=True)205 methodElems['implParams'] = ''206 for arg in method.args:207 if arg is not method.args[0]:208 methodElems['implParams'] += ', '209 methodElems['implParams'] += CppTranslator.translate_argument(self, arg, namespace=namespace)210 211 methodDict['implPrototype'] = '{implReturn} {longname}({implParams}){const}'.format(**methodElems)212 methodDict['sourceCode' ] = CppTranslator._generate_source_code(self, method, usedNamespace=namespace)213 214 return methodDict215 216 def _generate_source_code(self, method, usedNamespace=None):217 nsName = usedNamespace.name if usedNamespace is not None else None218 params = {219 'functionName': method.name.to_c(),220 'args': CppTranslator._generate_wrapped_arguments(self, method, usedNamespace=usedNamespace)221 }222 223 if method.name.to_camel_case(lower=True) != 'setListener':224 cExpr = '{functionName}({args})'.format(**params)225 cppExpr = CppTranslator._wrap_c_expression_to_cpp(self, cExpr, method.returnType, usedNamespace=usedNamespace)226 else:227 cppExpr = 'ListenableObject::setListener(std::static_pointer_cast<Listener>({0}))'.format(method.args[0].name.to_snake_case())228 229 if type(method.returnType) is AbsApi.BaseType and method.returnType.name == 'void' and not method.returnType.isref:230 return cppExpr + ';'231 else:232 return 'return {0};'.format(cppExpr)233 234 def _generate_wrapped_arguments(self, method, usedNamespace=None):235 args = []236 if method.type == AbsApi.Method.Type.Instance:237 _class = method.find_first_ancestor_by_type(AbsApi.Class)238 argStr = '(::{0} *)mPrivPtr'.format(_class.name.to_camel_case(fullName=True))239 args.append(argStr)240 241 for arg in method.args:242 paramName = arg.name.to_camel_case(lower=True)243 args.append(CppTranslator._wrap_cpp_expression_to_c(self, paramName, arg.type, usedNamespace=usedNamespace))244 245 return ', '.join(args)246 247 def _wrap_cpp_expression_to_c(self, cppExpr, exprtype, usedNamespace=None):248 if type(exprtype) is AbsApi.BaseType:249 if exprtype.name == 'string':250 cExpr = 'cppStringToC({0})'.format(cppExpr);251 elif exprtype not in ['void', 'string', 'string_array'] and exprtype.isref:252 cExpr = '&' + cppExpr253 else:254 cExpr = cppExpr255 elif type(exprtype) is AbsApi.EnumType:256 cExpr = '(::{0}){1}'.format(exprtype.desc.name.to_c(), cppExpr)257 elif type(exprtype) is AbsApi.ClassType:258 param = {}259 param['ptrType'] = CppTranslator.translate_class_type(self, exprtype, namespace=usedNamespace)260 param['ptrType'] = CppTranslator.sharedPtrTypeExtractor.match(param['ptrType']).group(2)261 param['cPtrType'] = exprtype.desc.name.to_c()262 param['cppExpr'] = cppExpr263 param['object'] = 'const Object' if exprtype.isconst else 'Object'264 cExpr = '(::{cPtrType} *)sharedPtrToCPtr(std::static_pointer_cast<{object},{ptrType}>({cppExpr}))'.format(**param)265 elif type(exprtype) is AbsApi.ListType:266 if type(exprtype.containedTypeDesc) is AbsApi.BaseType and exprtype.containedTypeDesc.name == 'string':267 cExpr = 'StringBctbxListWrapper({0}).c_list()'.format(cppExpr)268 elif type(exprtype.containedTypeDesc) is AbsApi.Class:269 ptrType = CppTranslator.translate_class_type(exprtype, namespace=usedNamespace)270 ptrType = CppTranslator.sharedPtrTypeExtractor.match(ptrType).group(2)271 cExpr = 'ObjectBctbxListWrapper<{0}>({1}).c_list()'.format(ptrType, cppExpr)272 else:273 raise AbsApi.Error('translation of bctbx_list_t of enums or basic C types is not supported')274 275 return cExpr276 277 def _wrap_c_expression_to_cpp(self, cExpr, exprtype, usedNamespace=None):278 if type(exprtype) is AbsApi.BaseType:279 if exprtype.name == 'void' and not exprtype.isref:280 return cExpr281 elif exprtype.name == 'string':282 return 'cStringToCpp({0})'.format(cExpr)283 elif exprtype.name == 'string_array':284 return 'cStringArrayToCppList({0})'.format(cExpr)285 else:286 return cExpr287 elif type(exprtype) is AbsApi.EnumType:288 cppEnumName = CppTranslator.translate_enum_type(self, exprtype, namespace=usedNamespace)289 return '({0}){1}'.format(cppEnumName, cExpr)290 elif type(exprtype) is AbsApi.ClassType:291 cppReturnType = CppTranslator.translate_class_type(self, exprtype, namespace=usedNamespace)292 cppReturnType = CppTranslator.sharedPtrTypeExtractor.match(cppReturnType).group(2)293 294 if type(exprtype.parent) is AbsApi.Method and len(exprtype.parent.name.words) >=1 and (exprtype.parent.name.words == ['new'] or exprtype.parent.name.words[0] == 'create'):295 return 'cPtrToSharedPtr<{0}>((::belle_sip_object_t *){1}, false)'.format(cppReturnType, cExpr)296 else:297 return 'cPtrToSharedPtr<{0}>((::belle_sip_object_t *){1})'.format(cppReturnType, cExpr)298 elif type(exprtype) is AbsApi.ListType:299 if type(exprtype.containedTypeDesc) is AbsApi.BaseType and exprtype.containedTypeDesc.name == 'string':300 return 'bctbxStringListToCppList({0})'.format(cExpr)301 elif type(exprtype.containedTypeDesc) is AbsApi.ClassType:302 cppReturnType = CppTranslator.translate_class_type(self, exprtype.containedTypeDesc, namespace=usedNamespace)303 cppReturnType = CppTranslator.sharedPtrTypeExtractor.match(cppReturnType).group(2)304 return 'bctbxObjectListToCppList<{0}>({1})'.format(cppReturnType, cExpr)305 else:306 raise AbsApi.Error('translation of bctbx_list_t of enums or basic C types is not supported')307 else:308 return cExpr309 310 def translate_argument(self, arg, **params):311 return '{0} {1}'.format(CppTranslator.translate_type(self, arg.type, **params), CppTranslator.translate_argument_name(arg.name))312 313 def translate_type(self, aType, **params):314 if type(aType) is AbsApi.BaseType:315 return CppTranslator.translate_base_type(self, aType)316 elif type(aType) is AbsApi.EnumType:317 return CppTranslator.translate_enum_type(self, aType, **params)318 elif type(aType) is AbsApi.ClassType:319 return CppTranslator.translate_class_type(self, aType, **params)320 elif type(aType) is AbsApi.ListType:321 return CppTranslator.translate_list_type(self, aType, **params)322 else:323 CppTranslator.fail(aType)324 325 def translate_base_type(self, _type):326 if _type.name == 'void':327 if _type.isref:328 return 'void *'329 else:330 return 'void'331 elif _type.name == 'boolean':332 res = 'bool'333 elif _type.name == 'character':334 res = 'char'335 elif _type.name == 'size':336 res = 'size_t'337 elif _type.name == 'time':338 res = 'time_t'339 elif _type.name == 'integer':340 if _type.size is None:341 res = 'int'342 elif isinstance(_type.size, str):343 res = _type.size344 else:345 res = 'int{0}_t'.format(_type.size)346 elif _type.name == 'floatant':347 if _type.size is not None and _type.size == 'double':348 res = 'double'349 else:350 res = 'float'351 elif _type.name == 'string':352 res = 'std::string'353 if type(_type.parent) is AbsApi.Argument:354 res += ' &'355 elif _type.name == 'string_array':356 res = 'std::list<std::string>'357 if type(_type.parent) is AbsApi.Argument:358 res += ' &'359 else:360 raise AbsApi.Error('\'{0}\' is not a base abstract type'.format(_type.name))361 362 if _type.isUnsigned:363 if _type.name == 'integer' and isinstance(_type.size, int):364 res = 'u' + res365 else:366 res = 'unsigned ' + res367 368 if _type.isconst:369 if _type.name not in ['string', 'string_array'] or type(_type.parent) is AbsApi.Argument:370 res = 'const ' + res371 372 if _type.isref:373 res += ' &'374 return res375 376 def translate_enum_type(self, _type, **params):377 if _type.name in self.ignore:378 raise AbsApi.Error('{0} has been escaped'.format(_type.name))379 380 if _type.desc is None:381 raise AbsApi.Error('{0} has not been fixed'.format(_type.name.to_camel_case(fullName=True)))382 383 if 'namespace' in params:384 nsName = params['namespace'].name if params['namespace'] is not None else None385 else:386 method = _type.find_first_ancestor_by_type(AbsApi.Method)387 nsName = AbsApi.Name.find_common_parent(_type.desc.name, method.name)388 389 return CppTranslator.translate_enum_name(_type.desc.name, recursive=True, topAncestor=nsName)390 391 def translate_class_type(self, _type, **params):392 if _type.name in self.ignore:393 raise AbsApi.Error('{0} has been escaped'.format(_type.name))394 395 if _type.desc is None:396 raise AbsApi.Error('{0} has not been fixed'.format(_type.name))397 398 if 'namespace' in params:399 nsName = params['namespace'].name if params['namespace'] is not None else None400 else:401 method = _type.find_first_ancestor_by_type(AbsApi.Method)402 nsName = AbsApi.Name.find_common_parent(_type.desc.name, method.name)403 404 res = CppTranslator.translate_class_name(_type.desc.name, recursive=True, topAncestor=nsName)405 406 if _type.isconst:407 res = 'const ' + res408 409 if type(_type.parent) is AbsApi.Argument:410 return 'const std::shared_ptr<{0}> &'.format(res)411 else:412 return 'std::shared_ptr<{0}>'.format(res)413 414 def translate_list_type(self, _type, **params):415 if _type.containedTypeDesc is None:416 raise AbsApi.Error('{0} has not been fixed'.format(_type.containedTypeName))417 elif isinstance(_type.containedTypeDesc, AbsApi.BaseType):418 res = CppTranslator.translate_type(self, _type.containedTypeDesc)419 else:420 res = CppTranslator.translate_type(self, _type.containedTypeDesc, **params)421 422 if type(_type.parent) is AbsApi.Argument:423 return 'const std::list<{0} > &'.format(res)424 else:425 return 'std::list<{0} >'.format(res)426 427 @staticmethod428 def translate_name(aName, **params):429 if type(aName) is AbsApi.ClassName:430 return CppTranslator.translate_class_name(aName, **params)431 elif type(aName) is AbsApi.InterfaceName:432 return CppTranslator.translate_class_name(aName, **params)433 elif type(aName) is AbsApi.EnumName:434 return CppTranslator.translate_enum_name(aName, **params)435 elif type(aName) is AbsApi.EnumValueName:436 return CppTranslator.translate_enum_value_name(aName, **params)437 elif type(aName) is AbsApi.MethodName:438 return CppTranslator.translate_method_name(aName, **params)439 elif type(aName) is AbsApi.ArgName:440 return CppTranslator.translate_argument_name(aName, **params)441 elif type(aName) is AbsApi.NamespaceName:442 return CppTranslator.translate_namespace_name(aName, **params)443 elif type(aName) is AbsApi.PropertyName:444 return CppTranslator.translate_property_name(aName, **params)445 else:446 CppTranslator.fail(aName)447 448 @staticmethod449 def translate_class_name(name, recursive=False, topAncestor=None):450 if name.prev is None or not recursive or name.prev is topAncestor:451 return name.to_camel_case()452 else:453 params = {'recursive': recursive, 'topAncestor': topAncestor}454 return CppTranslator.translate_name(name.prev, **params) + '::' + name.to_camel_case()455 456 @staticmethod457 def translate_enum_name(name, recursive=False, topAncestor=None):458 params = {'recursive': recursive, 'topAncestor': topAncestor}459 return CppTranslator.translate_class_name(name, **params)460 461 @staticmethod462 def translate_enum_value_name(name, recursive=False, topAncestor=None):463 params = {'recursive': recursive, 'topAncestor': topAncestor}464 return CppTranslator.translate_enum_name(name.prev, **params) + name.to_camel_case()465 466 @staticmethod467 def translate_method_name(name, recursive=False, topAncestor=None):468 translatedName = name.to_camel_case(lower=True)469 if translatedName == 'new':470 translatedName = '_new'471 472 if name.prev is None or not recursive or name.prev is topAncestor:473 return translatedName474 else:475 params = {'recursive': recursive, 'topAncestor': topAncestor}476 return CppTranslator.translate_name(name.prev, **params) + '::' + translatedName477 478 @staticmethod479 def translate_namespace_name(name, recursive=False, topAncestor=None):480 if name.prev is None or not recursive or name.prev is topAncestor:481 return name.concatenate()482 else:483 params = {'recursive': recursive, 'topAncestor': topAncestor}484 return CppTranslator.translate_namespace_name(name.prev, **params) + '::' + name.concatenate()485 486 @staticmethod487 def translate_argument_name(name):488 return name.to_camel_case(lower=True)489 490 @staticmethod491 def translate_property_name(name):492 CppTranslator.translate_argument_name(name)493 494 @staticmethod495 def fail(obj):496 raise AbsApi.Error('Cannot translate {0} type'.format(type(obj)))497class EnumsHeader(object):498 def __init__(self, translator):499 self.translator = translator500 self.enums = []501 502 def add_enum(self, enum):503 self.enums.append(self.translator.translate_enum(enum))504class ClassHeader(object):505 def __init__(self, _class, translator, ignore=[]):506 if type(_class) is AbsApi.Class:507 self._class = translator.translate_class(_class)508 else:509 self._class = translator.translate_interface(_class)510 511 self.define = '_{0}_HH'.format(_class.name.to_snake_case(upper=True, fullName=True))512 self.filename = '{0}.hh'.format(_class.name.to_snake_case())513 self.priorDeclarations = []514 self.private_type = _class.name.to_camel_case(fullName=True)515 self.ignore = ignore516 517 self.includes = {'internal': [], 'external': []}518 includes = ClassHeader.needed_includes(self, _class)519 for include in includes['internal']:520 if _class.name.to_camel_case(fullName=True) == 'LinphoneCore' or (isinstance(_class, AbsApi.Interface) and _class.listenedClass is not None and include == _class.listenedClass.name.to_snake_case()):521 if include == 'enums':522 self.includes['internal'].append({'name': include})523 else:524 className = AbsApi.ClassName()525 className.from_snake_case(include)526 self.priorDeclarations.append({'name': className.to_camel_case()})527 else:528 self.includes['internal'].append({'name': include})529 530 for include in includes['external']:531 self.includes['external'].append({'name': include})532 533 def needed_includes(self, _class):534 includes = {'internal': set(), 'external': set()}535 536 if type(_class) is AbsApi.Class:537 includes['internal'].add('object')538 539 for property in _class.properties:540 if property.setter is not None:541 ClassHeader._needed_includes_from_method(self, property.setter, includes)542 if property.getter is not None:543 ClassHeader._needed_includes_from_method(self, property.getter, includes)544 545 if type(_class) is AbsApi.Class:546 methods = _class.classMethods + _class.instanceMethods547 else:548 methods = _class.methods549 550 for method in methods:551 ClassHeader._needed_includes_from_type(self, method.returnType, includes)552 for arg in method.args:553 ClassHeader._needed_includes_from_type(self, arg.type, includes)554 555 if isinstance(_class, AbsApi.Class) and _class.listenerInterface is not None:556 includes['internal'].add(_class.listenerInterface.name.to_snake_case())557 558 currentClassInclude = _class.name.to_snake_case()559 if currentClassInclude in includes['internal']:560 includes['internal'].remove(currentClassInclude)561 562 return includes563 564 def _needed_includes_from_method(self, method, includes):565 ClassHeader._needed_includes_from_type(self, method.returnType, includes)566 for arg in method.args:567 ClassHeader._needed_includes_from_type(self, arg.type, includes)568 569 def _needed_includes_from_type(self, _type, includes):570 if isinstance(_type, AbsApi.ClassType):571 includes['external'].add('memory')572 if _type.desc is not None and _type.name not in self.ignore:573 includes['internal'].add(_type.desc.name.to_snake_case())574 elif isinstance(_type, AbsApi.EnumType):575 includes['internal'].add('enums')576 elif isinstance(_type, AbsApi.BaseType):577 if _type.name == 'integer' and isinstance(_type.size, int):578 includes['external'].add('cstdint')579 elif _type.name == 'string':580 includes['external'].add('string')581 elif isinstance(_type, AbsApi.ListType):582 includes['external'].add('list')583 ClassHeader._needed_includes_from_type(self, _type.containedTypeDesc, includes)584class MainHeader(object):585 def __init__(self):586 self.includes = []587 self.define = '_LINPHONE_HH'588 589 def add_include(self, include):590 self.includes.append({'name': include})591class ClassImpl(object):592 def __init__(self, parsedClass, translatedClass):593 self._class = translatedClass594 self.filename = parsedClass.name.to_snake_case() + '.cc'595 self.internalIncludes = []596 self.internalIncludes.append({'name': parsedClass.name.to_snake_case() + '.hh'})597 self.internalIncludes.append({'name': 'coreapi/linphonecore.h'})598 599 namespace = parsedClass.find_first_ancestor_by_type(AbsApi.Namespace)600 self.namespace = namespace.name.concatenate(fullName=True) if namespace is not None else None601def main():602 argparser = argparse.ArgumentParser(description='Generate source files for the C++ wrapper')603 argparser.add_argument('xmldir', type=str, help='Directory where the XML documentation of the Linphone\'s API generated by Doxygen is placed')604 argparser.add_argument('-o --output', type=str, help='the directory where to generate the source files', dest='outputdir', default='.')605 args = argparser.parse_args()606 607 entries = os.listdir(args.outputdir)608 if 'include' not in entries:609 os.mkdir(args.outputdir + '/include')610 if 'src' not in entries:611 os.mkdir(args.outputdir + '/src')612 613 project = CApi.Project()614 project.initFromDir(args.xmldir)615 project.check()616 617 parser = AbsApi.CParser(project)618 parser.parse_all()619 translator = CppTranslator()620 #translator.ignore += ['linphone_tunnel_get_http_proxy',621 #'linphone_core_can_we_add_call',622 #'linphone_core_get_default_proxy',623 #'linphone_core_add_listener',624 #'linphone_core_remove_listener',625 #'linphone_core_get_current_callbacks',626 #'linphone_proxy_config_normalize_number',627 #'linphone_proxy_config_set_file_transfer_server',628 #'linphone_proxy_config_get_file_transfer_server',629 #'linphone_factory_create_core',630 #'linphone_factory_create_core_with_config',631 #'linphone_buffer_get_content',632 #'linphone_chat_room_send_chat_message',633 #'linphone_config_read_relative_file',634 #'linphone_core_new_with_config',635 #'LinphoneImEncryptionEngine',636 #'LinphoneImEncryptionEngineCbs',637 #'LinphoneImNotifPolicy',638 #'LpConfig']639 640 renderer = pystache.Renderer() 641 642 header = EnumsHeader(translator)643 for item in parser.enumsIndex.items():644 if item[1] is not None:645 header.add_enum(item[1])646 else:647 print('warning: {0} enum won\'t be translated because of parsing errors'.format(item[0]))648 649 with open(args.outputdir + '/include/enums.hh', mode='w') as f:650 f.write(renderer.render(header))651 652 mainHeader = MainHeader()653 654 for _class in parser.classesIndex.values() + parser.interfacesIndex.values():655 if _class is not None:656 try:657 header = ClassHeader(_class, translator, ignore=['LinphoneBuffer'])658 impl = ClassImpl(_class, header._class)659 mainHeader.add_include(_class.name.to_snake_case() + '.hh')660 with open(args.outputdir + '/include/' + header.filename, mode='w') as f:661 f.write(renderer.render(header))662 663 if type(_class) is AbsApi.Class:664 with open(args.outputdir + '/src/' + impl.filename, mode='w') as f:665 f.write(renderer.render(impl))666 667 except AbsApi.Error as e:668 print('Could not translate {0}: {1}'.format(_class.name.to_camel_case(fullName=True), e.args[0]))669 670 with open(args.outputdir + '/include/linphone.hh', mode='w') as f:671 f.write(renderer.render(mainHeader))672if __name__ == '__main__':673 main()
manager_gen.py
Source:manager_gen.py
...10plugins = [11 "DisableInput", "AutoPause", "RecordReplay", "Rewind", "ScreenRecorder", "ScreenshotRecorder"12] + game_wrappers13all_plugins = windows + plugins14def to_snake_case(s):15 s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", s)16 return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).lower()17def skip_lines(iterator, stop):18 # Skip old lines19 while True:20 if next(line_iter).strip().startswith(stop):21 break22if __name__ == "__main__":23 out_lines = []24 with open("manager.py", "r") as f:25 line_iter = iter(f.readlines())26 while True:27 line = next(line_iter, None)28 if line is None:29 break30 # Find place to inject31 if line.strip().startswith("# foreach"):32 lines = [line.strip() + "\n"]33 indentation = " " * line.index("# foreach")34 skip_lines(line_iter, "# foreach end")35 _, foreach, plugin_type, fun = line.strip().split(" ", 3)36 for p in eval(plugin_type):37 p_name = to_snake_case(p)38 lines.append(f"if self.{p_name}_enabled:\n")39 # lines.append(f" {var_name} = self.{p_name}\n")40 for sub_fun in fun.split(", "):41 sub_fun = sub_fun.replace("[]", f"self.{p_name}")42 lines.append(f" {sub_fun}\n")43 lines.append("# foreach end\n")44 out_lines.extend([indentation + l for l in lines])45 elif line.strip().startswith("# plugins_enabled"):46 lines = [line.strip() + "\n"]47 indentation = " " * line.index("# plugins_enabled")48 skip_lines(line_iter, "# plugins_enabled end")49 for p in all_plugins:50 p_name = to_snake_case(p)51 lines.append(f"self.{p_name} = {p}(pyboy, mb, pyboy_argv)\n")52 lines.append(f"self.{p_name}_enabled = self.{p_name}.enabled()\n")53 lines.append("# plugins_enabled end\n")54 out_lines.extend([indentation + l for l in lines])55 elif line.strip().startswith("# yield_plugins"):56 lines = [line.strip() + "\n"]57 indentation = " " * line.index("# yield_plugins")58 skip_lines(line_iter, "# yield_plugins end")59 for p in all_plugins:60 p_name = to_snake_case(p)61 lines.append(f"yield {p}.argv\n")62 lines.append("# yield_plugins end\n")63 out_lines.extend([indentation + l for l in lines])64 elif line.strip().startswith("# imports"):65 lines = [line.strip() + "\n"]66 indentation = " " * line.index("# imports")67 skip_lines(line_iter, "# imports end")68 for p in all_plugins:69 p_name = to_snake_case(p)70 lines.append(f"from pyboy.plugins.{p_name} import {p} # isort:skip\n")71 lines.append("# imports end\n")72 out_lines.extend([indentation + l for l in lines])73 elif line.strip().startswith("# gamewrapper"):74 lines = [line.strip() + "\n"]75 indentation = " " * line.index("# gamewrapper")76 skip_lines(line_iter, "# gamewrapper end")77 for p in game_wrappers:78 p_name = to_snake_case(p)79 lines.append(f"if self.{p_name}_enabled: return self.{p_name}\n")80 lines.append("# gamewrapper end\n")81 out_lines.extend([indentation + l for l in lines])82 else:83 out_lines.append(line)84 with open("manager.py", "w") as f:85 f.writelines(out_lines)86 out_lines = []87 with open("manager.pxd", "r") as f:88 line_iter = iter(f.readlines())89 while True:90 line = next(line_iter, None)91 if line is None:92 break93 # Find place to inject94 if line.strip().startswith("# plugin_cdef"):95 lines = [line.strip() + "\n"]96 indentation = " " * line.index("# plugin_cdef")97 skip_lines(line_iter, "# plugin_cdef end")98 for p in all_plugins:99 p_name = to_snake_case(p)100 lines.append(f"cdef public {p} {p_name}\n")101 for p in all_plugins:102 p_name = to_snake_case(p)103 lines.append(f"cdef bint {p_name}_enabled\n")104 lines.append("# plugin_cdef end\n")105 out_lines.extend([indentation + l for l in lines])106 elif line.strip().startswith("# imports"):107 lines = [line.strip() + "\n"]108 indentation = " " * line.index("# imports")109 skip_lines(line_iter, "# imports end")110 for p in all_plugins:111 p_name = to_snake_case(p)112 lines.append(f"from pyboy.plugins.{p_name} cimport {p}\n")113 lines.append("# imports end\n")114 out_lines.extend([indentation + l for l in lines])115 else:116 out_lines.append(line)117 with open("manager.pxd", "w") as f:118 f.writelines(out_lines)119 out_lines = []120 with open("__init__.py", "r") as f:121 line_iter = iter(f.readlines())122 while True:123 line = next(line_iter, None)124 if line is None:125 break126 # Find place to inject127 if line.strip().startswith("# docs exclude"):128 lines = [line.strip() + "\n"]129 indentation = " " * line.index("# docs exclude")130 skip_lines(line_iter, "# docs exclude end")131 for p in (set(all_plugins) - set(game_wrappers)) | set(["manager", "manager_gen"]):132 p_name = to_snake_case(p)133 lines.append(f"\"{p_name}\": False,\n")134 lines.append("# docs exclude end\n")135 out_lines.extend([indentation + l for l in lines])136 else:137 out_lines.append(line)138 with open("__init__.py", "w") as f:...
etl.py
Source:etl.py
...20def id_to_captilize(text: str) -> str:21 """Replace string non null text that ends with ID to Id"""22 if text is not None:23 return re.sub(r'(^.*)ID', r'\1Id', text)24def to_snake_case(text: str) -> str:25 """To snake case non null text"""26 if text is not None:27 return re.sub(r'(?<!^)(?=[A-Z])', '_', text)28def to_float(text: str) -> float:29 """String to float format"""30 if text is not None:31 return float(text.replace(',', '.'))32 33# Person34dataframe = pd.read_csv('../dataset/Person.Person.csv', sep=';')35dataframe.columns = [to_upper((to_snake_case(id_to_captilize(column)))) for column in dataframe.columns]36dataframe.rename({'BUSINESS_ENTITY_ID': 'PERSON_ID'}, axis=1, inplace=True)37dataframe.TITLE.replace({'Ms': 'Ms.'}, inplace=True)38dataframe.to_sql('PERSON', engine, if_exists='append', index=False)39# Customer40dataframe = pd.read_csv('../dataset/Sales.Customer.csv', sep=';')41dataframe.columns = [to_upper((to_snake_case(id_to_captilize(column)))) for column in dataframe.columns]42dataframe.to_sql('CUSTOMER', engine, if_exists='append', index=False)43# Sales Order Header44dataframe = pd.read_csv('../dataset/Sales.SalesOrderHeader.csv', sep=';')45dataframe.columns = [to_upper((to_snake_case(id_to_captilize(column)))) for column in dataframe.columns]46dataframe.replace({np.nan: None}, inplace=True)47dataframe.SUB_TOTAL = dataframe.SUB_TOTAL.apply(to_float)48dataframe.TAX_AMT = dataframe.TAX_AMT.apply(to_float)49dataframe.FREIGHT = dataframe.FREIGHT.apply(to_float)50dataframe.TOTAL_DUE = dataframe.TOTAL_DUE.apply(to_float)51dataframe.to_sql('SALES_ORDER_HEADER', engine, if_exists='append', index=False)52# Product53dataframe = pd.read_csv('../dataset/Production.Product.csv', sep=';')54dataframe.columns = [to_upper((to_snake_case(id_to_captilize(column)))) for column in dataframe.columns]55dataframe.STANDARD_COST = dataframe.STANDARD_COST.apply(to_float)56dataframe.LIST_PRICE = dataframe.LIST_PRICE.apply(to_float)57dataframe.to_sql('PRODUCT', engine, if_exists='append', index=False)58# Special Offer Product59dataframe = pd.read_csv('../dataset/Sales.SpecialOfferProduct.csv', sep=';')60dataframe.columns = [to_upper((to_snake_case(id_to_captilize(column)))) for column in dataframe.columns]61dataframe.to_sql('SPECIAL_OFFER_PRODUCT', engine, if_exists='append', index=False)62# Sales Order Detail63dataframe = pd.read_csv('../dataset/Sales.SalesOrderDetail.csv', sep=';')64dataframe.columns = [to_upper((to_snake_case(id_to_captilize(column)))) for column in dataframe.columns]65dataframe.UNIT_PRICE = dataframe.UNIT_PRICE.apply(to_float)66dataframe.UNIT_PRICE_DISCOUNT = dataframe.UNIT_PRICE_DISCOUNT.apply(to_float)...
plugin.py
Source:plugin.py
...22 super(PluginMeta, cls).__init__(name, tuple(res_bases), dct)23 if cls.GEN_ITEM_PROPERTIES:24 message = ""25 for item_base in item_bases:26 name = get_generator_name(to_snake_case(item_base.__name__.rstrip("Item")))27 proto_fields = [f.name for f in cls.proto_type.DESCRIPTOR.fields]28 missing_fields = [f for f in proto_fields if not hasattr(cls, "create_{}")]29 if missing_fields:30 message = "Some protobuf fields are missing\n"31 message += "Add following lines to the {0} class declaration or set {0}.GEN_PROTOBUF_PROPERTIES = False\n".format(32 cls.__name__)33 message += "def __init__(self, {}):\n".format(', '.join(to_snake_case(f) for f in proto_fields))34 message += " self._proto = self.proto_type({})".format(35 ', '.join(to_snake_case(f) for f in proto_fields))36 for f in missing_fields:37 message += """38def {}( 39""".format(to_snake_case(f), f)40 WARN(message)41class Plugin(object):42 ITEM_TYPES = [TestPluginItem, ]43 def __init__(self):44 # read items from protobuf45 for item_type in self.ITEM_TYPES:46 pass47 def save_items(self):...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!