def marshal_objects(objects): """ Marshal objects using omero_marshal """ expected = [] for obj in objects: encoder = get_encoder(obj.__class__) expected.append(encoder.encode(obj)) return expected
def get(self, request, object_id, conn=None, **kwargs): """Simply GET a single Object and marshal it or 404 if not found.""" opts = self.get_opts(request) object_id = int(object_id) query, params, wrapper = conn.buildQuery(self.OMERO_TYPE, [object_id], opts=opts) # Allow subclasses to access the result object self.result = conn.getQueryService().findByQuery( query, params, conn.SERVICE_OPTS) if self.result is None: raise NotFoundError("%s %s not found" % (self.OMERO_TYPE, object_id)) encoder = get_encoder(self.result.__class__) marshalled = encoder.encode(self.result) # Optionally lookup child counts child_count = request.GET.get("childCount", False) == "true" if child_count and wrapper.LINK_CLASS: counts = get_child_counts(conn, wrapper.LINK_CLASS, [object_id]) ch_count = counts[object_id] if object_id in counts else 0 marshalled["omero:childCount"] = ch_count self.add_data(marshalled, request, conn, self.urls, **kwargs) return {"data": marshalled}
def test_base_decoder(self, roi): encoder = get_encoder(roi.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(roi) v = decoder.decode(v) self.assert_roi(v) self.assert_externalInfo(v.details.externalInfo)
def test_project_with_datasets_encoder(self, project_with_datasets): encoder = get_encoder(project_with_datasets.__class__) v = encoder.encode(project_with_datasets) assert v == { '@id': 1, '@type': '%s#Project' % OME_SCHEMA_URL, 'Name': 'the_name', 'Description': 'the_description', 'omero:details': { '@type': 'TBD#Details' }, 'Datasets': [{ '@id': 1, '@type': '%s#Dataset' % OME_SCHEMA_URL, 'Name': 'dataset_name_1', 'Description': 'dataset_description_1', 'omero:details': { '@type': 'TBD#Details' } }, { '@id': 2, '@type': '%s#Dataset' % OME_SCHEMA_URL, 'Name': 'dataset_name_2', 'Description': 'dataset_description_2', 'omero:details': { '@type': 'TBD#Details' } }] }
def test_roi_with_shapes_and_annotations(self, roi_with_shapes_and_annotations): encoder = get_encoder(roi_with_shapes_and_annotations.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(roi_with_shapes_and_annotations) v = decoder.decode(v) self.assert_roi_with_shapes(v, has_annotations=True)
def test_base_encoder_with_unloaded_details_children( self, roi_with_unloaded_details_children): encoder = get_encoder(roi_with_unloaded_details_children.__class__) v = encoder.encode(roi_with_unloaded_details_children) assert v == { '@id': 1L, '@type': 'http://www.openmicroscopy.org/Schemas/ROI/2015-01#ROI', 'Name': 'the_name', 'Description': 'the_description', 'omero:details': { '@type': 'TBD#Details', 'owner': { '@id': 1L, '@type': 'http://www.openmicroscopy.org/Schemas/OME/2015-01' '#Experimenter' }, 'group': { '@id': 1L, '@type': 'http://www.openmicroscopy.org/Schemas/OME/2015-01' '#ExperimenterGroup' }, 'permissions': { '@type': 'TBD#Permissions', 'canAnnotate': True, 'canDelete': True, 'canEdit': True, 'canLink': True, 'perm': 'rwrwrw' } } }
def test_project_decoder(self, project): encoder = get_encoder(project.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(project) v = decoder.decode(v) self.assert_project(v) assert v.sizeOfDatasetLinks() == 0
def test_encoder(self, polygon): encoder = get_encoder(polygon.__class__) v = encoder.encode(polygon) self.assert_shape(v) assert v['@id'] == 5L assert v['@type'] == '%s#Polygon' % ROI_SCHEMA_URL assert v['Points'] == '0,0 1,2 3,5'
def test_roi_with_shapes_and_annotations( self, roi_with_shapes_and_annotations): encoder = get_encoder(roi_with_shapes_and_annotations.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(roi_with_shapes_and_annotations) v = decoder.decode(v) self.assert_roi_with_shapes(v, has_annotations=True)
def test_decoder(self, mask): encoder = get_encoder(mask.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(mask) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 8
def eventContextMarshal(event_context): """ Marshals the omero::sys::EventContext as a dict. @param event_context: omero::sys::EventContext @return: Dict """ ctx = {} for a in [ "shareId", "sessionId", "sessionUuid", "userId", "userName", "sudoerId", "sudoerName", "groupId", "groupName", "isAdmin", "eventId", "eventType", "memberOfGroups", "leaderOfGroups", "adminPrivileges", ]: if hasattr(event_context, a): ctx[a] = unwrap(getattr(event_context, a)) perms = event_context.groupPermissions encoder = get_encoder(perms.__class__) ctx["groupPermissions"] = encoder.encode(perms) return ctx
def test_well_color_decoder(self, color, well): """Test different combinations of r, g, b, a.""" well.red = rint(color[0]) well.green = rint(color[1]) well.blue = rint(color[2]) well.alpha = rint(color[3]) encoder = get_encoder(well.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(well) # Check we get the expected Integer assert v.get('Color') == color[4] v = decoder.decode(v) # If red is None, all are None if color[0] is None: assert v.red is None assert v.green is None assert v.blue is None assert v.alpha is None elif color[3] is None: # alpha None -> 255 by default assert v.red.val == color[0] assert v.green.val == color[1] assert v.blue.val == color[2] assert v.alpha.val == 255 else: # Otherwise, all preserved assert v.red.val == color[0] assert v.green.val == color[1] assert v.blue.val == color[2] assert v.alpha.val == color[3]
def test_screen_decoder(self, screen): encoder = get_encoder(screen.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(screen) v = decoder.decode(v) self.assert_screen(v) assert v.sizeOfPlateLinks() == 0
def test_project_validation(self, user_A): """ Test to demonstrate details bug on encode->decode. Test illustrates the ValidationException we see when Project is encoded to dict then decoded back to Project and saved. No exception is seen if the original Project is simply saved without encode & decode OR if the details are unloaded before saving """ conn = get_connection(user_A) project = ProjectI() project.name = rstring('test_project_validation') project = conn.getUpdateService().saveAndReturnObject(project) # Saving original Project again is OK conn.getUpdateService().saveObject(project) # encode and decode before Save raises Validation Exception project_json = get_encoder(project.__class__).encode(project) decoder = get_decoder(project_json['@type']) p = decoder.decode(project_json) with pytest.raises(ValidationException): conn.getUpdateService().saveObject(p) p = decoder.decode(project_json) # Unloading details allows Save without exception p.unloadDetails() conn.getUpdateService().saveObject(p)
def test_project_with_datasets_encoder(self, project_with_datasets): encoder = get_encoder(project_with_datasets.__class__) v = encoder.encode(project_with_datasets) assert v == { "@id": 1L, "@type": "%s#Project" % OME_SCHEMA_URL, "Name": "the_name", "Description": "the_description", "omero:details": {"@type": "TBD#Details"}, "Datasets": [ { "@id": 1L, "@type": "%s#Dataset" % OME_SCHEMA_URL, "Name": "dataset_name_1", "Description": "dataset_description_1", "omero:details": {"@type": "TBD#Details"}, }, { "@id": 2L, "@type": "%s#Dataset" % OME_SCHEMA_URL, "Name": "dataset_name_2", "Description": "dataset_description_2", "omero:details": {"@type": "TBD#Details"}, }, ], }
def encode_well(self, obj): obj.details.owner.unloadDetails() obj.details.group.unloadDetails() obj.details.creationEvent.unloadDetails() obj.details.creationEvent.type.unloadDetails() obj.details.updateEvent.unloadDetails() obj.details.updateEvent.type.unloadDetails() if obj.isWellSamplesLoaded() and obj.sizeOfWellSamples() > 0: for wellsample in obj.copyWellSamples(): wellsample.unloadDetails() image = wellsample.image if image is not None and image.isLoaded(): image.unloadDetails() self.unload_annotation_details(image) if image.isPixelsLoaded(): pixels = image.getPrimaryPixels() pixels.unloadDetails() if pixels.isChannelsLoaded(): for channel in pixels.copyChannels(): channel.unloadDetails() self.unload_annotation_details(channel) self.unload_annotation_details(obj) encoder = get_encoder(obj.__class__) v = encoder.encode(obj) return v
def test_encoder(self, polygon): encoder = get_encoder(polygon.__class__) v = encoder.encode(polygon) self.assert_shape(v) assert v['@id'] == 5 assert v['@type'] == '%s#Polygon' % ROI_SCHEMA_URL assert v['Points'] == '0,0 1,2 3,5'
def test_project_with_dataset_encoder(self, project_with_datasets): encoder = get_encoder(project_with_datasets.__class__) v = encoder.encode(project_with_datasets) assert v == { '@id': 1L, '@type': 'http://www.openmicroscopy.org/Schemas/OME/2015-01#Project', 'Name': 'the_name', 'Description': 'the_description', 'omero:details': {'@type': 'TBD#Details'}, 'Datasets': [{ '@id': 1L, '@type': 'http://www.openmicroscopy.org/Schemas/OME/2015-01' '#Dataset', 'Name': 'dataset_name_1', 'Description': 'dataset_description_1', 'omero:details': {'@type': 'TBD#Details'} }, { '@id': 2L, '@type': 'http://www.openmicroscopy.org/Schemas/OME/2015-01' '#Dataset', 'Name': 'dataset_name_2', 'Description': 'dataset_description_2', 'omero:details': {'@type': 'TBD#Details'} }] }
def rois_by_plane(request, image_id, the_z, the_t, z_end=None, t_end=None, conn=None, **kwargs): """ Get ROIs with all Shapes where any Shapes are on the given Z and T plane. Includes Shapes where Z or T are null. If z_end or t_end are not None, we filter by any shape within the range (inclusive of z/t_end) """ query_service = conn.getQueryService() params = omero.sys.ParametersI() params.addId(image_id) filter = omero.sys.Filter() filter.offset = rint(request.GET.get("offset", 0)) limit = min(MAX_LIMIT, long(request.GET.get("limit", MAX_LIMIT))) filter.limit = rint(limit) params.theFilter = filter where_z = "shapes.theZ = %s or shapes.theZ is null" % the_z where_t = "shapes.theT = %s or shapes.theT is null" % the_t if z_end is not None: where_z = """(shapes.theZ >= %s and shapes.theZ <= %s) or shapes.theZ is null""" % (the_z, z_end) if t_end is not None: where_t = """(shapes.theT >= %s and shapes.theT <= %s) or shapes.theT is null""" % (the_t, t_end) filter_query = """ select distinct(roi) from Roi roi join roi.shapes as shapes where (%s) and (%s) and roi.image.id = :id """ % (where_z, where_t) # We want to load ALL shapes for the ROIs (omero-marshal fails if # any shapes are None) but we want to filter by Shape so we use an inner # query to get the ROI IDs filtered by Shape. query = """ select roi from Roi roi join fetch roi.details.owner join fetch roi.details.creationEvent left outer join fetch roi.shapes where roi.id in (%s) order by roi.id """ % (filter_query) rois = query_service.findAllByQuery(query, params, conn.SERVICE_OPTS) marshalled = [] for r in rois: encoder = omero_marshal.get_encoder(r.__class__) if encoder is not None: marshalled.append(encoder.encode(r)) # Modify query to only select count() and NOT paginate query = filter_query.replace("distinct(roi)", "count(distinct roi)") params = omero.sys.ParametersI() params.addId(image_id) result = query_service.projection(query, params, conn.SERVICE_OPTS) meta = {"totalCount": result[0][0].val} return JsonResponse({'data': marshalled, 'meta': meta})
def test_base_encoder(self, roi): encoder = get_encoder(roi.__class__) v = encoder.encode(roi) assert v == { '@id': 1L, '@type': '%s#ROI' % ROI_SCHEMA_URL, 'Name': 'the_name', 'Description': 'the_description', 'omero:details': { '@type': 'TBD#Details', 'group': { '@id': 1L, '@type': '%s#ExperimenterGroup' % OME_SCHEMA_URL, 'Description': 'the_description', 'Name': 'the_name', 'omero:details': { '@type': 'TBD#Details' } }, 'owner': { '@id': 1L, '@type': '%s#Experimenter' % OME_SCHEMA_URL, 'Email': 'the_email', 'FirstName': 'the_firstName', 'Institution': 'the_institution', 'LastName': 'the_lastName', 'MiddleName': 'the_middleName', 'UserName': '******', 'omero:details': { '@type': 'TBD#Details' } }, 'permissions': { '@type': 'TBD#Permissions', 'canAnnotate': True, 'canDelete': True, 'canEdit': True, 'canLink': True, 'perm': 'rwrwrw', 'isGroupAnnotate': True, 'isGroupRead': True, 'isGroupWrite': True, 'isUserRead': True, 'isUserWrite': True, 'isWorldRead': True, 'isWorldWrite': True }, 'externalInfo': { '@type': 'TBD#ExternalInfo', 'EntityId': 123, 'EntityType': 'test', 'Lsid': 'ABCDEF', 'Uuid': 'f90a1fd5-275c-4d14-82b3-87b5ef0f07de', 'omero:details': { '@type': 'TBD#Details' }, }, } }
def test_encoder(self, label): encoder = get_encoder(label.__class__) v = encoder.encode(label) self.assert_shape(v) assert v['@id'] == 7 assert v['@type'] == '%s#Label' % ROI_SCHEMA_URL assert v['X'] == 1.0 assert v['Y'] == 2.0
def test_encoder(self, point): encoder = get_encoder(point.__class__) v = encoder.encode(point) self.assert_shape(v) assert v['@id'] == 3 assert v['@type'] == '%s#Point' % ROI_SCHEMA_URL assert v['X'] == 1.0 assert v['Y'] == 2.0
def test_decoder(self, polygon): encoder = get_encoder(polygon.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(polygon) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 5L assert v.points.val == '0,0 1,2 3,5'
def test_encoder(self, polygon): encoder = get_encoder(polygon.__class__) v = encoder.encode(polygon) self.assert_shape(v) assert v['@id'] == 5L assert v['@type'] == \ 'http://www.openmicroscopy.org/Schemas/ROI/2015-01#Polygon' assert v['Points'] == '0,0 1,2 3,5'
def test_encoder(self, label): encoder = get_encoder(label.__class__) v = encoder.encode(label) self.assert_shape(v) assert v['@id'] == 7L assert v['@type'] == '%s#Label' % ROI_SCHEMA_URL assert v['X'] == 1.0 assert v['Y'] == 2.0
def test_encoder(self, point): encoder = get_encoder(point.__class__) v = encoder.encode(point) self.assert_shape(v) assert v['@id'] == 3L assert v['@type'] == '%s#Point' % ROI_SCHEMA_URL assert v['X'] == 1.0 assert v['Y'] == 2.0
def test_encoder(self, label): encoder = get_encoder(label.__class__) v = encoder.encode(label) self.assert_shape(v) assert v['@id'] == 7L assert v['@type'] == \ 'http://www.openmicroscopy.org/Schemas/ROI/2015-01#Label' assert v['X'] == 1.0 assert v['Y'] == 2.0
def test_encoder(self, point): encoder = get_encoder(point.__class__) v = encoder.encode(point) self.assert_shape(v) assert v['@id'] == 3L assert v['@type'] == \ 'http://www.openmicroscopy.org/Schemas/ROI/2015-01#Point' assert v['X'] == 1.0 assert v['Y'] == 2.0
def test_details_encoder(self, details): encoder = get_encoder(details.__class__) v = encoder.encode(details) assert v == { '@type': 'TBD#Details', 'permissions': self.permissions_json(), 'owner': self.experimenter_json(), 'group': self.experimenter_group_json() }
def test_permissions_cannot_delete(self, permissions_cannot_delete): encoder = get_encoder(permissions_cannot_delete.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(permissions_cannot_delete) v = decoder.decode(v) assert v.canLink() assert v.canEdit() assert not v.canDelete() assert v.canAnnotate()
def test_encoder(self, polyline): encoder = get_encoder(polyline.__class__) v = encoder.encode(polyline) self.assert_shape(v) assert v['@id'] == 4L assert v['@type'] == '%s#Polyline' % ROI_SCHEMA_URL assert v['Points'] == '0,0 1,2 3,5' if SCHEMA_VERSION != '2015-01': assert v['MarkerStart'] == 'Arrow' assert v['MarkerEnd'] == 'Arrow'
def test_base_encoder_unloaded_details(self, roi): roi.unloadDetails() encoder = get_encoder(roi.__class__) v = encoder.encode(roi) assert v == { '@id': 1L, '@type': '%s#ROI' % ROI_SCHEMA_URL, 'Name': 'the_name', 'Description': 'the_description' }
def test_encoder(self, mask): encoder = get_encoder(mask.__class__) v = encoder.encode(mask) self.assert_shape(v) assert v['@id'] == 8 assert v['@type'] == '%s#Mask' % ROI_SCHEMA_URL assert v['X'] == 0.0 assert v['Y'] == 0.0 assert v['Width'] == 1.0 assert v['Height'] == 2.0
def test_project_encoder(self, project): encoder = get_encoder(project.__class__) v = encoder.encode(project) assert v == { "@id": 1L, "@type": "%s#Project" % OME_SCHEMA_URL, "Name": "the_name", "Description": "the_description", "omero:details": {"@type": "TBD#Details"}, }
def test_project_encoder(self, project): encoder = get_encoder(project.__class__) v = encoder.encode(project) assert v == { '@id': 1L, '@type': '%s#Project' % OME_SCHEMA_URL, 'Name': 'the_name', 'Description': 'the_description', 'omero:details': {'@type': 'TBD#Details'} }
def test_encoder(self, polyline): encoder = get_encoder(polyline.__class__) v = encoder.encode(polyline) self.assert_shape(v) assert v['@id'] == 4 assert v['@type'] == '%s#Polyline' % ROI_SCHEMA_URL assert v['Points'] == '0,0 1,2 3,5' if SCHEMA_VERSION != '2015-01': assert v['MarkerStart'] == 'Arrow' assert v['MarkerEnd'] == 'Arrow'
def test_base_encoder(self, roi): encoder = get_encoder(roi.__class__) v = encoder.encode(roi) assert v == { '@id': 1L, '@type': '%s#ROI' % ROI_SCHEMA_URL, 'Name': 'the_name', 'Description': 'the_description', 'omero:details': { '@type': 'TBD#Details', 'group': { '@id': 1L, '@type': '%s#ExperimenterGroup' % OME_SCHEMA_URL, 'Description': 'the_description', 'Name': 'the_name', 'omero:details': {'@type': 'TBD#Details'} }, 'owner': { '@id': 1L, '@type': '%s#Experimenter' % OME_SCHEMA_URL, 'Email': 'the_email', 'FirstName': 'the_firstName', 'Institution': 'the_institution', 'LastName': 'the_lastName', 'MiddleName': 'the_middleName', 'UserName': '******', 'omero:details': {'@type': 'TBD#Details'} }, 'permissions': { '@type': 'TBD#Permissions', 'canAnnotate': True, 'canDelete': True, 'canEdit': True, 'canLink': True, 'perm': 'rwrwrw', 'isGroupAnnotate': True, 'isGroupRead': True, 'isGroupWrite': True, 'isUserRead': True, 'isUserWrite': True, 'isWorldRead': True, 'isWorldWrite': True }, 'externalInfo': { '@type': 'TBD#ExternalInfo', 'EntityId': 123, 'EntityType': 'test', 'Lsid': 'ABCDEF', 'Uuid': 'f90a1fd5-275c-4d14-82b3-87b5ef0f07de', 'omero:details': { '@type': 'TBD#Details' }, }, } }
def test_decoder(self, point): encoder = get_encoder(point.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(point) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 3L assert v.cx.__class__ is RDoubleI assert v.cx.val == 1.0 assert v.cy.__class__ is RDoubleI assert v.cy.val == 2.0
def test_project_with_datasets_and_images_decoder( self, project_with_datasets_and_images): encoder = get_encoder(project_with_datasets_and_images.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(project_with_datasets_and_images) v = decoder.decode(v) assert v.id.val == 1L assert v.name.val == 'the_name' assert v.description.val == 'the_description' assert v.sizeOfDatasetLinks() == 2 dataset_1, dataset_2 = v.linkedDatasetList() assert dataset_1.id.val == 1L assert dataset_1.name.val == 'dataset_name_1' assert dataset_1.description.val == 'dataset_description_1' image_1, image_2 = dataset_1.linkedImageList() assert image_1.id.val == 1L assert image_1.acquisitionDate.val == 1L assert image_1.archived.val is False assert image_1.description.val == 'image_description_1' assert image_1.name.val == 'image_name_1' assert image_1.partial.val is False assert image_1.format.id.val == 1L assert image_1.format.value.val == 'PNG' assert image_2.id.val == 2L assert image_2.acquisitionDate.val == 1L assert image_2.archived.val is False assert image_2.description.val == 'image_description_2' assert image_2.name.val == 'image_name_2' assert image_2.partial.val is False assert image_2.format.id.val == 1L assert image_2.format.value.val == 'PNG' assert dataset_2.id.val == 2L assert dataset_2.name.val == 'dataset_name_2' assert dataset_2.description.val == 'dataset_description_2' image_3, image_4 = dataset_2.linkedImageList() assert image_3.id.val == 3L assert image_3.acquisitionDate.val == 1L assert image_3.archived.val is False assert image_3.description.val == 'image_description_3' assert image_3.name.val == 'image_name_3' assert image_3.partial.val is False assert image_3.format.id.val == 1L assert image_3.format.value.val == 'PNG' assert image_4.id.val == 4L assert image_4.acquisitionDate.val == 1L assert image_4.archived.val is False assert image_4.description.val == 'image_description_4' assert image_4.name.val == 'image_name_4' assert image_4.partial.val is False assert image_4.format.id.val == 1L assert image_4.format.value.val == 'PNG'
def test_decoder(self, polyline): encoder = get_encoder(polyline.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(polyline) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 4L assert v.points.val == '0,0 1,2 3,5' if SCHEMA_VERSION != '2015-01': assert v.markerStart.val == 'Arrow' assert v.markerEnd.val == 'Arrow'
def test_decoder(self, label): encoder = get_encoder(label.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(label) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 7L assert v.x.__class__ is RDoubleI assert v.x.val == 1.0 assert v.y.__class__ is RDoubleI assert v.y.val == 2.0
def test_decoder(self, opt_unit_label): encoder = get_encoder(opt_unit_label.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(opt_unit_label) v = decoder.decode(v) self.assert_shape(v, has_unit_information=False) assert v.id.val == 7L assert v.x.__class__ is RDoubleI assert v.x.val == 1.0 assert v.y.__class__ is RDoubleI assert v.y.val == 2.0
def test_screen_with_plates_decoder(self, screen_with_plates): encoder = get_encoder(screen_with_plates.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(screen_with_plates) v = decoder.decode(v) self.assert_screen(v) assert v.id.val == 4L assert v.sizeOfPlateLinks() == 2 plate_1, plate_2 = v.linkedPlateList() self.assert_plate(plate_1, 5L) self.assert_plate(plate_2, 6L)
def test_project_encoder(self, project): encoder = get_encoder(project.__class__) v = encoder.encode(project) assert v == { '@id': 1L, '@type': 'http://www.openmicroscopy.org/Schemas/OME/2015-01#Project', 'Name': 'the_name', 'Description': 'the_description', 'omero:details': {'@type': 'TBD#Details'} }
def test_encoder(self, line): encoder = get_encoder(line.__class__) v = encoder.encode(line) self.assert_shape(v) assert v['@id'] == 6L assert v['@type'] == \ 'http://www.openmicroscopy.org/Schemas/ROI/2015-01#Line' assert v['X1'] == 0.0 assert v['Y1'] == 0.0 assert v['X2'] == 1.0 assert v['Y2'] == 2.0