def test_annotateAndAnnotated(self):
        # There's a bug somewhere which means annotating the table with the
        # version annotation, then using the table as a FileAnnotation on
        # an object, causes the version annotation to be lost
        # Closing and reopening the table seems to work (see
        # FeatureTable.createTable)
        cli, sess = self.create_client()
        ft = FeatureTable(client=cli, tableName=self.tableName)
        fts = ['a [0]', 'a [1]', 'b [0]']
        ft.createTable(fts, version=self.version)
        tid = ft.tc.tableId

        self.assertEqual(self.version, unwrapVersion(ft.versiontag))

        vertag = WndcharmStorage.getVersion(ft.conn, 'OriginalFile', tid)
        self.assertEqual(self.version, unwrapVersion(vertag))

        p = omero.model.ProjectI()
        p.setName(wrap('tmp'))
        p = self.sess.getUpdateService().saveAndReturnObject(p)
        pid = unwrap(p.getId())
        p = ft.conn.getObject('Project', pid)
        WndcharmStorage.addFileAnnotationTo(ft.tc, p)

        vertag = WndcharmStorage.getVersion(ft.conn, 'OriginalFile', tid)
        self.assertEqual(self.version, unwrapVersion(vertag))
        self.delete('/Project', pid)
        self.delete('/OriginalFile', tid)
    def test_getClassifierTagSet(self):
        pid = self.create_project('addTagTo')
        p = self.conn.getObject('Project', pid)

        classifierName = 'getClassifierTagSet'
        instanceName = str(uuid.uuid1())
        labels = ['A', 'B']
        WndcharmStorage.createClassifierTagSet(
            self.conn, classifierName, instanceName, labels, p)

        tagset = WndcharmStorage.getClassifierTagSet(
            classifierName, instanceName, p)
        self.assertIsNotNone(tagset)
        self.assertEqual(tagset.getNs(),
                         omero.constants.metadata.NSINSIGHTTAGSET)

        tags = list(self.conn.getObjects('TagAnnotation', attributes={
                    'ns': classifierName + '/' + instanceName}))
        self.assertEqual(len(tags), 2)
        self.assertEqual(sorted([t.getValue() for t in tags]), labels)

        for t in tags:
            self.assertEqual(t.getParent(), tagset)

        # Delete the project and tagset but not the child tags
        self.delete('/Project', pid)
        self.delete('/Annotation', [t.id for t in tags])
    def test_deleteTags(self):
        us = self.conn.getUpdateService()

        tagSet = omero.model.TagAnnotationI()
        classifierName = 'getClassifierTagSet'
        instanceName = str(uuid.uuid1())
        instanceNs = classifierName + '/' + instanceName

        tagSet.setTextValue(wrap(instanceNs));
        tagSet.setNs(wrap(omero.constants.metadata.NSINSIGHTTAGSET));
        tagSet = us.saveAndReturnObject(tagSet);

        tag = omero.model.TagAnnotationI()
        tag.setTextValue(wrap(str(uuid.uuid1())));
        tag.setNs(wrap(instanceNs));
        tag = us.saveAndReturnObject(tag);

        link = omero.model.AnnotationAnnotationLinkI()
        link.setChild(tag)
        link.setParent(tagSet)
        link = us.saveAndReturnObject(link)

        self.assertIsNotNone(self.getObject('TagAnnotation', tagSet.id))
        self.assertIsNotNone(self.getObject('TagAnnotation', tag.id))
        self.assertIsNotNone(self.getObject(
                'AnnotationAnnotationLink', link.id))

        WndcharmStorage.deleteTags(self.conn, tagSet)

        self.assertIsNone(self.getObject('TagAnnotation', tagSet.id))
        self.assertIsNone(self.getObject('TagAnnotation', tag.id))
        self.assertIsNone(self.getObject(
                'AnnotationAnnotationLink', link.id))
    def test_unlinkAnnotations(self):
        us = self.conn.getUpdateService()

        f = omero.model.OriginalFileI()
        f.setName(wrap(str(uuid.uuid1())))
        f.setPath(wrap(str(uuid.uuid1())))
        f = self.sess.getUpdateService().saveAndReturnObject(f)

        tag = omero.model.TagAnnotationI()
        tag.setTextValue(wrap(str(uuid.uuid1())));
        tag = us.saveAndReturnObject(tag);

        link = omero.model.OriginalFileAnnotationLinkI()
        link.setChild(tag)
        link.setParent(f)
        link = us.saveAndReturnObject(link)

        self.assertIsNotNone(self.getObject('TagAnnotation', tag.id))
        self.assertIsNotNone(self.getObject('OriginalFile', f.id))
        self.assertIsNotNone(self.getObject(
                'OriginalFileAnnotationLink', link.id))

        file = self.conn.getObject('OriginalFile', unwrap(f.id))
        WndcharmStorage.unlinkAnnotations(self.conn, file)

        self.assertIsNotNone(self.getObject('TagAnnotation', tag.id))
        self.assertIsNotNone(self.getObject('OriginalFile', file.id))
        self.assertIsNone(self.getObject('OriginalFileAnnotationLink', link.id))

        self.delete('/OriginalFile', unwrap(f.id))
        self.delete('/Annotation', unwrap(tag.id))
    def test_addCommentTo(self):
        pid = self.create_project('addCommentTo')
        txt = 'This is a comment'
        WndcharmStorage.addCommentTo(self.conn, txt, 'Project', pid)

        proj = self.conn.getObject('Project', pid)
        a = proj.getAnnotation()
        self.assertIsInstance(a._obj, omero.model.CommentAnnotation)
        self.assertEqual(unwrap(a.getTextValue()), txt)

        self.delete('/Project', pid)
    def test_getAttachedTableFile(self):
        pid = self.create_project('addFileAnnotationTo')
        p = self.conn.getObject('Project', pid)
        tc = self.Tc(self.conn)
        fid = unwrap(tc.table.getOriginalFile().getId())

        self.assertIsNone(WndcharmStorage.getAttachedTableFile(tc, p))

        WndcharmStorage.addFileAnnotationTo(tc, p)
        self.assertIsNotNone(WndcharmStorage.getAttachedTableFile(tc, p))

        tc.close()
        self.delete('/Project', pid)
    def test_addFileAnnotationTo(self):
        pid = self.create_project('addFileAnnotationTo')
        p = self.conn.getObject('Project', pid)
        tc = self.Tc(self.conn)
        fid = unwrap(tc.table.getOriginalFile().getId())
        WndcharmStorage.addFileAnnotationTo(tc, p)

        proj = self.conn.getObject('Project', pid)
        a = proj.getAnnotation()
        self.assertIsInstance(a._obj, omero.model.FileAnnotation)
        self.assertEqual(unwrap(a.getFile().getId()), fid)

        tc.close()
        self.delete('/Project', pid)
    def test_addTagTo(self):
        pid = self.create_project('addTagTo')
        txt = 'This is a tag'
        tid = self.create_tag(txt)
        tag = omero.model.TagAnnotationI(tid, False)
        WndcharmStorage.addTagTo(self.conn, tag, 'Project', pid)

        proj = self.conn.getObject('Project', pid)
        a = proj.getAnnotation()
        self.assertIsInstance(a._obj, omero.model.TagAnnotation)
        self.assertEqual(unwrap(a.getTextValue()), txt)
        self.assertEqual(unwrap(a.getId()), tid)

        self.delete('/Project', pid)
    def checkClassifierTablesVersion(self, ct):
        self.assertEqual(unwrapVersion(ct.versiontag), self.version)

        verF = WndcharmStorage.getVersion(
            ct.tcF.conn, 'OriginalFile', ct.tcF.tableId)
        self.assertEqual(unwrapVersion(verF), self.version)

        verW = WndcharmStorage.getVersion(
            ct.tcW.conn, 'OriginalFile', ct.tcW.tableId)
        self.assertEqual(unwrapVersion(verW), self.version)

        verL = WndcharmStorage.getVersion(
            ct.tcL.conn, 'OriginalFile', ct.tcL.tableId)
        self.assertEqual(unwrapVersion(verL), self.version)
 def test_featureSizes(self):
     ftsz = WndcharmStorage.featureSizes(['a b [12]', 'c d [3]', 'a b [14]'])
     self.assertEqual(len(ftsz.keys()), 2)
     self.assertIn('a b', ftsz)
     self.assertIn('c d', ftsz)
     self.assertEqual(ftsz['a b'], 15)
     self.assertEqual(ftsz['c d'], 4)
    def test_addTextFileAnnotationTo(self):
        pid = self.create_project('addTextFileAnnotationTo')
        txt = 'This is\nsome text.'
        filename = 'addTextFileAnnotationTo.txt'
        description = 'Description of addTextFileAnnotationTo.txt'
        WndcharmStorage.addTextFileAnnotationTo(
            self.conn, txt, 'Project', pid, filename, description)

        p = self.conn.getObject('Project', pid)
        anns = list(p.listAnnotations())
        self.assertEqual(len(anns), 1)
        a = anns[0]

        self.assertEqual(a.getFileName(), filename)
        self.assertEqual(a.getDescription(), description)
        self.assertEqual(a.getFileSize(), len(txt))
        self.assertEqual(list(a.getFileInChunks())[0], txt)

        self.delete('/Annotation', a.getId())
        self.delete('/Project', pid)
    def test_createTable(self):
        tid = self.create_table()
        ft = FeatureTable(client=self.cli, tableName=self.tableName)
        ft.openTable(tid)
        self.assertEqual(self.version, unwrapVersion(ft.versiontag))

        vertag = WndcharmStorage.getVersion(ft.conn, 'OriginalFile', tid)
        self.assertEqual(self.version, unwrapVersion(vertag))

        headers = ft.tc.getHeaders()
        self.assertEqual(len(headers), 3)
        self.assertEqual([h.name for h in headers], ['id', 'a', 'b'])
        self.assertEqual([h.size for h in headers[1:]], [2, 1])
    def test_createClassifierTagSet(self):
        classifierName = 'createClassifierTagSet'
        instanceName = str(uuid.uuid1())
        labels = ['A', 'B']
        WndcharmStorage.createClassifierTagSet(
            self.conn, classifierName, instanceName, labels)

        tagset = list(self.conn.getObjects('TagAnnotation', attributes={
                    'textValue': classifierName + '/' + instanceName,
                    'ns': omero.constants.metadata.NSINSIGHTTAGSET}))
        self.assertEqual(len(tagset), 1)
        tagset = tagset[0]

        tags = list(self.conn.getObjects('TagAnnotation', attributes={
                    'ns': classifierName + '/' + instanceName}))
        self.assertEqual(len(tags), 2)
        self.assertEqual(sorted([t.getValue() for t in tags]), labels)

        for t in tags:
            self.assertEqual(t.getParent(), tagset)

        self.delete('/Annotation', [tagset.getId()] + [t.id for t in tags])
    def test_getVersion(self):
        version = str(uuid.uuid1())
        tableid = self.create_table()
        file = omero.model.OriginalFileI(tableid, False)
        version = str(uuid.uuid1())
        tagid = self.create_tag(version, WndcharmStorage.WNDCHARM_VERSION_NAMESPACE)
        tag = omero.model.TagAnnotationI(tagid, False)
        link = omero.model.OriginalFileAnnotationLinkI()
        link.setChild(tag)
        link.setParent(file)
        link = self.sess.getUpdateService().saveAndReturnObject(link)

        retrieved = WndcharmStorage.getVersion(
            self.conn, 'OriginalFile', unwrap(file.getId()))
        self.assertEqual(unwrapVersion(retrieved), version)
    def test_assertVersionMatch(self):
        class MockVersion:
            def __init__(self, version):
                self.version = version

            def getTextValue(self):
                return self.version

        v1 = MockVersion('12.345')
        v2 = MockVersion('12.345')
        v3 = MockVersion('543.21')

        WndcharmStorage.assertVersionMatch(v1, v2)
        WndcharmStorage.assertVersionMatch(v1, v2.getTextValue())
        WndcharmStorage.assertVersionMatch(v1.getTextValue(), v2)
        self.assertRaises(
            WndcharmStorage.WndcharmStorageError, WndcharmStorage.assertVersionMatch,
            v1, v3)
    def test_versionAnnotation(self):
        version = str(uuid.uuid1())
        created = WndcharmStorage.createVersionAnnotation(self.conn, version)
        retrieved = WndcharmStorage.getVersionAnnotation(self.conn, version)

        self.assertEqual(unwrap(created.getNs()),
                         WndcharmStorage.WNDCHARM_VERSION_NAMESPACE)
        self.assertEqual(unwrapVersion(created), version)
        self.assertEqual(unwrap(retrieved.getNs()),
                         WndcharmStorage.WNDCHARM_VERSION_NAMESPACE)
        self.assertEqual(unwrapVersion(retrieved), version)

        pid = self.create_project('versionAnnotation')
        self.assertIsNone(WndcharmStorage.getVersion(self.conn, 'Project', pid))

        WndcharmStorage.addTagTo(self.conn, retrieved, 'Project', pid)
        a = WndcharmStorage.getVersion(self.conn, 'Project', pid)
        self.assertEqual(unwrap(a.getNs()),
                         WndcharmStorage.WNDCHARM_VERSION_NAMESPACE)
        self.assertEqual(unwrapVersion(a), version)

        self.delete('/Project', pid)
 def test_insert_channel_name(self):
     r = WndcharmStorage.insert_channel_name('a (b ()) [3]', 'ch')
     self.assertEqual(r, 'a (b (ch)) [3]')
 def test_datasetGenerator(self):
     WndcharmStorage.datasetGenerator(conn, dataType, ids)
 def test_parseFeatureName(self):
     r = WndcharmStorage.parseFeatureName('a b [321]')
     self.assertEqual(len(r), 2)
     self.assertEqual(r[0], 'a b')
     self.assertEqual(r[1], 321)
 def test_createFeatureName(self):
     r = WndcharmStorage.createFeatureName('a b', 321)
     self.assertEqual(r, 'a b [321]')