예제 #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 _parts(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,
           sort_by=None):
    """Returns a list of parts matching all of the arguments passed."""

    if not parts_list:
        parts_list = _list_of_parts(model)
    if uuid is not None:
        part_name = model.uuid_part_dict.get(bu.uuid_as_int(uuid))
        if part_name is None or part_name not in parts_list:
            return []
        parts_list = [part_name]
    if epc_subdir:
        parts_list = _filtered_by_epc_subdir(model, parts_list, epc_subdir)
    if obj_type:
        if obj_type[0].isupper():
            obj_type = 'obj_' + obj_type
        filtered_list = []
        for part in parts_list:
            if model.parts_forest[part][0] == obj_type:
                filtered_list.append(part)
        if len(filtered_list) == 0:
            return []
        parts_list = filtered_list
    if title:
        parts_list = _filtered_by_title(model, parts_list, title, title_mode,
                                        title_case_sensitive)
    if extra:
        parts_list = _filtered_by_extra(model, parts_list, extra)
    if related_uuid is not None:
        parts_list = _parts_list_filtered_by_related_uuid(
            model, parts_list, related_uuid)
    if sort_by and len(parts_list):
        parts_list = _sorted_parts_list(model, parts_list, sort_by)
    return parts_list
예제 #3
0
def _parts_list_of_type(model, type_of_interest=None, uuid=None):
    """Returns a list of part names for parts of type of interest, optionally matching a uuid."""

    if type_of_interest and type_of_interest[0].isupper():
        type_of_interest = 'obj_' + type_of_interest

    if uuid is not None:
        part_name = model.uuid_part_dict.get(bu.uuid_as_int(uuid))
        if part_name is None or (
                type_of_interest is not None and
            (model.parts_forest[part_name][0] != type_of_interest)):
            return []
        return [part_name]

    parts_list = []
    for part_name in model.parts_forest:
        if type_of_interest is None or model.parts_forest[part_name][
                0] == type_of_interest:
            parts_list.append(part_name)
    return parts_list
예제 #4
0
def _type_of_uuid(model, uuid, strip_obj=False):
    """Returns content type for the uuid."""

    part_name = model.uuid_part_dict.get(bu.uuid_as_int(uuid))
    return _type_of_part(model, part_name, strip_obj=strip_obj)
예제 #5
0
def _part_for_uuid(model, uuid):
    """Returns the part name which has the given uuid."""

    return model.uuid_part_dict.get(bu.uuid_as_int(uuid))
예제 #6
0
def test_catalogue_functions(example_model_and_crs):
    model, crs = example_model_and_crs
    # create some grid objects with some boring properties
    grid_a, grid_b, grid_c = add_grids(model, crs, True)
    # test parts() method with various options
    all_parts = model.parts()
    assert isinstance(all_parts, list)
    assert len(all_parts) >= 13
    assert all([isinstance(p, str) for p in all_parts])
    # test obj_type filtering
    grid_parts = model.parts(obj_type='IjkGridRepresentation')
    assert len(grid_parts) == 3
    pcbt = model.parts_count_by_type('obj_IjkGridRepresentation')
    assert isinstance(
        pcbt,
        list) and len(pcbt) == 1 and pcbt[0] == ('IjkGridRepresentation', 3)
    # test single part selection with multiple handling options
    oldest_grid_part = model.part(obj_type='IjkGridRepresentation',
                                  multiple_handling='oldest')
    assert oldest_grid_part is not None and isinstance(oldest_grid_part, str)
    none_part = model.part(obj_type='IjkGridRepresentation',
                           multiple_handling='none')
    assert none_part is None
    # test type_of_part()
    assert all([(model.type_of_part(p,
                                    strip_obj=True) == 'IjkGridRepresentation')
                for p in grid_parts])
    # test filtering with title mode and case sensitivity options
    grid_b_part = model.part(parts_list=grid_parts,
                             title='b',
                             title_mode='ends')
    assert grid_b_part is not None
    assert model.citation_title_for_part(grid_b_part).endswith('B')
    no_grid_b_part = model.part(parts_list=grid_parts,
                                title='b',
                                title_mode='ends',
                                title_case_sensitive=True)
    assert no_grid_b_part is None
    grid_not_b_titles = model.parts(parts_list=grid_parts,
                                    title='grid b',
                                    title_mode='is not')
    assert len(grid_not_b_titles) == 2 and 'GRID B' not in grid_not_b_titles
    none_root = model.root(parts_list=grid_parts,
                           title='GRID',
                           title_mode='does not start',
                           title_case_sensitive=True)
    assert none_root is None
    all_grid_uuids = model.uuids(parts_list=grid_parts,
                                 title='QWERTY',
                                 title_mode='does not contain')
    assert len(all_grid_uuids) == 3
    two_parts = model.parts(parts_list=grid_parts,
                            title='A',
                            title_mode='does not end')
    assert len(two_parts) == 2
    # test uuids() with relationship filtering
    grid_b_rels_uuids = model.uuids(
        related_uuid=model.uuid_for_part(grid_b_part), sort_by='uuid')
    assert grid_b_rels_uuids is not None and len(grid_b_rels_uuids) >= 4
    assert uuid_in_list(crs.uuid, grid_b_rels_uuids)
    # test parts_list_related_to_uuid_of_type()
    grid_b_rels_crs_part = model.parts_list_related_to_uuid_of_type(
        model.uuid_for_part(grid_b_part), 'obj_LocalDepth3dCrs')
    assert isinstance(grid_b_rels_crs_part,
                      list) and len(grid_b_rels_crs_part) == 1
    assert grid_b_rels_crs_part[0] == crs.part
    grid_b_rels_uuids_ints = [bu.uuid_as_int(u) for u in grid_b_rels_uuids]
    assert all(a < b for a, b in zip(grid_b_rels_uuids_ints[:-1],
                                     grid_b_rels_uuids_ints[1:]))
    # test parts_list_of_type() with uuid specified
    singleton_list = model.parts_list_of_type(
        'obj_IjkGridRepresentation', uuid=model.uuid_for_part(grid_b_part))
    assert isinstance(singleton_list, list) and len(singleton_list) == 1
    assert singleton_list[0] == grid_b_part
    empty_list = model.parts_list_of_type('obj_IjkGridRepresentation',
                                          uuid=crs.uuid)
    assert isinstance(empty_list, list) and len(empty_list) == 0
    empty_list = model.parts_list_of_type('obj_IjkGridRepresentation',
                                          uuid=bu.new_uuid())
    assert isinstance(empty_list, list) and len(empty_list) == 0
    # test sorting
    grid_b_props_titles = model.titles(
        obj_type='ContinuousProperty',
        parts_list=[model.part_for_uuid(uuid) for uuid in grid_b_rels_uuids],
        sort_by='title')
    assert len(grid_b_props_titles) == 3
    assert all([
        a < b
        for (a, b) in zip(grid_b_props_titles[:-1], grid_b_props_titles[1:])
    ])
    # test filtering by extra metadata
    set_extra_metadata(grid_b, 'em_test', 'chai')
    grid_b.create_xml()
    set_extra_metadata(grid_c, 'em_test', 'oolong')
    grid_c.create_xml()
    assert model.root(extra={'em_test': 'espresso'}) is None
    assert bu.matching_uuids(grid_c.uuid,
                             model.uuid(extra={'em_test': 'oolong'}))
    # test list_of_parts()
    obj_parts = model.list_of_parts()
    all_parts = model.list_of_parts(only_objects=False)
    assert len(all_parts) > len(obj_parts)
    assert all([p in all_parts for p in obj_parts])
    assert not all([p in obj_parts for p in all_parts])
    # check exception is raised when multiple parts match criteria
    with pytest.raises(ValueError) as excinfo:
        part = model.part(obj_type='IjkGridRepresentation')