from benderjab import rpc
-def runfolder_validate(fname):
- """
- Return True if fname looks like a runfolder name
- """
- if re.match("^[0-9]{6}_[-A-Za-z0-9_]*$", fname):
- return True
- else:
- return False
+from htsworkflow.automation.solexa import is_runfolder
class rsync(object):
def __init__(self, sources, dest, pwfile):
self.rsync.poll()
# see if we're still copying
- if runfolder_validate(runDir):
+ if is_runfolder(runDir):
logging.info("recevied sequencing finshed for %s" % (runDir))
self.pending.append(runDir)
self.startCopy()
--- /dev/null
+"""Utilities to help process solexa/illumina runfolders
+"""
+import os
+import re
+
+def is_runfolder(name):
+ """
+ Is it a runfolder?
+
+ >>> print is_runfolder('090630_HWUSI-EAS999_0006_30LNFAAXX')
+ True
+ >>> print is_runfolder('hello')
+ False
+ """
+ if re.match("^[0-9]{6}_[-A-Za-z0-9_]*$", name):
+ return True
+ else:
+ return False
+
+def get_top_dir(root, path):
+ """
+ Return the directory in path that is a subdirectory of root.
+ e.g.
+
+ >>> print get_top_dir('/a/b/c', '/a/b/c/d/e/f')
+ d
+ >>> print get_top_dir('/a/b/c/', '/a/b/c/d/e/f')
+ d
+ >>> print get_top_dir('/a/b/c', '/g/e/f')
+ None
+ >>> print get_top_dir('/a/b/c', '/a/b/c')
+ <BLANKLINE>
+ """
+ if path.startswith(root):
+ subpath = path[len(root):]
+ if subpath.startswith('/'):
+ subpath = subpath[1:]
+ return subpath.split(os.path.sep)[0]
+ else:
+ return None
+
import time
from htsworkflow.util import mount
+from htsworkflow.automation.solexa import is_runfolder, get_top_dir
# this uses pyinotify
import pyinotify
from benderjab import rpc
-def is_runfolder(name):
- """
- Is it a runfolder?
-
- >>> print is_runfolder('090630_HWUSI-EAS999_0006_30LNFAAXX')
- True
- >>> print is_runfolder('hello')
- False
- """
- if re.match("[0-9]{6}_.*", name):
- return True
- else:
- return False
-
-def get_top_dir(root, path):
- """
- Return the directory in path that is a subdirectory of root.
- e.g.
-
- >>> print get_top_dir('/a/b/c', '/a/b/c/d/e/f')
- d
- >>> print get_top_dir('/a/b/c/', '/a/b/c/d/e/f')
- d
- >>> print get_top_dir('/a/b/c', '/g/e/f')
- None
- >>> print get_top_dir('/a/b/c', '/a/b/c')
- <BLANKLINE>
- """
- if path.startswith(root):
- subpath = path[len(root):]
- if subpath.startswith('/'):
- subpath = subpath[1:]
- return subpath.split(os.path.sep)[0]
- else:
- return None
class WatcherEvent(object):
"""
import os
-from htsworkflow.automation.copier import runfolder_validate
+from htsworkflow.automation.solexa import is_runfolder
def extract_runfolder_path(watchdir, event):
runfolder_path = watchdir
fragments = path[len(watchdir):].split(os.path.sep)
for f in fragments:
runfolder_path = os.path.join(runfolder_path, f)
- if runfolder_validate(f):
+ if is_runfolder(f):
return runfolder_path
return None
--- /dev/null
+
+import unittest
+
+from htsworkflow.automation import solexa
+
+class testSolexaRunfolderUtils(unittest.TestCase):
+ def test_is_runfolder(self):
+ self.failUnlessEqual(solexa.is_runfolder(""), False)
+ self.failUnlessEqual(solexa.is_runfolder("1345_23"), False)
+ self.failUnlessEqual(solexa.is_runfolder("123456_asdf-$23'"), False)
+ self.failUnlessEqual(solexa.is_runfolder("123456_USI-EAS44"), True)
+ self.failUnlessEqual(solexa.is_runfolder("123456_USI-EAS44 "), False)
+
+
+ def test_get_top_dir(self):
+ test_data = [ # root, path, response
+ ('/a/b/c', '/a/b/c/d/e/f', 'd'),
+ ('/a/b/c/', '/a/b/c/d/e/f', 'd'),
+ ('/a/b/c', '/g/e/f', None),
+ ('/a/b/c', '/a/b/c', ''),
+ ]
+
+ for root, path, response in test_data:
+ self.failUnlessEqual(solexa.get_top_dir(root, path), response)
+
+def suite():
+ return unittest.makeSuite(testSolexaRunfolderUtils, 'test')
+
+if __name__ == "__main__":
+ unittest.main(defaultTest="suite")
+
from StringIO import StringIO
from htsworkflow.automation import copier
+from htsworkflow.automation.solexa import is_runfolder
-class testCopier(unittest.TestCase):
- def test_runfolder_validate(self):
- self.failUnlessEqual(copier.runfolder_validate(""), False)
- self.failUnlessEqual(copier.runfolder_validate("1345_23"), False)
- self.failUnlessEqual(copier.runfolder_validate("123456_asdf-$23'"), False)
- self.failUnlessEqual(copier.runfolder_validate("123456_USI-EAS44"), True)
- self.failUnlessEqual(copier.runfolder_validate("123456_USI-EAS44 "), False)
-
+class testCopier(unittest.TestCase):
def test_empty_config(self):
cfg = StringIO("""[fake]
something: unrelated