summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-03-30 11:20:06 +0300
committerLars Wirzenius <liw@liw.fi>2018-03-30 11:52:19 +0300
commit114a276e06aeb19cd9150175efa53d7267b6a6ff (patch)
treeb719c981915cd62224db6901116f957df99f2fe6
parentf3506ce57ae144f1a6447940f3eb0285767d16dd (diff)
downloadick2-114a276e06aeb19cd9150175efa53d7267b6a6ff.tar.gz
Add: classes for managing workspaces
-rw-r--r--ick2/workspace.py64
-rw-r--r--ick2/workspace_tests.py68
2 files changed, 132 insertions, 0 deletions
diff --git a/ick2/workspace.py b/ick2/workspace.py
new file mode 100644
index 0000000..38cf5e4
--- /dev/null
+++ b/ick2/workspace.py
@@ -0,0 +1,64 @@
+# Copyright (C) 2018 Lars Wirzenius
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import os
+import shutil
+
+
+class WorkspaceArea:
+
+ def __init__(self):
+ self._root = None
+
+ def set_root(self, root):
+ self._root = root
+
+ def get_root(self):
+ return self._root
+
+ def clear(self): # pragma: no cover
+ names = os.listdir(self._root)
+ for name in names:
+ pathname = os.path.join(self._root, name)
+ if os.path.isdir(pathname):
+ shutil.rmtree(pathname)
+ else:
+ os.remove(pathname)
+
+ def create_workspace(self, name):
+ dirname = self.get_workspace_directory(name)
+ if not os.path.exists(dirname):
+ os.mkdir(dirname)
+ ws = Workspace()
+ ws.set_directory(dirname)
+ return ws
+
+ def get_workspace_directory(self, name):
+ return os.path.join(self._root, name)
+
+
+class Workspace:
+
+ def __init__(self):
+ self._dirname = None
+
+ def set_directory(self, dirname):
+ self._dirname = dirname
+
+ def get_directory(self):
+ return self._dirname
+
+ def destroy(self):
+ shutil.rmtree(self.get_directory())
diff --git a/ick2/workspace_tests.py b/ick2/workspace_tests.py
new file mode 100644
index 0000000..fa5e788
--- /dev/null
+++ b/ick2/workspace_tests.py
@@ -0,0 +1,68 @@
+# Copyright (C) 2018 Lars Wirzenius
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import os
+import shutil
+import tempfile
+import unittest
+
+
+import ick2
+
+
+class WorkspaceAreaTests(unittest.TestCase):
+
+ def setUp(self):
+ self.tempdir = tempfile.mkdtemp()
+ self.area = ick2.WorkspaceArea()
+ self.area.set_root(self.tempdir)
+
+ def tearDown(self):
+ shutil.rmtree(self.tempdir)
+
+ def test_sets_root(self):
+ self.assertEqual(self.area.get_root(), self.tempdir)
+
+ def test_clears_workspace_area(self):
+ name = 'foo-project'
+ ws = self.area.create_workspace(name)
+ self.area.clear()
+ self.assertEqual(os.listdir(self.tempdir), [])
+
+ def test_creates_workspace(self):
+ name = 'foo-project'
+ ws = self.area.create_workspace(name)
+ self.assertTrue(isinstance(ws, ick2.Workspace))
+ dirname = os.path.join(self.tempdir, name)
+ self.assertEqual(ws.get_directory(), dirname)
+ self.assertTrue(os.path.isdir(dirname))
+
+ def test_creates_workspace_twice(self):
+ name = 'foo-project'
+ ws0 = self.area.create_workspace(name)
+ ws = self.area.create_workspace(name)
+ self.assertTrue(isinstance(ws, ick2.Workspace))
+ dirname = os.path.join(self.tempdir, name)
+ self.assertEqual(ws.get_directory(), dirname)
+ self.assertTrue(os.path.isdir(dirname))
+
+ def test_destroys_nonempty_workspace(self):
+ name = 'foo-project'
+ ws = self.area.create_workspace(name)
+ dirname = ws.get_directory()
+ with open(os.path.join(dirname, 'file.txt'), 'w') as f:
+ f.write('hello, world')
+ ws.destroy()
+ self.assertFalse(os.path.exists(dirname))