示例#1
0
def test_model(tmp_path):

    epc = os.path.join(tmp_path, 'model.epc')
    model = rq.new_model(epc)
    assert model is not None
    crs = rqc.Crs(model)
    crs_root = crs.create_xml()
    model.store_epc()
    assert os.path.exists(epc)
    md_datum_1 = rqw.MdDatum(model,
                             location=(0.0, 0.0, -50.0),
                             crs_uuid=crs.uuid)
    md_datum_1.create_xml(title='Datum & 1')
    md_datum_2 = rqw.MdDatum(model,
                             location=(3.0, 0.0, -50.0),
                             crs_uuid=crs.uuid)
    md_datum_2.create_xml(title='Datum < 2')
    assert len(model.uuids(obj_type='MdDatum')) == 2
    model.store_epc()

    model = rq.Model(epc)
    assert model is not None
    assert len(model.uuids(obj_type='MdDatum')) == 2
    datum_part_1 = model.part(obj_type='MdDatum', title='1', title_mode='ends')
    datum_part_2 = model.part(obj_type='MdDatum', title='2', title_mode='ends')
    assert datum_part_1 is not None and datum_part_2 is not None and datum_part_1 != datum_part_2
    datum_uuid_1 = rqet.uuid_in_part_name(datum_part_1)
    datum_uuid_2 = rqet.uuid_in_part_name(datum_part_2)
    assert not bu.matching_uuids(datum_uuid_1, datum_uuid_2)
    p1 = model.uuid_part_dict[bu.uuid_as_int(datum_uuid_1)]
    p2 = model.uuid_part_dict[bu.uuid_as_int(datum_uuid_2)]
    assert p1 == datum_part_1 and p2 == datum_part_2
示例#2
0
    def force_part_equivalence(self, immigrant_part, resident_part):
        """Forces immigrant part to be treated as equivalent to resident part."""

        assert immigrant_part is not None and resident_part is not None
        if immigrant_part == resident_part:
            return
        self.force_uuid_equivalence(rqet.uuid_in_part_name(immigrant_part),
                                    rqet.uuid_in_part_name(resident_part))
示例#3
0
def _uuid(model,
          parts_list=None,
          obj_type=None,
          uuid=None,
          title=None,
          title_mode='is',
          title_case_sensitive=False,
          extra={},
          related_uuid=None,
          epc_subdir=None,
          multiple_handling='exception'):
    """Returns the uuid of a part matching all of the arguments passed."""

    part = _part(model,
                 parts_list=parts_list,
                 obj_type=obj_type,
                 uuid=uuid,
                 title=title,
                 title_mode=title_mode,
                 title_case_sensitive=title_case_sensitive,
                 extra=extra,
                 related_uuid=related_uuid,
                 epc_subdir=epc_subdir,
                 multiple_handling=multiple_handling)
    if part is None:
        return None
    return rqet.uuid_in_part_name(part)
示例#4
0
def _parts_list_filtered_by_related_uuid(model,
                                         parts_list,
                                         uuid,
                                         uuid_is_source=None):
    """From a list of parts, returns a list of those parts which have a relationship with the given uuid."""

    if not model.rels_present or parts_list is None or uuid is None:
        return None
    filtered_list = []
    this_part = _part_for_uuid(model, uuid)

    if this_part is not None:
        rels_part_root = _root_for_part(
            model, rqet.rels_part_name_for_part(this_part), is_rels=True)
        if rels_part_root is not None:
            for relation_node in rels_part_root:
                if rqet.stripped_of_prefix(
                        relation_node.tag) != 'Relationship':
                    continue
                target_part = relation_node.attrib['Target']
                if target_part not in parts_list:
                    continue
                if uuid_is_source is not None:
                    source_dest = relation_node.attrib['Type']
                    if uuid_is_source:
                        if 'source' not in source_dest:
                            continue
                    else:
                        if 'source' in source_dest:
                            continue
                filtered_list.append(target_part)

    for part in parts_list:
        if part in filtered_list:
            continue
        rels_part_root = _root_for_part(model,
                                        rqet.rels_part_name_for_part(part),
                                        is_rels=True)
        if rels_part_root is None:
            continue
        for relation_node in rels_part_root:
            if rqet.stripped_of_prefix(relation_node.tag) != 'Relationship':
                continue
            target_part = relation_node.attrib['Target']
            relation_uuid = rqet.uuid_in_part_name(target_part)
            if bu.matching_uuids(uuid, relation_uuid):
                if uuid_is_source is not None:
                    source_dest = relation_node.attrib['Type']
                    if uuid_is_source:
                        if 'source' in source_dest:
                            continue  # relation is source, so uuid is not
                    else:
                        if 'source' not in source_dest:
                            continue  # relation is not source, so uuid is
                filtered_list.append(part)
                break

    return filtered_list
示例#5
0
def _cache_name(part):
    """Returns the attribute name used for the cached copy of the property array for the given part.

    :meta private:
    """

    if part is None:
        return None
    uuid = rqet.uuid_in_part_name(part)
    if uuid is None:
        return None
    return _cache_name_for_uuid(uuid)
示例#6
0
    def equivalent_uuid_for_part(self,
                                 part,
                                 immigrant_model=None,
                                 ignore_identical_part=False):
        """Returns uuid of an equivalent part in resident model, or None if no equivalent found."""

        #      log.debug('Looking for equivalent uuid for: ' + str(part))
        if not part:
            return None
        if immigrant_model is None:
            immigrant_model = self.model
        immigrant_uuid = rqet.uuid_in_part_name(part)
        #      log.debug('   immigrant uuid: ' + str(immigrant_uuid))
        if immigrant_uuid in self.map:
            #         log.debug('   known to be equivalent to: ' + str(self.map[immigrant_uuid]))
            return self.map[immigrant_uuid]
        obj_type = immigrant_model.type_of_part(part, strip_obj=True)
        if obj_type is None or obj_type not in consolidatable_list:
            return None
        #      log.debug('   object type is consolidatable')
        resident_uuids = self.model.uuids(obj_type=obj_type)
        if resident_uuids is None or len(resident_uuids) == 0:
            #         log.debug('   no resident parts found of type: ' + str(obj_type))
            return None
#      log.debug(f'   {len(resident_uuids)} resident parts of same class')
        if not ignore_identical_part:
            for resident_uuid in resident_uuids:
                if bu.matching_uuids(resident_uuid, immigrant_uuid):
                    #               log.debug('   uuid already resident: ' + str(resident_uuid))
                    return resident_uuid


#      log.debug('   preparing immigrant object')
        if obj_type.endswith('Interpretation') or obj_type.endswith('Feature'):
            immigrant_obj = rqo.__dict__[obj_type](immigrant_model,
                                                   uuid=immigrant_uuid)
        elif obj_type.endswith('Crs'):
            immigrant_obj = rqc.Crs(immigrant_model, uuid=immigrant_uuid)
        elif obj_type == 'TimeSeries':
            immigrant_obj = rqt.TimeSeries(immigrant_model,
                                           uuid=immigrant_uuid)
        elif obj_type == 'StringTableLookup':
            immigrant_obj = rqp.StringLookup(immigrant_model,
                                             uuid=immigrant_uuid)
        elif obj_type == 'PropertyKind':
            immigrant_obj = rqp.PropertyKind(immigrant_model,
                                             uuid=immigrant_uuid)
        else:
            raise Exception('code failure')
        assert immigrant_obj is not None
        for resident_uuid in resident_uuids:
            #         log.debug('   considering resident: ' + str(resident_uuid))
            if ignore_identical_part and bu.matching_uuids(
                    resident_uuid, immigrant_uuid):
                continue
            if obj_type.endswith('Interpretation') or obj_type.endswith(
                    'Feature'):
                resident_obj = rqo.__dict__[obj_type](self.model,
                                                      uuid=resident_uuid)
            elif obj_type.endswith('Crs'):
                resident_obj = rqc.Crs(self.model, uuid=resident_uuid)
            elif obj_type == 'TimeSeries':
                resident_obj = rqt.TimeSeries(self.model, uuid=resident_uuid)
            elif obj_type == 'StringTableLookup':
                resident_obj = rqp.StringLookup(self.model, uuid=resident_uuid)
            elif obj_type == 'PropertyKind':
                resident_obj = rqp.PropertyKind(self.model, uuid=resident_uuid)
            else:
                raise Exception('code failure')
            assert resident_obj is not None
            #         log.debug('   comparing with: ' + str(resident_obj.uuid))
            if immigrant_obj == resident_obj:  # note: == operator overloaded with equivalence method for these classes
                while resident_uuid in self.map:
                    #               log.debug('   following equivalence for: ' + str(resident_uuid))
                    resident_uuid = self.map[resident_uuid]
                self.map[immigrant_uuid] = resident_uuid
                #            log.debug('   new equivalence found with: ' + str(resident_uuid))
                return resident_uuid
        return None