From 97faf32eb68bf0db31d66c81e57734e068184652 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 01:03:17 +0300 Subject: [PATCH 01/22] Add .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..efa0b16 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__ +venv +.pyc From 047babcb895067ec790ea281255c8708d81b4de2 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 01:04:54 +0300 Subject: [PATCH 02/22] Initial tests --- models/__init__.py | 0 models/dojo.py | 9 +++++++++ models/fellow.py | 4 ++++ models/livingspace.py | 4 ++++ models/office.py | 4 ++++ models/person.py | 3 +++ models/room.py | 4 ++++ models/staff.py | 4 ++++ tests/__init__.py | 0 tests/test_add_fellow.py | 8 ++++++++ tests/test_add_person.py | 14 ++++++++++++++ tests/test_add_staff.py | 8 ++++++++ tests/test_create_livingspace.py | 9 +++++++++ tests/test_create_office.py | 9 +++++++++ tests/test_create_room.py | 14 ++++++++++++++ 15 files changed, 94 insertions(+) create mode 100644 models/__init__.py create mode 100644 models/dojo.py create mode 100644 models/fellow.py create mode 100644 models/livingspace.py create mode 100644 models/office.py create mode 100644 models/person.py create mode 100644 models/room.py create mode 100644 models/staff.py create mode 100644 tests/__init__.py create mode 100644 tests/test_add_fellow.py create mode 100644 tests/test_add_person.py create mode 100644 tests/test_add_staff.py create mode 100644 tests/test_create_livingspace.py create mode 100644 tests/test_create_office.py create mode 100644 tests/test_create_room.py diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models/dojo.py b/models/dojo.py new file mode 100644 index 0000000..f957fdf --- /dev/null +++ b/models/dojo.py @@ -0,0 +1,9 @@ +from models.room import * +from models.person import * + +class Dojo(): + def create_room(name,type_room): + pass + + def add_person(name,category,wants_accomodation): + pass diff --git a/models/fellow.py b/models/fellow.py new file mode 100644 index 0000000..a3875f0 --- /dev/null +++ b/models/fellow.py @@ -0,0 +1,4 @@ +from person import Person + +class Fellow(Person): + pass diff --git a/models/livingspace.py b/models/livingspace.py new file mode 100644 index 0000000..1a65636 --- /dev/null +++ b/models/livingspace.py @@ -0,0 +1,4 @@ +from room import Room + +class LivingSpace(Room): + pass diff --git a/models/office.py b/models/office.py new file mode 100644 index 0000000..cd1a91b --- /dev/null +++ b/models/office.py @@ -0,0 +1,4 @@ +from office import Room + +class Office(Room): + pass diff --git a/models/person.py b/models/person.py new file mode 100644 index 0000000..2ae0cd2 --- /dev/null +++ b/models/person.py @@ -0,0 +1,3 @@ +class Person(): + def __init__(self): + pass diff --git a/models/room.py b/models/room.py new file mode 100644 index 0000000..f600550 --- /dev/null +++ b/models/room.py @@ -0,0 +1,4 @@ + +class Room(): + def __init__(self): + pass diff --git a/models/staff.py b/models/staff.py new file mode 100644 index 0000000..a3875f0 --- /dev/null +++ b/models/staff.py @@ -0,0 +1,4 @@ +from person import Person + +class Fellow(Person): + pass diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_add_fellow.py b/tests/test_add_fellow.py new file mode 100644 index 0000000..086dc71 --- /dev/null +++ b/tests/test_add_fellow.py @@ -0,0 +1,8 @@ +import unittest +from models.fellow import Fellow + +class TestFellow(unittest.TestCase): + def test_creates_fellow_instance(self): + self.fellow=Fellow('Joshua','Ondieki') + self.assertTrue(self.fellow) + self.assertTrue('Joshua'==self.fellow.firstname and 'Ondieki'==self.fellow.surname) diff --git a/tests/test_add_person.py b/tests/test_add_person.py new file mode 100644 index 0000000..fc0103a --- /dev/null +++ b/tests/test_add_person.py @@ -0,0 +1,14 @@ +import unittest +from models.dojo import Dojo + +class TestAddPerson(unittest.TestCase): + def setUp(self): + self.dojo=Dojo() + initial_people = len(self.dojo.all_people) + + def test_create_people_successfully(self): + fellow = self.dojo.add_person('Joshua','Ondieki' 'Fellow') + staff = self.dojo.add_person('Annette','Kamau' 'Staff') + self.assertTrue(fellow and staff) + new_people = len(self.dojo.all_people) + self.assertEqual(new_people - initial_people, 2) diff --git a/tests/test_add_staff.py b/tests/test_add_staff.py new file mode 100644 index 0000000..49956c6 --- /dev/null +++ b/tests/test_add_staff.py @@ -0,0 +1,8 @@ +import unittest +from models.staff import Staff + +class TestStaff(unittest.TestCase): + def test_creates_staff_instance(self): + self.staff=Staff('James','Ndiga') + self.assertTrue(self.staff) + self.assertTrue('James'==self.staff.firstname and 'Ndiga'==self.staff.surname) diff --git a/tests/test_create_livingspace.py b/tests/test_create_livingspace.py new file mode 100644 index 0000000..c1325fb --- /dev/null +++ b/tests/test_create_livingspace.py @@ -0,0 +1,9 @@ +import unittest +from models.livingspace import LivingSpace + +class TestLivingSpace(unittest.TestCase): + def test_creates_livingspace_instance(self): + self.livingspace=LivingSpace('Amity') + self.assertTrue(self.livingspace) + self.assertEqual(self.livingspace.capacity,4) + self.assertEqual(self.livingspace.members,[]) diff --git a/tests/test_create_office.py b/tests/test_create_office.py new file mode 100644 index 0000000..00a8555 --- /dev/null +++ b/tests/test_create_office.py @@ -0,0 +1,9 @@ +import unittest +from models.office import Office + +class TestOffice(unittest.TestCase): + def test_creates_office_instance(self): + self.office=Office('Spire') + self.assertTrue(self.office) + self.assertEqual(self.office.capacity,6) + self.assertEqual(self.office.members,[]) diff --git a/tests/test_create_room.py b/tests/test_create_room.py new file mode 100644 index 0000000..cbcdcff --- /dev/null +++ b/tests/test_create_room.py @@ -0,0 +1,14 @@ +import unittest +from models.dojo import Dojo + +class TestCreateRoom(unittest.TestCase): + def setUp(self): + self.dojo=Dojo() + initial_rooms = len(self.dojo.all_rooms) + + def test_create_rooms_successfully(self): + amity_livingspace = self.dojo.create_room('Amity', 'livingspace') + spire_office = self.dojo.create_room('Spire','office') + self.assertTrue(spire_office and amity_livingspace) + new_rooms = len(self.dojo.all_rooms) + self.assertEqual(new_rooms - initial_rooms, 2) From f49230e17d6ffbe55f05e84397b00fc010519cf2 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 01:19:56 +0300 Subject: [PATCH 03/22] Update ReadMe --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6f0eb43..125e5f9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ +[![Coverage Status](https://coveralls.io/repos/github/JoshuaOndieki/dojo/badge.svg?branch=master)](https://coveralls.io/github/JoshuaOndieki/dojo?branch=master) # dojo An utterly fantastic CLI application for office Space Allocation From 5d5eb62607a106d9e20255f683f68a788e1a8f80 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 01:20:25 +0300 Subject: [PATCH 04/22] Add .travis.yml --- .travis.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c363972 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: python +python: + - "3.6" +# command to install dependencies +install: + - pip install -r requirements.txt + - pip install coveralls + - pip install coverage +# command to run tests +script: pytest + +after-success: + - coveralls From 5dabc104b7a8decf6d4309b91000e60b22e7288f Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 01:25:49 +0300 Subject: [PATCH 05/22] Initial commit --- requirements.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..51b2bca --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +appdirs==1.4.3 +docopt==0.6.2 +packaging==16.8 +pyparsing==2.2.0 +six==1.10.0 +SQLAlchemy==1.1.9 +termcolor==1.1.0 From c3bcc29d0d67328ba24543861b641265d83325a1 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 10:04:15 +0300 Subject: [PATCH 06/22] Add nosetests to script --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c363972..02420c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,10 +4,11 @@ python: # command to install dependencies install: - pip install -r requirements.txt + -pip install nosetests - pip install coveralls - pip install coverage # command to run tests -script: pytest +script: nosetests after-success: - coveralls From fb87dc661e731f8155207dae4d62a46c60f439d3 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 10:05:11 +0300 Subject: [PATCH 07/22] Write failing tests --- models/dojo.py | 11 +++++++---- models/fellow.py | 5 ++++- models/livingspace.py | 6 +++++- models/office.py | 6 +++++- models/person.py | 5 +++-- models/room.py | 4 ++-- models/staff.py | 7 +++++-- tests/test_add_staff.py | 4 ++++ 8 files changed, 35 insertions(+), 13 deletions(-) diff --git a/models/dojo.py b/models/dojo.py index f957fdf..df1fd9d 100644 --- a/models/dojo.py +++ b/models/dojo.py @@ -2,8 +2,11 @@ from models.person import * class Dojo(): - def create_room(name,type_room): - pass + def __init__(self): + self.all_rooms=[] + self.all_people=[] - def add_person(name,category,wants_accomodation): - pass + def create_room(self, name,type_room): + print(name) + def add_person(self, name,category,wants_accomodation): + print(name) diff --git a/models/fellow.py b/models/fellow.py index a3875f0..d8d6618 100644 --- a/models/fellow.py +++ b/models/fellow.py @@ -1,4 +1,7 @@ from person import Person class Fellow(Person): - pass + def __init__(self,firstname,surname): + super().__init__(self,firstname,surname) + self.firstname=firstname + self.surname=surname diff --git a/models/livingspace.py b/models/livingspace.py index 1a65636..4595069 100644 --- a/models/livingspace.py +++ b/models/livingspace.py @@ -1,4 +1,8 @@ from room import Room class LivingSpace(Room): - pass + def __init__(self,name): + super().__init__(self,name) + self.name=name + self.capacity=4 + self.members=[] diff --git a/models/office.py b/models/office.py index cd1a91b..ce07cc3 100644 --- a/models/office.py +++ b/models/office.py @@ -1,4 +1,8 @@ from office import Room class Office(Room): - pass + def __init__(self,name): + super().__init__(self,name) + self.name=name + self.capacity=6 + self.members=[] diff --git a/models/person.py b/models/person.py index 2ae0cd2..a484f81 100644 --- a/models/person.py +++ b/models/person.py @@ -1,3 +1,4 @@ class Person(): - def __init__(self): - pass + def __init__(self, firstname,surname): + self.firstname = firstname + self.surname = surname diff --git a/models/room.py b/models/room.py index f600550..5d74a3d 100644 --- a/models/room.py +++ b/models/room.py @@ -1,4 +1,4 @@ class Room(): - def __init__(self): - pass + def __init__(self,name): + self.name=name diff --git a/models/staff.py b/models/staff.py index a3875f0..f9d85cb 100644 --- a/models/staff.py +++ b/models/staff.py @@ -1,4 +1,7 @@ from person import Person -class Fellow(Person): - pass +class Staff(Person): + def __init__(self,firstname,surname): + super().__init__(self,firstname,surname) + self.firstname=firstname + self.surname=surname diff --git a/tests/test_add_staff.py b/tests/test_add_staff.py index 49956c6..aa5d565 100644 --- a/tests/test_add_staff.py +++ b/tests/test_add_staff.py @@ -6,3 +6,7 @@ def test_creates_staff_instance(self): self.staff=Staff('James','Ndiga') self.assertTrue(self.staff) self.assertTrue('James'==self.staff.firstname and 'Ndiga'==self.staff.surname) + + +if __name__ == __main__: + unittest.main() From 80bcf9d8cc31a9f856fdaa75c415e72b4b325e6a Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 11:52:12 +0300 Subject: [PATCH 08/22] Refactor and pass tests --- models/dojo.py | 36 +++++++++++++++++++++++++------- models/fellow.py | 4 ++-- models/livingspace.py | 4 ++-- models/office.py | 4 ++-- models/staff.py | 4 ++-- tests/test_add_fellow.py | 3 +++ tests/test_add_person.py | 13 +++++++----- tests/test_add_staff.py | 2 +- tests/test_create_livingspace.py | 3 +++ tests/test_create_office.py | 3 +++ tests/test_create_room.py | 10 +++++---- 11 files changed, 60 insertions(+), 26 deletions(-) diff --git a/models/dojo.py b/models/dojo.py index df1fd9d..ca039be 100644 --- a/models/dojo.py +++ b/models/dojo.py @@ -1,12 +1,32 @@ -from models.room import * -from models.person import * - +from models.fellow import Fellow +from models.staff import Staff +from models.livingspace import LivingSpace +from models.office import Office class Dojo(): def __init__(self): - self.all_rooms=[] + self.offices={} + self.livingspaces={} + self.fellows=[] + self.staff=[] + self.all_rooms={} self.all_people=[] - def create_room(self, name,type_room): - print(name) - def add_person(self, name,category,wants_accomodation): - print(name) + def create_room(self, name,room_type): + if room_type=='office': + room=Office(name) + self.offices[name]=room.members + self.all_rooms[name]=[room_type,room.members] + elif room_type=='livingspace': + room=LivingSpace(name) + self.livingspaces[name]=room.members + self.all_rooms[name]=[room_type,room.members] + + def add_person(self, firstname,surname,person_type,wants_accomodation='N'): + if person_type=='Fellow': + fellow=Fellow(firstname,surname) + self.fellows.append([fellow.firstname,fellow.surname]) + self.all_people.append([fellow.firstname,fellow.surname]) + elif person_type=='Staff': + staff=Staff(firstname,surname) + self.staff.append([firstname,surname]) + self.all_people.append([firstname,surname]) diff --git a/models/fellow.py b/models/fellow.py index d8d6618..8b028d0 100644 --- a/models/fellow.py +++ b/models/fellow.py @@ -1,7 +1,7 @@ -from person import Person +from models.person import Person class Fellow(Person): def __init__(self,firstname,surname): - super().__init__(self,firstname,surname) + # super().__init__(self,firstname,surname) self.firstname=firstname self.surname=surname diff --git a/models/livingspace.py b/models/livingspace.py index 4595069..0ed1595 100644 --- a/models/livingspace.py +++ b/models/livingspace.py @@ -1,8 +1,8 @@ -from room import Room +from models.room import Room class LivingSpace(Room): def __init__(self,name): - super().__init__(self,name) + # super().__init__(self,name) self.name=name self.capacity=4 self.members=[] diff --git a/models/office.py b/models/office.py index ce07cc3..d0e2040 100644 --- a/models/office.py +++ b/models/office.py @@ -1,8 +1,8 @@ -from office import Room +from models.room import Room class Office(Room): def __init__(self,name): - super().__init__(self,name) + # super().__init__(self,name) self.name=name self.capacity=6 self.members=[] diff --git a/models/staff.py b/models/staff.py index f9d85cb..846913c 100644 --- a/models/staff.py +++ b/models/staff.py @@ -1,7 +1,7 @@ -from person import Person +from models.person import Person class Staff(Person): def __init__(self,firstname,surname): - super().__init__(self,firstname,surname) + # super().__init__(self,firstname,surname) self.firstname=firstname self.surname=surname diff --git a/tests/test_add_fellow.py b/tests/test_add_fellow.py index 086dc71..c434257 100644 --- a/tests/test_add_fellow.py +++ b/tests/test_add_fellow.py @@ -6,3 +6,6 @@ def test_creates_fellow_instance(self): self.fellow=Fellow('Joshua','Ondieki') self.assertTrue(self.fellow) self.assertTrue('Joshua'==self.fellow.firstname and 'Ondieki'==self.fellow.surname) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_add_person.py b/tests/test_add_person.py index fc0103a..0ccb5a8 100644 --- a/tests/test_add_person.py +++ b/tests/test_add_person.py @@ -4,11 +4,14 @@ class TestAddPerson(unittest.TestCase): def setUp(self): self.dojo=Dojo() - initial_people = len(self.dojo.all_people) + self.initial_people = len(self.dojo.all_people) def test_create_people_successfully(self): - fellow = self.dojo.add_person('Joshua','Ondieki' 'Fellow') - staff = self.dojo.add_person('Annette','Kamau' 'Staff') - self.assertTrue(fellow and staff) + self.fellow = self.dojo.add_person('Joshua','Ondieki', 'Fellow') + self.staff = self.dojo.add_person('Annette','Kamau', 'Staff') + # self.assertTrue(self.fellow and self.staff) new_people = len(self.dojo.all_people) - self.assertEqual(new_people - initial_people, 2) + self.assertEqual(new_people - self.initial_people, 2) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_add_staff.py b/tests/test_add_staff.py index aa5d565..6edbd3a 100644 --- a/tests/test_add_staff.py +++ b/tests/test_add_staff.py @@ -8,5 +8,5 @@ def test_creates_staff_instance(self): self.assertTrue('James'==self.staff.firstname and 'Ndiga'==self.staff.surname) -if __name__ == __main__: +if __name__ == '__main__': unittest.main() diff --git a/tests/test_create_livingspace.py b/tests/test_create_livingspace.py index c1325fb..6d2f031 100644 --- a/tests/test_create_livingspace.py +++ b/tests/test_create_livingspace.py @@ -7,3 +7,6 @@ def test_creates_livingspace_instance(self): self.assertTrue(self.livingspace) self.assertEqual(self.livingspace.capacity,4) self.assertEqual(self.livingspace.members,[]) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_create_office.py b/tests/test_create_office.py index 00a8555..aa64dc1 100644 --- a/tests/test_create_office.py +++ b/tests/test_create_office.py @@ -7,3 +7,6 @@ def test_creates_office_instance(self): self.assertTrue(self.office) self.assertEqual(self.office.capacity,6) self.assertEqual(self.office.members,[]) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_create_room.py b/tests/test_create_room.py index cbcdcff..5c60b3b 100644 --- a/tests/test_create_room.py +++ b/tests/test_create_room.py @@ -4,11 +4,13 @@ class TestCreateRoom(unittest.TestCase): def setUp(self): self.dojo=Dojo() - initial_rooms = len(self.dojo.all_rooms) + self.initial_rooms = len(self.dojo.all_rooms) def test_create_rooms_successfully(self): amity_livingspace = self.dojo.create_room('Amity', 'livingspace') spire_office = self.dojo.create_room('Spire','office') - self.assertTrue(spire_office and amity_livingspace) - new_rooms = len(self.dojo.all_rooms) - self.assertEqual(new_rooms - initial_rooms, 2) + self.new_rooms = len(self.dojo.all_rooms) + self.assertEqual(self.new_rooms - self.initial_rooms, 2) + +if __name__ == '__main__': + unittest.main() From 83b358f13048fd49d0e72caab6aee899c00ce408 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 12:02:42 +0300 Subject: [PATCH 09/22] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 02420c0..d703b10 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ python: # command to install dependencies install: - pip install -r requirements.txt - -pip install nosetests + - pip install nosetests - pip install coveralls - pip install coverage # command to run tests From 3fd87a83c94e593e9b8af43f926f0b58015d80cf Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 12:05:46 +0300 Subject: [PATCH 10/22] Update .travis.yml --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d703b10..fdbde1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,11 @@ python: # command to install dependencies install: - pip install -r requirements.txt - - pip install nosetests + - pip install pytest - pip install coveralls - pip install coverage # command to run tests -script: nosetests +script: pytest after-success: - coveralls From 4f9bd71ce73f709f5a75de704458543e8c2639db Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 12:09:33 +0300 Subject: [PATCH 11/22] Update ReadMe --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 125e5f9..aa26f77 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ [![Coverage Status](https://coveralls.io/repos/github/JoshuaOndieki/dojo/badge.svg?branch=master)](https://coveralls.io/github/JoshuaOndieki/dojo?branch=master) +[![Build Status](https://travis-ci.org/JoshuaOndieki/dojo.svg?branch=master)](https://travis-ci.org/JoshuaOndieki/dojo) # dojo An utterly fantastic CLI application for office Space Allocation From a9aefba284ca775939e41ce4a280cb27f3cd8bf6 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 12:20:11 +0300 Subject: [PATCH 12/22] Make room arg list and Dojo instance --- app.py | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 app.py diff --git a/app.py b/app.py new file mode 100644 index 0000000..2ed7657 --- /dev/null +++ b/app.py @@ -0,0 +1,85 @@ +""" + Usage: + create_room + add_person [wants_accomodation="N"] + dojo (-i | --interactive) + dojo (-h | --help | --version) + Options: + -i, --interactive Interactive Mode + -h, --help Show this screen and exit. +""" + + +from docopt import docopt, DocoptExit +import cmd +import os +import sys +from models.dojo import Dojo +from termcolor import colored + + +def docopt_cmd(func): + """ + This decorator is used to simplify the try/except block and pass the result + of the docopt parsing to the called action + """ + + def fn(self, arg): + try: + opt = docopt(fn.__doc__, arg) + + except DocoptExit as e: + # The DocoptExit is thrown when the args do not match + # We print a message to the user and the usage block + print('Invalid Command!') + print(e) + return + + except SystemExit: + # The SystemExit exception prints the usage for --help + # We do not need to do the print here + return + + return func(self, opt) + + fn.__name__ = func.__name__ + fn.__doc__ = func.__doc__ + fn.__dict__.update(func.__dict__) + return fn + + +def intro(): + os.system("clear") + print(__doc__) + + +class DOJO(cmd.Cmd): + instance=Dojo() + prompt = colored('DOJO$$$', 'magenta', attrs=['blink','bold']) + + + @docopt_cmd + def do_quit(self, arg): + """Usage: quit""" + os.system('clear') + print ('Dojo Exiting') + exit() + + @docopt_cmd + def do_create_room(self, arg): + """Usage: create_room """ + pass + + @docopt_cmd + def do_add_person(self, arg): + """Usage: add_person [wants_accomodation="N"]""" + pass + + +if __name__ == "__main__": + try: + intro() + DOJO().cmdloop() + except KeyboardInterrupt: + os.system("clear") + print('Dojo Exiting') From 553b38d7fcfb95f59c302f94b751c0cb7d0644d3 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 14:58:39 +0300 Subject: [PATCH 13/22] Make room name arg a list --- app.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/app.py b/app.py index 2ed7657..1f8f792 100644 --- a/app.py +++ b/app.py @@ -57,17 +57,9 @@ class DOJO(cmd.Cmd): instance=Dojo() prompt = colored('DOJO$$$', 'magenta', attrs=['blink','bold']) - - @docopt_cmd - def do_quit(self, arg): - """Usage: quit""" - os.system('clear') - print ('Dojo Exiting') - exit() - @docopt_cmd def do_create_room(self, arg): - """Usage: create_room """ + """Usage: create_room ...""" pass @docopt_cmd @@ -75,6 +67,12 @@ def do_add_person(self, arg): """Usage: add_person [wants_accomodation="N"]""" pass + @docopt_cmd + def do_quit(self, arg): + """Usage: quit""" + os.system('clear') + print ('Dojo Exiting') + exit() if __name__ == "__main__": try: From 3e03c17e644084c1098b4342d010b2d66e5a61da Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 16:15:40 +0300 Subject: [PATCH 14/22] Refactor tests --- tests/test_add_person.py | 22 ++++++++++++++++++++++ tests/test_create_room.py | 21 +++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/tests/test_add_person.py b/tests/test_add_person.py index 0ccb5a8..86e5bd4 100644 --- a/tests/test_add_person.py +++ b/tests/test_add_person.py @@ -12,6 +12,28 @@ def test_create_people_successfully(self): # self.assertTrue(self.fellow and self.staff) new_people = len(self.dojo.all_people) self.assertEqual(new_people - self.initial_people, 2) + def test_it_fails_with_existing_person(self): + exist_person = self.dojo.add_person('Joshua','Ondieki', 'Fellow') + try_overwrite_f = self.dojo.add_person('Joshua','Ondieki', 'Fellow') + exist_person = self.dojo.add_person('Evans','Musomi', 'Staff') + try_overwrite_s = self.dojo.add_person('Evans','Musomi', 'Staff') + self.assertTrue(try_overwrite_f == 'Joshua Ondieki exists!' and try_overwrite_s == 'Evans Musomi exists!') + + def test_it_fails_with_invalid_person_type(self): + invalid_type = self.dojo.add_person('Loice','Andia','BFA') + self.assertEqual('Only fellow and staff allowed!',invalid_type) + + def test_fails_with_person_name_not_string(self): + invalid_person = self.dojo.add_person(['Oj'],'Josh','Fellow') + invalid_person1 = self.dojo.add_person({'Oj':'Josh'},{},'Fellow') + invalid_person2 = self.dojo.add_person(['Oj'],['Josh'],'Staff') + invalid_person3 = self.dojo.add_person({'Oj':'Josh'},{},'Staff') + self.assertEqual(invalid_person,'People names can only be strings!') + self.assertEqual(invalid_person1,'People names can only be strings!') + self.assertEqual(invalid_person2,'People names can only be strings!') + self.assertEqual(invalid_person3,'People names can only be strings!') + + if __name__ == '__main__': unittest.main() diff --git a/tests/test_create_room.py b/tests/test_create_room.py index 5c60b3b..7bfe4f5 100644 --- a/tests/test_create_room.py +++ b/tests/test_create_room.py @@ -12,5 +12,26 @@ def test_create_rooms_successfully(self): self.new_rooms = len(self.dojo.all_rooms) self.assertEqual(self.new_rooms - self.initial_rooms, 2) + def test_it_fails_with_existing_room(self): + exist_room = self.dojo.create_room('Amhere','office') + try_overwrite_o = self.dojo.create_room('Amhere','office') + exist_room = self.dojo.create_room('Amhere','livingspace') + try_overwrite_l = self.dojo.create_room('Amhere','livingspace') + self.assertTrue(try_overwrite_o == 'Room Amhere exists!' and try_overwrite_l == 'Room Amhere exists!') + + def test_it_fails_with_invalid_room_type(self): + invalid_type = self.dojo.create_room('Amhere','Kitchen') + self.assertEqual('Only offices and livingspaces allowed!',invalid_type) + + def test_fails_with_room_name_not_string(self): + invalid_room = self.dojo.create_room('[Amhere]','office') + invalid_room1 = self.dojo.create_room({'Amhere':'room'},'office') + invalid_room2 = self.dojo.create_room('[Amhere]','livingspace') + invalid_room3 = self.dojo.create_room({'Amhere':'room'},'livingspace') + self.assertEqual(invalid_room,'Room names can only be strings!') + self.assertEqual(invalid_room1,'Room names can only be strings!') + self.assertEqual(invalid_room2,'Room names can only be strings!') + self.assertEqual(invalid_room3,'Room names can only be strings!') + if __name__ == '__main__': unittest.main() From 615bd876efb41b949ce9c5ca5e24c6d968b0fee9 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 16:34:01 +0300 Subject: [PATCH 15/22] Refactor tests --- models/dojo.py | 10 ++++++---- tests/test_create_room.py | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/models/dojo.py b/models/dojo.py index ca039be..3d3170b 100644 --- a/models/dojo.py +++ b/models/dojo.py @@ -12,21 +12,23 @@ def __init__(self): self.all_people=[] def create_room(self, name,room_type): - if room_type=='office': + if room_type.lower()=='office'.lower(): room=Office(name) self.offices[name]=room.members self.all_rooms[name]=[room_type,room.members] - elif room_type=='livingspace': + return('An office called %s has been created successfully!'%(name)) + elif room_type.lower()=='livingspace'.lower(): room=LivingSpace(name) self.livingspaces[name]=room.members self.all_rooms[name]=[room_type,room.members] + return('A Livingspace called %s has been created successfully!'%(name)) def add_person(self, firstname,surname,person_type,wants_accomodation='N'): - if person_type=='Fellow': + if person_type.lower()=='Fellow'.lower(): fellow=Fellow(firstname,surname) self.fellows.append([fellow.firstname,fellow.surname]) self.all_people.append([fellow.firstname,fellow.surname]) - elif person_type=='Staff': + elif person_type.lower()=='Staff'.lower(): staff=Staff(firstname,surname) self.staff.append([firstname,surname]) self.all_people.append([firstname,surname]) diff --git a/tests/test_create_room.py b/tests/test_create_room.py index 7bfe4f5..939ef81 100644 --- a/tests/test_create_room.py +++ b/tests/test_create_room.py @@ -11,6 +11,8 @@ def test_create_rooms_successfully(self): spire_office = self.dojo.create_room('Spire','office') self.new_rooms = len(self.dojo.all_rooms) self.assertEqual(self.new_rooms - self.initial_rooms, 2) + self.assertEqual('An office called Spire has been created successfully!',spire_office) + self.assertEqual('A Livingspace called Amity has been created successfully!',amity_livingspace) def test_it_fails_with_existing_room(self): exist_room = self.dojo.create_room('Amhere','office') From 00962746ea4e196c2a9151b6b7e9cf1883880928 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 17:25:24 +0300 Subject: [PATCH 16/22] Refactor tests --- tests/test_create_room.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_create_room.py b/tests/test_create_room.py index 939ef81..cc597ed 100644 --- a/tests/test_create_room.py +++ b/tests/test_create_room.py @@ -26,9 +26,9 @@ def test_it_fails_with_invalid_room_type(self): self.assertEqual('Only offices and livingspaces allowed!',invalid_type) def test_fails_with_room_name_not_string(self): - invalid_room = self.dojo.create_room('[Amhere]','office') + invalid_room = self.dojo.create_room(['Amhere'],'office') invalid_room1 = self.dojo.create_room({'Amhere':'room'},'office') - invalid_room2 = self.dojo.create_room('[Amhere]','livingspace') + invalid_room2 = self.dojo.create_room(['Amhere'],'livingspace') invalid_room3 = self.dojo.create_room({'Amhere':'room'},'livingspace') self.assertEqual(invalid_room,'Room names can only be strings!') self.assertEqual(invalid_room1,'Room names can only be strings!') From 40d79b990f30c70604272e05dc57c0c1e1ae5701 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 17:25:43 +0300 Subject: [PATCH 17/22] Pass tests --- models/dojo.py | 52 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/models/dojo.py b/models/dojo.py index 3d3170b..3a89aae 100644 --- a/models/dojo.py +++ b/models/dojo.py @@ -12,23 +12,39 @@ def __init__(self): self.all_people=[] def create_room(self, name,room_type): - if room_type.lower()=='office'.lower(): - room=Office(name) - self.offices[name]=room.members - self.all_rooms[name]=[room_type,room.members] - return('An office called %s has been created successfully!'%(name)) - elif room_type.lower()=='livingspace'.lower(): - room=LivingSpace(name) - self.livingspaces[name]=room.members - self.all_rooms[name]=[room_type,room.members] - return('A Livingspace called %s has been created successfully!'%(name)) + if room_type.lower() not in ['office','livingspace']: + return('Only offices and livingspaces allowed!') + if not isinstance(name,str): + return('Room names can only be strings!') + if name in self.all_rooms: + return('Room %s exists!'%(name)) + else: + if room_type.lower()=='office'.lower(): + room=Office(name) + self.offices[name]=room.members + self.all_rooms[name]=[room_type,room.members] + return('An office called %s has been created successfully!'%(name)) + elif room_type.lower()=='livingspace'.lower(): + room=LivingSpace(name) + self.livingspaces[name]=room.members + self.all_rooms[name]=[room_type,room.members] + return('A Livingspace called %s has been created successfully!'%(name)) def add_person(self, firstname,surname,person_type,wants_accomodation='N'): - if person_type.lower()=='Fellow'.lower(): - fellow=Fellow(firstname,surname) - self.fellows.append([fellow.firstname,fellow.surname]) - self.all_people.append([fellow.firstname,fellow.surname]) - elif person_type.lower()=='Staff'.lower(): - staff=Staff(firstname,surname) - self.staff.append([firstname,surname]) - self.all_people.append([firstname,surname]) + if person_type.lower() not in ['fellow','staff']: + return('Only fellow and staff allowed!') + if not isinstance(firstname,str) or not isinstance(surname,str): + return('People names can only be strings!') + if firstname+' '+surname in self.all_people: + return('%s %s exists!'%(firstname,surname)) + else: + if person_type.lower()=='fellow': + fellow=Fellow(firstname,surname) + self.fellows.append(firstname +' '+ surname) + self.all_people.append(firstname +' '+ surname) + return('Fellow %s %s has been added successfully!'%(firstname,surname)) + elif person_type.lower()=='staff': + staff=Staff(firstname,surname) + self.staff.append(firstname +' '+ surname) + self.all_people.append(firstname +' '+ surname) + return('Staff %s %s has been added successfully!'%(firstname,surname)) From a05a612eff84a996f1eb3e65038d2b13c259e19a Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 18:14:25 +0300 Subject: [PATCH 18/22] Functional create_room command --- app.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index 1f8f792..8a4563f 100644 --- a/app.py +++ b/app.py @@ -1,7 +1,7 @@ """ Usage: - create_room - add_person [wants_accomodation="N"] + create_room ... + add_person [wants_accomodation] dojo (-i | --interactive) dojo (-h | --help | --version) Options: @@ -54,18 +54,19 @@ def intro(): class DOJO(cmd.Cmd): - instance=Dojo() + prompt = colored('DOJO$$$', 'magenta', attrs=['blink','bold']) @docopt_cmd def do_create_room(self, arg): """Usage: create_room ...""" - pass + for room in arg['']: + print(Dojo().create_room(room,arg[''])) @docopt_cmd def do_add_person(self, arg): - """Usage: add_person [wants_accomodation="N"]""" - pass + """Usage: add_person [wants_accomodation]""" + print(Dojo().add_person(arg['']),arg[''],arg[''],arg['[wants_accomodation]']) @docopt_cmd def do_quit(self, arg): From 61221f9dce5afd02ac0a8043979f4c606c875055 Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 21:15:14 +0300 Subject: [PATCH 19/22] Functional add_person command --- app.py | 9 +++++---- insta.py | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 insta.py diff --git a/app.py b/app.py index 8a4563f..0ff3494 100644 --- a/app.py +++ b/app.py @@ -1,7 +1,7 @@ """ Usage: create_room ... - add_person [wants_accomodation] + add_person [] dojo (-i | --interactive) dojo (-h | --help | --version) Options: @@ -16,6 +16,7 @@ import sys from models.dojo import Dojo from termcolor import colored +from insta import instance def docopt_cmd(func): @@ -61,12 +62,12 @@ class DOJO(cmd.Cmd): def do_create_room(self, arg): """Usage: create_room ...""" for room in arg['']: - print(Dojo().create_room(room,arg[''])) + print(instance.create_room(room,arg[''])) @docopt_cmd def do_add_person(self, arg): - """Usage: add_person [wants_accomodation]""" - print(Dojo().add_person(arg['']),arg[''],arg[''],arg['[wants_accomodation]']) + """Usage: add_person []""" + print(instance.add_person(arg[''],arg[''],arg[''],arg[''])) @docopt_cmd def do_quit(self, arg): diff --git a/insta.py b/insta.py new file mode 100644 index 0000000..1ca9ecf --- /dev/null +++ b/insta.py @@ -0,0 +1,3 @@ +from models.dojo import Dojo + +instance=Dojo() From 56adf0e564ca09e739884ef4486dd5093c8a98ef Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 21:26:55 +0300 Subject: [PATCH 20/22] Update dependencies and travis.yml --- .travis.yml | 4 +--- requirements.txt | 6 ++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index fdbde1a..b211f0e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,9 +4,7 @@ python: # command to install dependencies install: - pip install -r requirements.txt - - pip install pytest - - pip install coveralls - - pip install coverage + # command to run tests script: pytest diff --git a/requirements.txt b/requirements.txt index 51b2bca..c2030fd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,13 @@ appdirs==1.4.3 +coverage==4.3.4 +coveralls==1.1 docopt==0.6.2 +nose==1.3.7 packaging==16.8 +py==1.4.33 pyparsing==2.2.0 +pytest==3.0.7 +requests==2.13.0 six==1.10.0 SQLAlchemy==1.1.9 termcolor==1.1.0 From 40df232e2ca13b78232f31f424f9964371262d4c Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 22:19:01 +0300 Subject: [PATCH 21/22] Random assign office and livngspace --- models/dojo.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/models/dojo.py b/models/dojo.py index 3a89aae..a70ca59 100644 --- a/models/dojo.py +++ b/models/dojo.py @@ -2,6 +2,8 @@ from models.staff import Staff from models.livingspace import LivingSpace from models.office import Office +import random + class Dojo(): def __init__(self): self.offices={} @@ -20,14 +22,14 @@ def create_room(self, name,room_type): return('Room %s exists!'%(name)) else: if room_type.lower()=='office'.lower(): - room=Office(name) - self.offices[name]=room.members - self.all_rooms[name]=[room_type,room.members] + self.room=Office(name) + self.offices[name]=self.room.members + self.all_rooms[name]=[room_type,self.room.members] return('An office called %s has been created successfully!'%(name)) elif room_type.lower()=='livingspace'.lower(): - room=LivingSpace(name) - self.livingspaces[name]=room.members - self.all_rooms[name]=[room_type,room.members] + self.room=LivingSpace(name) + self.livingspaces[name]=self.room.members + self.all_rooms[name]=[room_type,self.room.members] return('A Livingspace called %s has been created successfully!'%(name)) def add_person(self, firstname,surname,person_type,wants_accomodation='N'): @@ -42,9 +44,25 @@ def add_person(self, firstname,surname,person_type,wants_accomodation='N'): fellow=Fellow(firstname,surname) self.fellows.append(firstname +' '+ surname) self.all_people.append(firstname +' '+ surname) + if self.offices: + office=random.choice(list(self.offices)) + self.offices[office].append(firstname +' '+ surname) + print('Fellow %s %s has been assigned office %s!'%(firstname,surname,office)) + else: + print('No office to assign!') + if wants_accomodation=='Y' and self.livingspaces: + room=random.choice(list(self.livingspaces)) + self.livingspaces[room].append(firstname +' '+ surname) + print('Fellow %s %s has been assigned livingspace %s!'%(firstname,surname,room)) return('Fellow %s %s has been added successfully!'%(firstname,surname)) elif person_type.lower()=='staff': staff=Staff(firstname,surname) self.staff.append(firstname +' '+ surname) self.all_people.append(firstname +' '+ surname) + if self.offices: + office=random.choice(list(self.offices)) + self.offices[office].append(firstname +' '+ surname) + print('Staff %s %s has been assigned office %s!'%(firstname,surname,office)) + else: + print('No office to assign!') return('Staff %s %s has been added successfully!'%(firstname,surname)) From f27bb9408f73fe91c910699aa042542a6d1482ec Mon Sep 17 00:00:00 2001 From: JoshuaOndieki Date: Tue, 11 Apr 2017 22:42:22 +0300 Subject: [PATCH 22/22] Update ReadMe --- README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.md b/README.md index aa26f77..888e755 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,28 @@ [![Build Status](https://travis-ci.org/JoshuaOndieki/dojo.svg?branch=master)](https://travis-ci.org/JoshuaOndieki/dojo) # dojo An utterly fantastic CLI application for office Space Allocation + + +## Usage: + `create_room ...` + `add_person []` + +## How to Use + +To use this project, follow these steps: + +1. Create your working environment. +2. Git clone this project (`$ git clone https://github.com/JoshuaOndieki/dojo.git`) +3. (`$ cd dojo`) +4. Install project dependencies (`$ pip install -r requirements.txt`) +5. `python app.py` +6. (`DOJO$$$`) + +## Tests +Run tests with `nosetests` + +## License: [![CocoaPods](https://img.shields.io/cocoapods/l/AFNetworking.svg?style=plastic)]() + +## Further Reading + +- [Docopt](https://github.com/docopt/docopt)