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()
Exemple #2
0
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()