Skip to content

Commit 1c2009f

Browse files
committed
Create taskhandler.py
1 parent 3102c41 commit 1c2009f

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

task_handler/taskhandler.py

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import unittest
2+
import sys
3+
from StringIO import StringIO
4+
5+
6+
class TaskHandler(object):
7+
8+
def __init__(self):
9+
10+
"""
11+
Ships must dock first, then vessel can be unloaded, then a truck can
12+
load a container, and lastly it needs to go through a customs check.
13+
The refueling process can happen anytime after a ship docks.
14+
"""
15+
16+
self._task_order = {'RE-FUELING SHIP': ['SHIP DOCKING'],
17+
'UNLOADING VESSEL': ['SHIP DOCKING'],
18+
'TRUCK LOADING CONTAINER': ['UNLOADING VESSEL'],
19+
'CUSTOMS CHECK': ['TRUCK LOADING CONTAINER']
20+
}
21+
22+
23+
self.task_list = {'SHIP DOCKING': 0,
24+
'RE-FUELING SHIP': 0,
25+
'UNLOADING VESSEL': 0,
26+
'TRUCK LOADING CONTAINER': 0,
27+
'CUSTOMS CHECK': 0
28+
}
29+
30+
31+
def tasks_remaining(self):
32+
""" Gets total number of tasks remaining. """
33+
34+
return sum(self.task_list.values())
35+
36+
37+
def add_task(self, tasks_array):
38+
""" Adds an array of tasks to existing task list. """
39+
40+
for task_file in tasks_array:
41+
task = open(task_file).read().rstrip()
42+
self.task_list[task] = self.task_list.get(task) + 1
43+
44+
45+
def execute_tasks(self):
46+
""" Executes tasks in sensible order. """
47+
48+
for task in self.task_list.keys():
49+
50+
if task not in self._task_order:
51+
while self.task_list[task] > 0:
52+
print task + ' COMPLETED'
53+
self.remove_task(task)
54+
55+
else:
56+
while self.task_list[task] > 0:
57+
self.check_dependencies(task)
58+
print task + ' COMPLETED'
59+
self.remove_task(task)
60+
61+
62+
63+
def check_dependencies(self, task):
64+
""" Checks for any task dependencies. """
65+
66+
dependencies_remaining = []
67+
68+
if task in self._task_order:
69+
dependencies = self._task_order[task]
70+
71+
for dependency in dependencies:
72+
dependencies_remaining.append(dependency)
73+
74+
if dependencies_remaining == []:
75+
return
76+
else:
77+
for dependency in dependencies_remaining:
78+
self.check_dependencies(dependency)
79+
80+
81+
82+
def remove_task(self, task):
83+
""" Removes a task from the task list once it has been completed. """
84+
85+
self.task_list[task] -= 1
86+
87+
88+
def __repr__(self):
89+
90+
return '<{} tasks remaining>'.format(self.tasks_remaining())
91+
92+
93+
94+
class TestingTaskHandler(unittest.TestCase):
95+
96+
def setUp(self):
97+
self.job = TaskHandler()
98+
self.job.add_task(['task0.py', 'task1.py', 'task4.py', 'task2.py', 'task3.py', 'task3.py', 'task4.py', 'task2.py', 'task1.py'])
99+
self.held = sys.stdout
100+
sys.stdout = StringIO()
101+
102+
def test_add_tasks(self):
103+
self.assertEqual(self.job.tasks_remaining(), 9)
104+
self.assertEqual(self.job.task_list, {'SHIP DOCKING': 1, 'UNLOADING VESSEL': 2, 'CUSTOMS CHECK': 2, 'TRUCK LOADING CONTAINER': 2, 'RE-FUELING SHIP': 2})
105+
106+
def test_remove_task(self):
107+
self.job.remove_task('SHIP DOCKING')
108+
self.assertEqual(self.job.tasks_remaining(), 8)
109+
self.assertEqual(self.job.task_list, {'SHIP DOCKING': 0, 'UNLOADING VESSEL': 2, 'CUSTOMS CHECK': 2, 'TRUCK LOADING CONTAINER': 2, 'RE-FUELING SHIP': 2})
110+
111+
def test_execute_tasks(self):
112+
self.job.execute_tasks()
113+
self.assertEqual(self.job.tasks_remaining(), 0)
114+
self.assertEqual(sys.stdout.getvalue(),
115+
'SHIP DOCKING COMPLETED\nUNLOADING VESSEL COMPLETED\nUNLOADING VESSEL COMPLETED\nCUSTOMS CHECK COMPLETED\nCUSTOMS CHECK COMPLETED\nTRUCK LOADING CONTAINER COMPLETED\nTRUCK LOADING CONTAINER COMPLETED\nRE-FUELING SHIP COMPLETED\nRE-FUELING SHIP COMPLETED\n')
116+
117+
118+
119+
if __name__ == '__main__':
120+
unittest.main()

0 commit comments

Comments
 (0)