annotate toolfactory/toolwatcher.py @ 3:1c652687a08f draft default tip

Uploaded
author fubar
date Fri, 30 Apr 2021 07:06:57 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
1c652687a08f Uploaded
fubar
parents:
diff changeset
1 #!/usr/bin/python
1c652687a08f Uploaded
fubar
parents:
diff changeset
2 from datetime import datetime, timedelta
1c652687a08f Uploaded
fubar
parents:
diff changeset
3 from io import BytesIO as BIO
1c652687a08f Uploaded
fubar
parents:
diff changeset
4 import logging
1c652687a08f Uploaded
fubar
parents:
diff changeset
5 import os
1c652687a08f Uploaded
fubar
parents:
diff changeset
6 import subprocess
1c652687a08f Uploaded
fubar
parents:
diff changeset
7 import tarfile
1c652687a08f Uploaded
fubar
parents:
diff changeset
8 import time
1c652687a08f Uploaded
fubar
parents:
diff changeset
9 from watchdog.observers import Observer
1c652687a08f Uploaded
fubar
parents:
diff changeset
10 from watchdog.events import FileSystemEventHandler
1c652687a08f Uploaded
fubar
parents:
diff changeset
11 from watchdog.events import PatternMatchingEventHandler
1c652687a08f Uploaded
fubar
parents:
diff changeset
12
1c652687a08f Uploaded
fubar
parents:
diff changeset
13 class ToolHandler(PatternMatchingEventHandler):
1c652687a08f Uploaded
fubar
parents:
diff changeset
14
1c652687a08f Uploaded
fubar
parents:
diff changeset
15 def __init__(self, watchme):
1c652687a08f Uploaded
fubar
parents:
diff changeset
16 PatternMatchingEventHandler.__init__(self, patterns=['*.xml'],
1c652687a08f Uploaded
fubar
parents:
diff changeset
17 ignore_directories=False, case_sensitive=False)
1c652687a08f Uploaded
fubar
parents:
diff changeset
18 self.last_modified = datetime.now()
1c652687a08f Uploaded
fubar
parents:
diff changeset
19 self.tool_dir = watchme
1c652687a08f Uploaded
fubar
parents:
diff changeset
20 self.work_dir = os.getcwd()
1c652687a08f Uploaded
fubar
parents:
diff changeset
21 self.galaxy_root = os.path.split(watchme)[0]
1c652687a08f Uploaded
fubar
parents:
diff changeset
22 logging.info(self.galaxy_root)
1c652687a08f Uploaded
fubar
parents:
diff changeset
23 self.tar_dir = os.path.join(self.galaxy_root, 'tooltardir')
1c652687a08f Uploaded
fubar
parents:
diff changeset
24 if not os.path.exists(self.tar_dir):
1c652687a08f Uploaded
fubar
parents:
diff changeset
25 os.mkdir(self.tar_dir)
1c652687a08f Uploaded
fubar
parents:
diff changeset
26
1c652687a08f Uploaded
fubar
parents:
diff changeset
27 def on_created(self, event):
1c652687a08f Uploaded
fubar
parents:
diff changeset
28 self.on_modified(event)
1c652687a08f Uploaded
fubar
parents:
diff changeset
29
1c652687a08f Uploaded
fubar
parents:
diff changeset
30 def on_modified(self, event):
1c652687a08f Uploaded
fubar
parents:
diff changeset
31 if datetime.now() - self.last_modified < timedelta(seconds=1):
1c652687a08f Uploaded
fubar
parents:
diff changeset
32 return
1c652687a08f Uploaded
fubar
parents:
diff changeset
33 else:
1c652687a08f Uploaded
fubar
parents:
diff changeset
34 if os.path.exists(event.src_path):
1c652687a08f Uploaded
fubar
parents:
diff changeset
35 self.last_modified = datetime.now()
1c652687a08f Uploaded
fubar
parents:
diff changeset
36 logging.info(f"{event.src_path} was {event.event_type}")
1c652687a08f Uploaded
fubar
parents:
diff changeset
37 p = self.planemo_test(event.src_path)
1c652687a08f Uploaded
fubar
parents:
diff changeset
38 if p:
1c652687a08f Uploaded
fubar
parents:
diff changeset
39 if p.returncode == 0:
1c652687a08f Uploaded
fubar
parents:
diff changeset
40 newtarpath = self.makeToolTar(event.src_path)
1c652687a08f Uploaded
fubar
parents:
diff changeset
41 logging.info('### Tested toolshed tarball %s written' % newtarpath)
1c652687a08f Uploaded
fubar
parents:
diff changeset
42 else:
1c652687a08f Uploaded
fubar
parents:
diff changeset
43 logging.debug('### planemo stdout:')
1c652687a08f Uploaded
fubar
parents:
diff changeset
44 logging.debug(p.stdout)
1c652687a08f Uploaded
fubar
parents:
diff changeset
45 logging.debug('### planemo stderr:')
1c652687a08f Uploaded
fubar
parents:
diff changeset
46 logging.debug(p.stderr)
1c652687a08f Uploaded
fubar
parents:
diff changeset
47 logging.info('### Planemo call return code =' % p.returncode)
1c652687a08f Uploaded
fubar
parents:
diff changeset
48 else:
1c652687a08f Uploaded
fubar
parents:
diff changeset
49 logging.info('Directory %s deleted' % event.src_path)
1c652687a08f Uploaded
fubar
parents:
diff changeset
50
1c652687a08f Uploaded
fubar
parents:
diff changeset
51 def planemo_test(self, xml_path):
1c652687a08f Uploaded
fubar
parents:
diff changeset
52 toolpath, toolfile = os.path.split(xml_path)
1c652687a08f Uploaded
fubar
parents:
diff changeset
53 dirlist = os.listdir(toolpath)
1c652687a08f Uploaded
fubar
parents:
diff changeset
54 toolname = os.path.basename(toolpath)
1c652687a08f Uploaded
fubar
parents:
diff changeset
55 logging.info('### test dirlist %s, path %s toolname %s' % (dirlist, xml_path, toolname))
1c652687a08f Uploaded
fubar
parents:
diff changeset
56 xmls = [x for x in dirlist if os.path.splitext(x)[1] == '.xml']
1c652687a08f Uploaded
fubar
parents:
diff changeset
57 if not len(xmls) > 0:
1c652687a08f Uploaded
fubar
parents:
diff changeset
58 logging.warning('Found no xml files after change to %s' % xml_path)
1c652687a08f Uploaded
fubar
parents:
diff changeset
59 return None
1c652687a08f Uploaded
fubar
parents:
diff changeset
60 tool_test_output = os.path.join(toolpath, f"{toolname}_planemo_test_report.html")
1c652687a08f Uploaded
fubar
parents:
diff changeset
61 cll = [
1c652687a08f Uploaded
fubar
parents:
diff changeset
62 "planemo",
1c652687a08f Uploaded
fubar
parents:
diff changeset
63 "test",
1c652687a08f Uploaded
fubar
parents:
diff changeset
64 "--test_output",
1c652687a08f Uploaded
fubar
parents:
diff changeset
65 tool_test_output,
1c652687a08f Uploaded
fubar
parents:
diff changeset
66 "--galaxy_root",
1c652687a08f Uploaded
fubar
parents:
diff changeset
67 self.galaxy_root,
1c652687a08f Uploaded
fubar
parents:
diff changeset
68 "--update_test_data",
1c652687a08f Uploaded
fubar
parents:
diff changeset
69 xml_path,
1c652687a08f Uploaded
fubar
parents:
diff changeset
70 ]
1c652687a08f Uploaded
fubar
parents:
diff changeset
71 logging.info('### calling %s' % ' '.join(cll))
1c652687a08f Uploaded
fubar
parents:
diff changeset
72 p = subprocess.run(
1c652687a08f Uploaded
fubar
parents:
diff changeset
73 cll,
1c652687a08f Uploaded
fubar
parents:
diff changeset
74 cwd = toolpath,
1c652687a08f Uploaded
fubar
parents:
diff changeset
75 shell=False,
1c652687a08f Uploaded
fubar
parents:
diff changeset
76 capture_output=True,
1c652687a08f Uploaded
fubar
parents:
diff changeset
77 encoding='utf8',
1c652687a08f Uploaded
fubar
parents:
diff changeset
78 )
1c652687a08f Uploaded
fubar
parents:
diff changeset
79 return p
1c652687a08f Uploaded
fubar
parents:
diff changeset
80
1c652687a08f Uploaded
fubar
parents:
diff changeset
81 def makeToolTar(self, xml_path):
1c652687a08f Uploaded
fubar
parents:
diff changeset
82 """move outputs into test-data and prepare the tarball"""
1c652687a08f Uploaded
fubar
parents:
diff changeset
83 excludeme = "_planemo_test_report.html"
1c652687a08f Uploaded
fubar
parents:
diff changeset
84
1c652687a08f Uploaded
fubar
parents:
diff changeset
85 def exclude_function(tarinfo):
1c652687a08f Uploaded
fubar
parents:
diff changeset
86 filename = tarinfo.name
1c652687a08f Uploaded
fubar
parents:
diff changeset
87 return None if filename.endswith(excludeme) else tarinfo
1c652687a08f Uploaded
fubar
parents:
diff changeset
88
1c652687a08f Uploaded
fubar
parents:
diff changeset
89 tooldir, xml_file = os.path.split(xml_path)
1c652687a08f Uploaded
fubar
parents:
diff changeset
90 os.chdir(self.tool_dir)
1c652687a08f Uploaded
fubar
parents:
diff changeset
91 toolname = os.path.splitext(xml_file)[0]
1c652687a08f Uploaded
fubar
parents:
diff changeset
92 newtarpath = os.path.join(self.tar_dir, '%s_toolshed.gz' % toolname)
1c652687a08f Uploaded
fubar
parents:
diff changeset
93 tf = tarfile.open(newtarpath, "w:gz")
1c652687a08f Uploaded
fubar
parents:
diff changeset
94 tf.add(
1c652687a08f Uploaded
fubar
parents:
diff changeset
95 name=toolname,
1c652687a08f Uploaded
fubar
parents:
diff changeset
96 arcname=toolname,
1c652687a08f Uploaded
fubar
parents:
diff changeset
97 filter=exclude_function,
1c652687a08f Uploaded
fubar
parents:
diff changeset
98 )
1c652687a08f Uploaded
fubar
parents:
diff changeset
99 tf.close()
1c652687a08f Uploaded
fubar
parents:
diff changeset
100 os.chdir(self.work_dir)
1c652687a08f Uploaded
fubar
parents:
diff changeset
101 return newtarpath
1c652687a08f Uploaded
fubar
parents:
diff changeset
102
1c652687a08f Uploaded
fubar
parents:
diff changeset
103
1c652687a08f Uploaded
fubar
parents:
diff changeset
104 if __name__ == "__main__":
1c652687a08f Uploaded
fubar
parents:
diff changeset
105 watchme = '/home/ross/gal21/tools'
1c652687a08f Uploaded
fubar
parents:
diff changeset
106 logging.basicConfig(level=logging.INFO,
1c652687a08f Uploaded
fubar
parents:
diff changeset
107 #filename = os.path.join(watchme,"toolwatcher.log")
1c652687a08f Uploaded
fubar
parents:
diff changeset
108 #filemode = "w",
1c652687a08f Uploaded
fubar
parents:
diff changeset
109 format='%(asctime)s - %(message)s',
1c652687a08f Uploaded
fubar
parents:
diff changeset
110 datefmt='%Y-%m-%d %H:%M:%S')
1c652687a08f Uploaded
fubar
parents:
diff changeset
111 event_handler = ToolHandler(watchme=watchme)
1c652687a08f Uploaded
fubar
parents:
diff changeset
112 observer = Observer()
1c652687a08f Uploaded
fubar
parents:
diff changeset
113 observer.schedule(event_handler, path=watchme, recursive=True)
1c652687a08f Uploaded
fubar
parents:
diff changeset
114 observer.start()
1c652687a08f Uploaded
fubar
parents:
diff changeset
115 try:
1c652687a08f Uploaded
fubar
parents:
diff changeset
116 while True:
1c652687a08f Uploaded
fubar
parents:
diff changeset
117 time.sleep(1)
1c652687a08f Uploaded
fubar
parents:
diff changeset
118 except KeyboardInterrupt:
1c652687a08f Uploaded
fubar
parents:
diff changeset
119 observer.stop()
1c652687a08f Uploaded
fubar
parents:
diff changeset
120 observer.join()
1c652687a08f Uploaded
fubar
parents:
diff changeset
121
1c652687a08f Uploaded
fubar
parents:
diff changeset
122
1c652687a08f Uploaded
fubar
parents:
diff changeset
123