def GenerateCallback(self, info): if IsPureInterface(self._interface.id): return cpp_impl_includes = set() cpp_header_handlers_emitter = emitter.Emitter() cpp_impl_handlers_emitter = emitter.Emitter() class_name = 'Dart%s' % self._interface.id for operation in self._interface.operations: parameters = [] arguments = [] conversion_includes = [] for argument in operation.arguments: argument_type_info = self._TypeInfo(argument.type.id) parameters.append('%s %s' % (argument_type_info.parameter_type(), argument.id)) arguments.append(argument_type_info.to_dart_conversion(argument.id)) conversion_includes.extend(argument_type_info.conversion_includes()) cpp_header_handlers_emitter.Emit( '\n' ' virtual bool handleEvent($PARAMETERS);\n', PARAMETERS=', '.join(parameters)) if 'Custom' in operation.ext_attrs: continue cpp_impl_includes |= set(conversion_includes) arguments_declaration = 'Dart_Handle arguments[] = { %s }' % ', '.join(arguments) if not len(arguments): arguments_declaration = 'Dart_Handle* arguments = 0' cpp_impl_handlers_emitter.Emit( '\n' 'bool $CLASS_NAME::handleEvent($PARAMETERS)\n' '{\n' ' if (!m_callback.isolate()->isAlive())\n' ' return false;\n' ' DartIsolate::Scope scope(m_callback.isolate());\n' ' DartApiScope apiScope;\n' ' $ARGUMENTS_DECLARATION;\n' ' return m_callback.handleEvent($ARGUMENT_COUNT, arguments);\n' '}\n', CLASS_NAME=class_name, PARAMETERS=', '.join(parameters), ARGUMENTS_DECLARATION=arguments_declaration, ARGUMENT_COUNT=len(arguments)) cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(self._interface.id, True) cpp_header_emitter.Emit( self._template_loader.Load('cpp_callback_header.template'), INTERFACE=self._interface.id, HANDLERS=cpp_header_handlers_emitter.Fragments()) cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(self._interface.id) cpp_impl_emitter.Emit( self._template_loader.Load('cpp_callback_implementation.template'), INCLUDES=self._GenerateCPPIncludes(cpp_impl_includes), INTERFACE=self._interface.id, HANDLERS=cpp_impl_handlers_emitter.Fragments())
def _GenerateCPPHeader(self): to_native_emitter = emitter.Emitter() if self._interface_type_info.custom_to_native(): to_native_emitter.Emit( ' static PassRefPtr<NativeType> toNative(Dart_Handle handle, Dart_Handle& exception);\n' ) else: to_native_emitter.Emit( ' static NativeType* toNative(Dart_Handle handle, Dart_Handle& exception)\n' ' {\n' ' return DartDOMWrapper::unwrapDartWrapper<Dart$INTERFACE>(handle, exception);\n' ' }\n', INTERFACE=self._interface.id) to_dart_emitter = emitter.Emitter() ext_attrs = self._interface.ext_attrs if ('CustomToJS' in ext_attrs or ('CustomToJSObject' in ext_attrs and 'TypedArray' not in ext_attrs) or 'PureInterface' in ext_attrs or 'CPPPureInterface' in ext_attrs or self._interface_type_info.custom_to_dart()): to_dart_emitter.Emit( ' static Dart_Handle toDart(NativeType* value);\n') else: to_dart_emitter.Emit( ' static Dart_Handle toDart(NativeType* value)\n' ' {\n' ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n' ' }\n', INTERFACE=self._interface.id) webcore_includes = self._GenerateCPPIncludes( self._interface_type_info.webcore_includes()) is_node_test = lambda interface: interface.id == 'Node' is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs def TypeCheckHelper(test): return 'true' if any( map(test, self._database.Hierarchy( self._interface))) else 'false' self._cpp_header_emitter.Emit( self._template_loader.Load('cpp_header.template'), INTERFACE=self._interface.id, WEBCORE_INCLUDES=webcore_includes, WEBCORE_CLASS_NAME=self._interface_type_info.native_type(), DECLARATIONS=self._cpp_declarations_emitter.Fragments(), IS_NODE=TypeCheckHelper(is_node_test), IS_ACTIVE=TypeCheckHelper(is_active_test), IS_EVENT_TARGET=TypeCheckHelper(is_event_target_test), TO_NATIVE=to_native_emitter.Fragments(), TO_DART=to_dart_emitter.Fragments())
def StartInterface(self): self._interface_type_info = GetIDLTypeInfo(self._interface.id) self._members_emitter = emitter.Emitter() self._cpp_declarations_emitter = emitter.Emitter() self._cpp_impl_includes = set() self._cpp_definitions_emitter = emitter.Emitter() self._cpp_resolver_emitter = emitter.Emitter() self._GenerateConstructors() self._GenerateEvents()
def GenerateLibraries(self, lib_dir): auxiliary_dir = os.path.relpath(self._auxiliary_dir, self._output_dir) # Generate dom_public.dart. self._GenerateLibFile('dom_public.darttemplate', os.path.join(self._output_dir, 'dom_public.dart'), self._dom_public_files, AUXILIARY_DIR=MassagePath(auxiliary_dir)) # Generate dom_impl.dart. self._GenerateLibFile('dom_impl.darttemplate', os.path.join(self._output_dir, 'dom_impl.dart'), self._dom_impl_files, AUXILIARY_DIR=MassagePath(auxiliary_dir)) # Generate DartDerivedSourcesXX.cpp. partitions = 20 # FIXME: this should be configurable. sources_count = len(self._cpp_impl_files) for i in range(0, partitions): derived_sources_path = os.path.join( self._output_dir, 'DartDerivedSources%02i.cpp' % (i + 1)) includes_emitter = emitter.Emitter() for impl_file in self._cpp_impl_files[i::partitions]: path = os.path.relpath(impl_file, os.path.dirname(derived_sources_path)) includes_emitter.Emit('#include "$PATH"\n', PATH=path) derived_sources_emitter = self._emitters.FileEmitter( derived_sources_path) derived_sources_emitter.Emit( self._templates.Load('cpp_derived_sources.template'), INCLUDES=includes_emitter.Fragments()) # Generate DartResolver.cpp. cpp_resolver_path = os.path.join(self._output_dir, 'DartResolver.cpp') includes_emitter = emitter.Emitter() resolver_body_emitter = emitter.Emitter() for file in self._cpp_header_files: path = os.path.relpath(file, os.path.dirname(cpp_resolver_path)) includes_emitter.Emit('#include "$PATH"\n', PATH=path) resolver_body_emitter.Emit( ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argumentCount))\n' ' return func;\n', CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) cpp_resolver_emitter = self._emitters.FileEmitter(cpp_resolver_path) cpp_resolver_emitter.Emit( self._templates.Load('cpp_resolver.template'), INCLUDES=includes_emitter.Fragments(), RESOLVER_BODY=resolver_body_emitter.Fragments())
def _GenerateCppHeader(self): webcore_includes = _GenerateCPPIncludes( self._interface_type_info.webcore_includes()) if ('CustomToJS' in self._interface.ext_attrs or 'CustomToJSObject' in self._interface.ext_attrs or 'PureInterface' in self._interface.ext_attrs or 'CPPPureInterface' in self._interface.ext_attrs or self._interface_type_info.custom_to_dart()): to_dart_value_template = ( 'Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value);\n') else: to_dart_value_template = ( 'inline Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value)\n' '{\n' ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n' '}\n') to_dart_value_emitter = emitter.Emitter() to_dart_value_emitter.Emit( to_dart_value_template, INTERFACE=self._interface.id, WEBCORE_CLASS_NAME=self._interface_type_info.native_type()) self._cpp_header_emitter.Emit( self._templates.Load('cpp_header.template'), INTERFACE=self._interface.id, WEBCORE_INCLUDES=webcore_includes, WEBCORE_CLASS_NAME=self._interface_type_info.native_type(), TO_DART_VALUE=to_dart_value_emitter.Fragments(), DECLARATIONS=self._cpp_declarations_emitter.Fragments())
def testNestedTemplateWithWrongBinding(self): try: e = emitter.Emitter() e.Emit('$#A(-)', A='Invalid') e.Fragments() except RuntimeError, ex: return
def _AddSetter(self, attr, html_name): type_info = GetIDLTypeInfo(attr.type.id) dart_declaration = 'void set %s(%s)' % (html_name, self._DartType(attr.type.id)) is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext_attrs) cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, dart_declaration, 'Setter', is_custom) if is_custom: return arguments = [] parameter_definitions_emitter = emitter.Emitter() self._GenerateCallWithHandling(attr, parameter_definitions_emitter, arguments) if 'Reflect' in attr.ext_attrs: webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_setter_name() arguments.append(self._GenerateWebCoreReflectionAttributeName(attr)) else: webcore_function_name = re.sub(r'^(xml(?=[A-Z])|\w)', lambda s: s.group(1).upper(), attr.id) webcore_function_name = 'set%s' % webcore_function_name if attr.type.id.startswith('SVGAnimated'): webcore_function_name += 'Animated' argument_expression = self._GenerateToNative( parameter_definitions_emitter, attr, 1, argument_name='value') arguments.append(argument_expression) parameter_definitions = parameter_definitions_emitter.Fragments() function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, attr) invocation = self._GenerateWebCoreInvocation(function_expression, arguments, 'void', attr.ext_attrs, attr.set_raises) self._GenerateNativeCallback(cpp_callback_name, parameter_definitions_emitter.Fragments(), True, invocation, raises_exceptions=True)
def _ImplementationEmitter(self): basename = self._interface_type_info.implementation_name() if (self._interface_type_info.merged_into() and self._backend.ImplementsMergedMembers()): # Merged members are implemented in target interface implementation. return emitter.Emitter() return self._library_emitter.FileEmitter(basename, self._library_name)
def testTemplateErrorDuplicate(self): try: e = emitter.Emitter() b = e.Emit('$(A)$(!B)$(A)$(!B)') # $(!B) is duplicated except RuntimeError as ex: return raise AssertionError('Expected error')
def testNestedTemplateWithWrongBinding(self): try: e = emitter.Emitter() e.Emit('$#A(-)', A='Invalid') e.Fragments() except RuntimeError as ex: return raise AssertionError('Expected error')
def StartInterface(self, memebers_emitter): # Create emitters for c++ implementation. if not IsPureInterface(self._interface.id): self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(self._interface.id) self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(self._interface.id) else: self._cpp_header_emitter = emitter.Emitter() self._cpp_impl_emitter = emitter.Emitter() self._interface_type_info = self._TypeInfo(self._interface.id) self._members_emitter = memebers_emitter self._cpp_declarations_emitter = emitter.Emitter() self._cpp_impl_includes = set() self._cpp_definitions_emitter = emitter.Emitter() self._cpp_resolver_emitter = emitter.Emitter() self._GenerateConstructors()
def __init__(self): # key valid for 1 month #self.__key = "LvNI43Y9DUdVd6GIOIb6dFjqN0Don6L_" self.__key = "_Rgpfd3PVxLrjKlQ0-g3DbYHDGnq51WJ" #self.__channel = "camarao-iot" self.__channel = "camarao-iot-test" self.__emitter = emitter.Emitter()
def testExample(self): e = emitter.Emitter() body = e.Emit('$TYPE $NAME() {\n' ' $!BODY\n' '}\n', TYPE='int', NAME='foo') body.Emit('return $VALUE;', VALUE='100') self.check(e, 'int foo() {\n' ' return 100;\n' '}\n')
def _GenerateCppHeader(self): to_native_emitter = emitter.Emitter() if self._interface_type_info.custom_to_native(): to_native_emitter.Emit( ' static PassRefPtr<NativeType> toNative(Dart_Handle handle, Dart_Handle& exception);\n' ) else: to_native_emitter.Emit( ' static NativeType* toNative(Dart_Handle handle, Dart_Handle& exception)\n' ' {\n' ' return DartDOMWrapper::unwrapDartWrapper<Dart$INTERFACE>(handle, exception);\n' ' }\n', INTERFACE=self._interface.id) to_dart_emitter = emitter.Emitter() if ('CustomToJS' in self._interface.ext_attrs or 'CustomToJSObject' in self._interface.ext_attrs or 'PureInterface' in self._interface.ext_attrs or 'CPPPureInterface' in self._interface.ext_attrs or self._interface_type_info.custom_to_dart()): to_dart_emitter.Emit( ' static Dart_Handle toDart(NativeType* value);\n') else: to_dart_emitter.Emit( ' static Dart_Handle toDart(NativeType* value)\n' ' {\n' ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n' ' }\n', INTERFACE=self._interface.id) webcore_includes = _GenerateCPPIncludes( self._interface_type_info.webcore_includes()) wrapper_type = _DOMWrapperType(self._database, self._interface) self._cpp_header_emitter.Emit( self._system._templates.Load('cpp_header.template'), INTERFACE=self._interface.id, WEBCORE_INCLUDES=webcore_includes, WEBCORE_CLASS_NAME=self._interface_type_info.native_type(), DECLARATIONS=self._cpp_declarations_emitter.Fragments(), NATIVE_TRAITS_TYPE='DartDOMWrapper::%sTraits' % wrapper_type, TO_NATIVE=to_native_emitter.Fragments(), TO_DART=to_dart_emitter.Fragments())
def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_name): webcore_function_name = operation.ext_attrs.get( 'ImplementedAs', operation.id) parameter_definitions_emitter = emitter.Emitter() cpp_arguments = [] raises_exceptions = self._GenerateCallWithHandling( operation, parameter_definitions_emitter, cpp_arguments) raises_exceptions = raises_exceptions or len( arguments) > 0 or operation.raises # Process Dart cpp_arguments. start_index = 1 if operation.is_static: start_index = 0 for (i, argument) in enumerate(arguments): if (i == len(arguments) - 1 and self._interface.id == 'Console' and argument.id == 'arg'): # FIXME: we are skipping last argument here because it was added in # supplemental dart.idl. Cleanup dart.idl and remove this check. break argument_expression = self._GenerateToNative( parameter_definitions_emitter, argument, start_index + i) cpp_arguments.append(argument_expression) if operation.id in ['addEventListener', 'removeEventListener']: # addEventListener's and removeEventListener's last argument is marked # as optional in idl, but is not optional in webcore implementation. if len(arguments) == 2: cpp_arguments.append('false') if self._interface.id == 'CSSStyleDeclaration' and operation.id == 'setProperty': # CSSStyleDeclaration.setProperty priority parameter is optional in Dart # idl, but is not optional in webcore implementation. if len(arguments) == 2: cpp_arguments.append('String()') if 'NeedsUserGestureCheck' in operation.ext_attrs: cpp_arguments.append('DartUtilities::processingUserGesture') function_expression = self._GenerateWebCoreFunctionExpression( webcore_function_name, operation) invocation = self._GenerateWebCoreInvocation(function_expression, cpp_arguments, operation.type.id, operation.ext_attrs, operation.raises) self._GenerateNativeCallback( cpp_callback_name, parameter_definitions=parameter_definitions_emitter.Fragments(), needs_receiver=not operation.is_static, invocation=invocation, raises_exceptions=raises_exceptions)
def _AddGetter(self, attr): type_info = GetIDLTypeInfo(attr.type.id) dart_declaration = '%s get %s()' % (type_info.dart_type(), DartDomNameOfAttribute(attr)) is_custom = 'Custom' in attr.ext_attrs or 'CustomGetter' in attr.ext_attrs cpp_callback_name = self._GenerateNativeBinding( attr.id, 1, dart_declaration, 'Getter', is_custom) if is_custom: return arguments = [] parameter_definitions_emitter = emitter.Emitter() raises_exceptions = self._GenerateCallWithHandling( attr, parameter_definitions_emitter, arguments) raises_exceptions = raises_exceptions or attr.get_raises if 'Reflect' in attr.ext_attrs: webcore_function_name = GetIDLTypeInfo( attr.type.id).webcore_getter_name() if 'URL' in attr.ext_attrs: if 'NonEmpty' in attr.ext_attrs: webcore_function_name = 'getNonEmptyURLAttribute' else: webcore_function_name = 'getURLAttribute' arguments.append( self._GenerateWebCoreReflectionAttributeName(attr)) else: if attr.id == 'operator': webcore_function_name = '_operator' elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString': webcore_function_name = 'svgTarget' else: webcore_function_name = re.sub(r'^(HTML|URL|JS|XML|XSLT|\w)', lambda s: s.group(1).lower(), attr.id) webcore_function_name = re.sub( r'^(create|exclusive)', lambda s: 'is' + s.group(1).capitalize(), webcore_function_name) if attr.type.id.startswith('SVGAnimated'): webcore_function_name += 'Animated' function_expression = self._GenerateWebCoreFunctionExpression( webcore_function_name, attr) invocation = self._GenerateWebCoreInvocation(function_expression, arguments, attr.type.id, attr.ext_attrs, attr.get_raises) self._GenerateNativeCallback(cpp_callback_name, parameter_definitions_emitter.Fragments(), True, invocation, raises_exceptions=raises_exceptions)
def StartInterface(self): # Create emitters for c++ implementation. if self.HasImplementation(): cpp_header_path = self._system._FilePathForCppHeader( self._interface.id) self._system._cpp_header_files.append(cpp_header_path) self._cpp_header_emitter = self._system._emitters.FileEmitter( cpp_header_path) cpp_impl_path = self._system._FilePathForCppImplementation( self._interface.id) self._system._cpp_impl_files.append(cpp_impl_path) self._cpp_impl_emitter = self._system._emitters.FileEmitter( cpp_impl_path) else: self._cpp_header_emitter = emitter.Emitter() self._cpp_impl_emitter = emitter.Emitter() self._interface_type_info = GetIDLTypeInfo(self._interface.id) self._members_emitter = emitter.Emitter() self._cpp_declarations_emitter = emitter.Emitter() self._cpp_impl_includes = set() self._cpp_definitions_emitter = emitter.Emitter() self._cpp_resolver_emitter = emitter.Emitter() self._GenerateConstructors() return self._members_emitter
def StartInterface(self, members_emitter): # Create emitters for c++ implementation. if not IsPureInterface(self._interface.id) and not IsCustomType( self._interface.id): self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( self._interface.id, self._renamer.GetLibraryName(self._interface)) self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter( self._interface.id) else: self._cpp_header_emitter = emitter.Emitter() self._cpp_impl_emitter = emitter.Emitter() self._interface_type_info = self._TypeInfo(self._interface.id) self._members_emitter = members_emitter self._cpp_declarations_emitter = emitter.Emitter() self._cpp_impl_includes = set([ '"' + partial + '.h"' for partial in _GetCPPPartialNames(self._interface.id) ]) self._cpp_definitions_emitter = emitter.Emitter() self._cpp_resolver_emitter = emitter.Emitter() # We need to revisit our treatment of typed arrays, right now # it is full of hacks. if self._interface.ext_attrs.get( 'ConstructorTemplate') == 'TypedArray': self._cpp_resolver_emitter.Emit( ' if (name == "$(INTERFACE_NAME)_constructor_Callback")\n' ' return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n', INTERFACE_NAME=self._interface.id) self._cpp_impl_includes.add('"DartArrayBufferViewCustom.h"') self._cpp_definitions_emitter.Emit( '\n' 'static void constructorCallback(Dart_NativeArguments args)\n' '{\n' ' WebCore::DartArrayBufferViewInternal::constructWebGLArray<Dart$(INTERFACE_NAME)>(args);\n' '}\n', INTERFACE_NAME=self._interface.id)
def _AddGetter(self, attr, html_name): type_info = GetIDLTypeInfo(attr.type.id) dart_declaration = '%s get %s()' % (self._DartType( attr.type.id), html_name) is_custom = 'Custom' in attr.ext_attrs or 'CustomGetter' in attr.ext_attrs cpp_callback_name = self._GenerateNativeBinding( attr.id, 1, dart_declaration, 'Getter', is_custom) if is_custom: return arguments = [] parameter_definitions_emitter = emitter.Emitter() raises_exceptions = self._GenerateCallWithHandling( attr, parameter_definitions_emitter, arguments) raises_exceptions = raises_exceptions or attr.get_raises if 'Reflect' in attr.ext_attrs: webcore_function_name = GetIDLTypeInfo( attr.type.id).webcore_getter_name() if 'URL' in attr.ext_attrs: if 'NonEmpty' in attr.ext_attrs: webcore_function_name = 'getNonEmptyURLAttribute' else: webcore_function_name = 'getURLAttribute' arguments.append( self._GenerateWebCoreReflectionAttributeName(attr)) else: if attr.id == 'operator': webcore_function_name = '_operator' elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString': webcore_function_name = 'svgTarget' else: webcore_function_name = _ToWebKitName(attr.id) if attr.type.id.startswith('SVGAnimated'): webcore_function_name += 'Animated' function_expression = self._GenerateWebCoreFunctionExpression( webcore_function_name, attr) invocation = self._GenerateWebCoreInvocation(function_expression, arguments, attr.type.id, attr.ext_attrs, attr.get_raises) self._GenerateNativeCallback(cpp_callback_name, parameter_definitions_emitter.Fragments(), True, invocation, raises_exceptions=raises_exceptions)
def FileEmitter(self, filename, key=None): """Creates an emitter for writing to a file. When this MultiEmitter is flushed, the contents of the emitter are written to the file. Arguments: filename: a string, the path name of the file key: provides an access key to retrieve the emitter. Returns: the emitter. """ e = emitter.Emitter() self._filename_to_emitter[filename] = e if key: self.Associate(key, e) return e
def testHoleScopes(self): e = emitter.Emitter() # Holes have scope. They remember the bindings of the template application # in which they are created. Create two holes which inherit bindings for C # and D. (a, b) = e.Emit('[$!A][$!B]$C$D$E', C='1', D='2') e.Emit(' $A$B$C$D') # Bindings are local to the Emit self.check(e, '[][]12$E $A$B$C$D') # Holes are not bound within holes. That would too easily lead to infinite # expansions. a.Emit('$A$C$D') # $A12 b.Emit('$D$C$B') # 21$B self.check(e, '[$A12][21$B]12$E $A$B$C$D') # EmitRaw avoids interpolation. a.EmitRaw('$C$D') b.EmitRaw('$D$C') self.check(e, '[$A12$C$D][21$B$D$C]12$E $A$B$C$D')
def testTemplate4(self): e = emitter.Emitter() (a, b) = e.Emit('$!A$!B$A$B') # pair of holes. a.Emit('x') b.Emit('y') self.check(e, 'xyxy')
def testMissing(self): # Behaviour of Undefined parameters depends on form. e = emitter.Emitter(); e.Emit('$A $?B $(C) $(?D)') self.check(e, '$A $(C) ')
def testTemplate2(self): e = emitter.Emitter() r = e.Emit('1$(A)2$(B)3$(A)4$(B)5', A='x', B='y') self.assertEquals(None, r) self.check(e, '1x2y3x4y5')
def testTemplate3(self): e = emitter.Emitter() b = e.Emit('1$(A)2$(!B)3$(A)4$(B)5', A='x') b.Emit('y') self.check(e, '1x2y3x4y5') self.check(b, 'y')
def testTemplate1(self): e = emitter.Emitter() e.Emit('-$A+$B-$A+$B-', A='1', B='2') self.check(e, '-1+2-1+2-')
def testTemplateErrorDuplicate(self): try: e = emitter.Emitter() b = e.Emit('$(A)$(!B)$(A)$(!B)') # $(!B) is duplicated except RuntimeError, ex: return
with open(path, "w") as tmp: tmp.write(python_code) dynamic_import(path, case) os.close(fd) os.remove(path) def process_paths(paths): if os.path.isfile(path): with open(path) as f: process_file(f) if __name__ == "__main__": e = emitter.Emitter() for p in args.path: paths = glob.glob(p) for path in paths: process_paths(paths) for r in decorators.rules: e.emit_rule(r) if args.output_file: with open(args.output_file, "w+") as f: f.write(e.string) print("Rules: {}\nActions: {}\nConditions: {}\n".format(e.rules, e.actions, e.conditions))
def testNestedTemplates2(self): e = emitter.Emitter() e.Emit('-$#A( $#B(-$C-) )-', A=True, B=True, C='1') self.check(e, '- -1- -')
def testNestedTemplatesWithFalse(self): e = emitter.Emitter() e.Emit('-$#A( $B )-', A=False, B='1') self.check(e, '--')