def generate_from_specification(primary_specification_filepath=None, supplemental_specification_filepaths=[], concatenate_output=False, output_dirpath=None, force_output=False, framework_name=""): def load_specification(protocol, filepath, isSupplemental=False): try: with open(filepath, "r") as input_file: parsed_json = json.load(input_file) protocol.parse_specification(parsed_json, isSupplemental) except ValueError as e: raise Exception("Error parsing valid JSON in file: " + filepath) protocol = models.Protocol(framework_name) for specification in supplemental_specification_filepaths: load_specification(protocol, specification, isSupplemental=True) load_specification(protocol, primary_specification_filepath, isSupplemental=False) protocol.resolve_types() generators = [] generators.append(BackendCommandsGenerator(protocol, primary_specification_filepath)) generators.append(BackendDispatcherHeaderGenerator(protocol, primary_specification_filepath)) generators.append(BackendDispatcherImplementationGenerator(protocol, primary_specification_filepath)) generators.append(FrontendDispatcherHeaderGenerator(protocol, primary_specification_filepath)) generators.append(FrontendDispatcherImplementationGenerator(protocol, primary_specification_filepath)) generators.append(ProtocolTypesHeaderGenerator(protocol, primary_specification_filepath)) generators.append(ProtocolTypesImplementationGenerator(protocol, primary_specification_filepath)) single_output_file_contents = [] for generator in generators: output = generator.generate_output() if concatenate_output: single_output_file_contents.append('### Begin File: %s' % generator.output_filename()) single_output_file_contents.append(output) single_output_file_contents.append('### End File: %s' % generator.output_filename()) single_output_file_contents.append('') else: output_file = IncrementalFileWriter(os.path.join(output_dirpath, generator.output_filename()), force_output) output_file.write(output) output_file.close() if concatenate_output: filename = os.path.join(os.path.basename(primary_specification_filepath) + '-result') output_file = IncrementalFileWriter(os.path.join(output_dirpath, filename), force_output) output_file.write('\n'.join(single_output_file_contents)) output_file.close()
def generate_from_specification(primary_specification_filepath=None, supplemental_specification_filepaths=[], concatenate_output=False, output_dirpath=None, force_output=False, framework_name="", platform_name="", generate_frontend=True, generate_backend=True): def load_specification(protocol, filepath, isSupplemental=False): try: with open(filepath, "r") as input_file: parsed_json = json.loads( re.sub(r"/\*.+?\*/", "", input_file.read())) protocol.parse_specification(parsed_json, isSupplemental) except ValueError as e: raise Exception("Error parsing valid JSON in file: " + filepath + "\nParse error: " + str(e)) platform = Platform.fromString(platform_name) protocol = models.Protocol(framework_name) for specification in supplemental_specification_filepaths: load_specification(protocol, specification, isSupplemental=True) load_specification(protocol, primary_specification_filepath, isSupplemental=False) protocol.resolve_types() generator_arguments = [protocol, platform, primary_specification_filepath] generators = [] if protocol.framework is Frameworks.Test: generators.append(JSBackendCommandsGenerator(*generator_arguments)) generators.append( CppAlternateBackendDispatcherHeaderGenerator(*generator_arguments)) generators.append( CppBackendDispatcherHeaderGenerator(*generator_arguments)) generators.append( CppBackendDispatcherImplementationGenerator(*generator_arguments)) generators.append( CppFrontendDispatcherHeaderGenerator(*generator_arguments)) generators.append( CppFrontendDispatcherImplementationGenerator(*generator_arguments)) generators.append( CppProtocolTypesHeaderGenerator(*generator_arguments)) generators.append( CppProtocolTypesImplementationGenerator(*generator_arguments)) generators.append( ObjCBackendDispatcherHeaderGenerator(*generator_arguments)) generators.append( ObjCBackendDispatcherImplementationGenerator(*generator_arguments)) generators.append( ObjCConfigurationHeaderGenerator(*generator_arguments)) generators.append( ObjCConfigurationImplementationGenerator(*generator_arguments)) generators.append( ObjCFrontendDispatcherImplementationGenerator( *generator_arguments)) generators.append(ObjCHeaderGenerator(*generator_arguments)) generators.append(ObjCInternalHeaderGenerator(*generator_arguments)) generators.append( ObjCProtocolTypeConversionsHeaderGenerator(*generator_arguments)) generators.append( ObjCProtocolTypeConversionsImplementationGenerator( *generator_arguments)) generators.append( ObjCProtocolTypesImplementationGenerator(*generator_arguments)) elif protocol.framework is Frameworks.JavaScriptCore: generators.append(JSBackendCommandsGenerator(*generator_arguments)) generators.append( CppAlternateBackendDispatcherHeaderGenerator(*generator_arguments)) generators.append( CppBackendDispatcherHeaderGenerator(*generator_arguments)) generators.append( CppBackendDispatcherImplementationGenerator(*generator_arguments)) generators.append( CppFrontendDispatcherHeaderGenerator(*generator_arguments)) generators.append( CppFrontendDispatcherImplementationGenerator(*generator_arguments)) generators.append( CppProtocolTypesHeaderGenerator(*generator_arguments)) generators.append( CppProtocolTypesImplementationGenerator(*generator_arguments)) elif protocol.framework is Frameworks.WebKit and generate_backend: generators.append( CppBackendDispatcherHeaderGenerator(*generator_arguments)) generators.append( CppBackendDispatcherImplementationGenerator(*generator_arguments)) generators.append( CppFrontendDispatcherHeaderGenerator(*generator_arguments)) generators.append( CppFrontendDispatcherImplementationGenerator(*generator_arguments)) generators.append( CppProtocolTypesHeaderGenerator(*generator_arguments)) generators.append( CppProtocolTypesImplementationGenerator(*generator_arguments)) elif protocol.framework is Frameworks.WebKit and generate_frontend: generators.append(ObjCHeaderGenerator(*generator_arguments)) generators.append( ObjCProtocolTypeConversionsHeaderGenerator(*generator_arguments)) generators.append( ObjCProtocolTypeConversionsImplementationGenerator( *generator_arguments)) generators.append( ObjCProtocolTypesImplementationGenerator(*generator_arguments)) elif protocol.framework is Frameworks.WebInspector: generators.append( ObjCBackendDispatcherHeaderGenerator(*generator_arguments)) generators.append( ObjCBackendDispatcherImplementationGenerator(*generator_arguments)) generators.append( ObjCConfigurationHeaderGenerator(*generator_arguments)) generators.append( ObjCConfigurationImplementationGenerator(*generator_arguments)) generators.append( ObjCFrontendDispatcherImplementationGenerator( *generator_arguments)) generators.append(ObjCHeaderGenerator(*generator_arguments)) generators.append(ObjCInternalHeaderGenerator(*generator_arguments)) generators.append( ObjCProtocolTypeConversionsHeaderGenerator(*generator_arguments)) generators.append( ObjCProtocolTypesImplementationGenerator(*generator_arguments)) elif protocol.framework is Frameworks.WebInspectorUI: generators.append(JSBackendCommandsGenerator(*generator_arguments)) single_output_file_contents = [] for generator in generators: # Only some generators care whether frontend or backend was specified, but it is # set on all of them to avoid adding more constructor arguments or thinking too hard. if generate_backend: generator.set_generator_setting('generate_backend', True) if generate_frontend: generator.set_generator_setting('generate_frontend', True) output = generator.generate_output() if concatenate_output: single_output_file_contents.append('### Begin File: %s' % generator.output_filename()) single_output_file_contents.append(output) single_output_file_contents.append('### End File: %s' % generator.output_filename()) single_output_file_contents.append('') else: output_file = IncrementalFileWriter( os.path.join(output_dirpath, generator.output_filename()), force_output) output_file.write(output) output_file.close() if concatenate_output: filename = os.path.join( os.path.basename(primary_specification_filepath) + '-result') output_file = IncrementalFileWriter( os.path.join(output_dirpath, filename), force_output) output_file.write('\n'.join(single_output_file_contents)) output_file.close()