def test_create_context_template(self):
        new_context = create_context_template(
            self.person_schema, self.base,
            process_schema_name(self.schema_name))
        self.assertTrue('sdo' in new_context['sdo']["@context"].keys())
        self.assertTrue(
            new_context['sdo']["@context"]['sdo'] == "https://schema.org")
        self.assertTrue(
            'IdentifierInfo' in new_context['sdo']["@context"].keys())
        self.assertTrue(new_context['sdo']["@context"]['@language'] == 'en')
        self.assertTrue('lastName' in new_context['sdo']["@context"].keys())
        self.assertTrue('identifier' in new_context['sdo']["@context"].keys())

        self.assertTrue('obo' in new_context['obo']["@context"].keys())
        self.assertTrue(new_context['obo']["@context"]['obo'] ==
                        "http://purl.obolibrary.org/obo/")
        self.assertTrue(
            'IdentifierInfo' in new_context['obo']["@context"].keys())
        self.assertTrue(new_context['obo']["@context"]['@language'] == 'en')
        self.assertTrue('lastName' in new_context['obo']["@context"].keys())
        self.assertTrue('identifier' in new_context['obo']["@context"].keys())
Exemple #2
0
    def create_context(self, user_input):
        """ Resolve a network a creates the associated context files templates

        :param user_input: a dict that should contain a "schema_url" and a "vocab" attributes.
            vocab should contain the ontology names as keys and their base URL as value
        :type user_input: dict
        :return: a dict containing the context files of all schema in the network and
            for all given vocabulary
        """

        if 'schema_url' not in user_input.keys():
            raise falcon.HTTPError(falcon.HTTP_400,
                                   "Query error, no schema url was provided")
        elif 'vocab' not in user_input.keys() \
                or type(user_input["vocab"]) != dict or \
                not len(user_input['vocab']) > 0:
            raise falcon.HTTPError(falcon.HTTP_400,
                                   "Query error, no vocabulary was provided ")
        else:

            output = {}
            network = resolve_network(user_input["schema_url"])

            for semantic_type in user_input['vocab']:
                output[semantic_type] = {}

            for schema in network.keys():
                schema_name = process_schema_name(
                    network[schema]['id']).lower()
                local_context = create_context_template(
                    network[schema], user_input['vocab'], schema_name)

                for vocab_name in local_context:
                    output[vocab_name][schema_name] = local_context[vocab_name]

            return json.dumps(output, indent=4)
Exemple #3
0
    def __init__(self, overlaps):
        self.overlaps = overlaps["overlaps"]
        self.output = {
            "schemas": copy.deepcopy(overlaps["network1"]['schemas']),
            "contexts": copy.deepcopy(overlaps["network1"]['contexts'])
        }
        self.content = overlaps
        self.name_mapping = {}  # {"oldName":"newName"}

        self.output_name = \
            self.content['network1']['name'].lower() + \
            "_" + self.content['network2']['name'].lower() + "_merge"
        self.output_dir = os.path.join(
            os.path.dirname(__file__),
            "../tests/fullDiffOutput/merges/" + self.output_name + "/")
        self.errors = {}

        self.main_schema_name = overlaps['network1']['name'].lower().replace(
            ' ', '_').capitalize()

        if "fields_to_merge" not in overlaps:
            print("Nothing to merge for current setup")
            exit()

        # Process mergings
        for schemaName in overlaps['fields_to_merge']:

            merging_schema_name = schemaName.replace('_schema.json', '')
            merge_with_schema_name = overlaps['fields_to_merge'][schemaName][
                'merge_with'].replace('_schema.json', '')

            if merge_with_schema_name != merging_schema_name:
                merged_schema_name = merge_with_schema_name + "_" \
                                                            + merging_schema_name \
                                                            + "_merged_schema.json"
                merged_type = merge_with_schema_name.capitalize(
                ) + merging_schema_name.capitalize()
            else:
                merged_schema_name = merge_with_schema_name + "_merged_schema.json"
                merged_type = merge_with_schema_name.capitalize() + 'Merged'

            self.name_mapping[overlaps['fields_to_merge'][schemaName]
                              ['merge_with']] = merged_schema_name
            self.name_mapping[schemaName] = merged_schema_name

            merged_title = overlaps["network1"]['schemas'][overlaps[
                'fields_to_merge'][schemaName]['merge_with']]['title'] + " - " + \
                overlaps["network2"]['schemas'][schemaName]['title'] + " merging"
            merged_description = "Merge between the " + overlaps["network1"]['schemas'][overlaps[
                'fields_to_merge'][schemaName]['merge_with']]['title'] + " and the " + \
                overlaps["network2"]['schemas'][schemaName]['title']

            merged_schema = copy.deepcopy(overlaps["network1"]['schemas'][
                overlaps['fields_to_merge'][schemaName]['merge_with']])
            merged_context = copy.deepcopy(overlaps["network1"]['contexts'][
                overlaps['fields_to_merge'][schemaName]['merge_with']])

            del self.output['schemas'][overlaps['fields_to_merge'][schemaName]
                                       ['merge_with']]
            del self.output['contexts'][overlaps['fields_to_merge'][schemaName]
                                        ['merge_with']]

            # process the fields to merge
            for field in overlaps['fields_to_merge'][schemaName]['fields']:
                merged_schema['properties'][field] = overlaps['network2'][
                    'schemas'][schemaName]['properties'][field]

                merged_schema['title'] = merged_title
                merged_schema['description'] = merged_description
                merged_context[field] = overlaps['network2']['contexts'][
                    schemaName][field]

                self.find_references(overlaps['network2']['schemas']
                                     [schemaName]['properties'][field])

            if 'enum' in merged_schema['properties']['@type']:
                type_iterator = 0
                for schema_type in merged_schema['properties']['@type'][
                        'enum']:
                    if schema_type == merge_with_schema_name.capitalize():
                        del merged_schema['properties']['@type']['enum'][
                            type_iterator]
                        merged_schema['properties']['@type']['enum'].append(
                            merged_type)
                        type_iterator += 1

            self.output['schemas'][merged_schema_name] = merged_schema
            self.output['contexts'][merged_schema_name] = merged_context

        # processing main schema name
        for overlap in self.overlaps:
            if self.main_schema_name in overlap[0] and float(
                    overlap[1]['coverage'][0]) >= 100:
                old_schema1_name = self.main_schema_name.lower()
                old_schema2_name = overlap[0][1].lower()

                new_schema_name = old_schema1_name \
                    + "_" + old_schema2_name + '_merged_schema.json'
                new_description = "A merge between " \
                                  + old_schema1_name + " and " \
                                  + old_schema2_name + " schemas"
                new_title = "Merge between " + old_schema1_name + " and " + old_schema2_name
                new_schema = self.content['network1']['schemas'][
                    old_schema1_name + "_schema.json"]
                new_schema['description'] = new_description
                new_schema['title'] = new_title

                if 'enum' in new_schema['properties']['@type']:
                    print()
                    type_iterator = 0
                    for schema_type in new_schema['properties']['@type'][
                            'enum']:
                        if schema_type == self.main_schema_name:
                            del new_schema['properties']['@type']['enum'][
                                type_iterator]
                            new_schema['properties']['@type']['enum'].append(
                                process_schema_name(new_schema_name))

                self.output['schemas'][new_schema_name] = new_schema
                del self.output['schemas'][old_schema1_name + "_schema.json"]

                # Context
                self.output['contexts'][new_schema_name] = self.content[
                    'network1']['contexts'][old_schema1_name + '_schema.json']
                self.output['contexts'][new_schema_name][process_schema_name(
                    new_schema_name)] = self.output['contexts'][
                        old_schema1_name +
                        '_schema.json'][process_schema_name(old_schema1_name)]
                del self.output['contexts'][new_schema_name][
                    process_schema_name(old_schema1_name)]
                del self.output['contexts'][old_schema1_name + '_schema.json']

        self.modify_references()
Exemple #4
0
    def modify_references(self):
        """ Modify the $ref names

        :return:
        """
        look_for = ["anyOf", "oneOf", "allOf"]
        delete_schemas = []

        for schema in self.output['schemas']:

            if schema in self.name_mapping:
                delete_schemas.append(schema)

            else:
                if 'properties' in self.output['schemas'][schema]:
                    for item in self.output['schemas'][schema]['properties']:
                        field = self.output['schemas'][schema]['properties'][
                            item]

                        if '$ref' in field:
                            field_ref = field['$ref'].replace('#', '')
                            if field_ref in self.name_mapping:
                                self.output['schemas'][schema]['properties'][item]['$ref'] = \
                                    self.name_mapping[field_ref] + '#'

                        for reference in look_for:
                            if reference in field:
                                sub_item_iterator = 0
                                for sub_item in field[reference]:
                                    if '$ref' in sub_item:
                                        field_ref = sub_item['$ref']
                                        if field_ref in self.name_mapping:
                                            self.output['schemas'][schema]['properties'][
                                                reference][sub_item_iterator]['$ref'] = \
                                                self.name_mapping[field_ref] + "#"
                                    sub_item_iterator += 1

                        if 'items' in field:

                            if '$ref' in field['items']:
                                field_ref = field['items']['$ref'].replace(
                                    '#', '')
                                if field_ref in self.name_mapping:
                                    self.output['schemas'][
                                        schema]['properties'][item]['items']['$ref'] = \
                                        self.name_mapping[field_ref] + '#'

                            for reference in look_for:
                                if reference in field['items']:
                                    sub_item_iterator = 0
                                    for sub_item in field['items'][reference]:
                                        if '$ref' in sub_item:
                                            field_ref = sub_item['$ref']
                                            if field_ref in self.name_mapping:
                                                self.output['schemas'][schema]['properties'][
                                                    reference]['items'][
                                                    sub_item_iterator]['$ref'] = \
                                                    self.name_mapping[field_ref] + "#"
                                        sub_item_iterator += 1

        for schema in delete_schemas:
            del self.output['schemas'][schema]

        change_names = {v: k for k, v in self.name_mapping.items()}
        for context in self.output['contexts']:
            new_field_base_name = process_schema_name(context)

            if context in change_names:
                old_schema_name = change_names[context]
                old_field_base_name = process_schema_name(old_schema_name)
                # set the new context field
                self.output["contexts"][context][new_field_base_name] = \
                    copy.copy(self.content['network2'][
                                  "contexts"][old_schema_name][old_field_base_name])
 def test_process_schema_name(self):
     self.assertTrue(
         process_schema_name(self.schema_name) == "IdentifierInfo")