From fd436c5b462947665deb0e435d648cb59268570c Mon Sep 17 00:00:00 2001 From: brianbryank Date: Sun, 30 Jan 2022 10:35:56 +0300 Subject: [PATCH 1/2] update --- models/engine/__init__.py | 0 models/engine/file_storage.py | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 models/engine/__init__.py create mode 100755 models/engine/file_storage.py diff --git a/models/engine/__init__.py b/models/engine/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py new file mode 100755 index 0000000..d63ffae --- /dev/null +++ b/models/engine/file_storage.py @@ -0,0 +1,48 @@ +#!/usr/bin/python3 +""" +FileStorage that serializes and deserializes instances to a JSON file +""" +import json +import os.path +from models.base_model import BaseModel +from models.user import User +from models.city import City +from models.place import Place +from models.review import Review +from models.state import State +from models.amenity import Amenity + + +class FileStorage: + """ String representing a simple data structure in JSON format. + ex: '{ "12": { "numbers": [1, 2, 3], "name": "John" } }' + """ + __file_path = "file.json" + __objects = {} + + def all(self): + """ returns the dictionary __objects """ + return self.__objects + + def new(self, obj): + """ + sets in __objects the obj with key .id + """ + dict_key = obj.__class__.__name__ + '.' + obj.id + self.__objects.update({dict_key: obj}) + + def save(self): + """ serializes __objects to the JSON file """ + dict = {} + for key in self.__objects: + dict[key] = self.__objects[key].to_dict() + with open(self.__file_path, "w") as f: + json.dump(dict, f) + + def reload(self): + """ deserializes the JSON file to __objects """ + if os.path.isfile(self.__file_path): + with open(self.__file_path, "r") as f: + json_obj = json.load(f) + for key, val in json_obj.items(): + self.__objects[key] = eval(val["__class__"])(**val) From 5ce638d69a80db87165d77acd468f520b6cbc156 Mon Sep 17 00:00:00 2001 From: brianbryank Date: Sun, 30 Jan 2022 10:36:40 +0300 Subject: [PATCH 2/2] update --- models/__init__.py | 12 +++- models/amenity.py | 8 +++ models/base_model.py | 81 ++++++++++++----------- models/city.py | 11 ++++ models/place.py | 22 +++++++ models/review.py | 12 ++++ models/state.py | 10 +++ models/user.py | 13 ++++ tests/test_models/test_amenity.py | 44 +++++++++++++ tests/test_models/test_base_model.py | 97 ++++++++++++++++++++++++++++ tests/test_models/test_city.py | 49 ++++++++++++++ tests/test_models/test_place.py | 49 ++++++++++++++ tests/test_models/test_review.py | 33 ++++++++++ tests/test_models/test_state.py | 31 +++++++++ tests/test_models/test_user.py | 27 ++++++++ web_static/8-index.html | 6 +- 16 files changed, 462 insertions(+), 43 deletions(-) create mode 100755 models/amenity.py create mode 100755 models/city.py create mode 100755 models/place.py create mode 100755 models/review.py create mode 100755 models/state.py create mode 100755 models/user.py mode change 100644 => 100755 tests/test_models/test_amenity.py diff --git a/models/__init__.py b/models/__init__.py index d6b4641..4b79372 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,7 +1,15 @@ #!/usr/bin/python3 -"""__init__ magic method for models directory""" +""" + __init__ modules +""" from models.engine.file_storage import FileStorage - +from .base_model import BaseModel +from .user import User +from .review import Review +from .city import City +from .amenity import Amenity +from .place import Place +from .state import State storage = FileStorage() storage.reload() diff --git a/models/amenity.py b/models/amenity.py new file mode 100755 index 0000000..0bb8952 --- /dev/null +++ b/models/amenity.py @@ -0,0 +1,8 @@ +#!/usr/bin/python +""" class Amenity""" +from models.base_model import BaseModel + + +class Amenity(BaseModel): + """Representation of Amenity""" + name = "" diff --git a/models/base_model.py b/models/base_model.py index 47cd019..2f8a577 100755 --- a/models/base_model.py +++ b/models/base_model.py @@ -1,51 +1,56 @@ #!/usr/bin/python3 -"""Defines the BaseModel class.""" -import models -from uuid import uuid4 +""" +a base class for other classes to use from it +""" from datetime import datetime +from uuid import uuid4 +import models class BaseModel: - """Represents the BaseModel of the HBnB project.""" + """ + Base Class of AirBnb Console + """ def __init__(self, *args, **kwargs): - """Initialize a new BaseModel. - - Args: - *args (any): Unused. - **kwargs (dict): Key/value pairs of attributes. - """ - tform = "%Y-%m-%dT%H:%M:%S.%f" - self.id = str(uuid4()) - self.created_at = datetime.today() - self.updated_at = datetime.today() - if len(kwargs) != 0: - for k, v in kwargs.items(): - if k == "created_at" or k == "updated_at": - self.__dict__[k] = datetime.strptime(v, tform) - else: - self.__dict__[k] = v - else: + """ + Init of Object + """ + if len(kwargs) == 0: + self.id = str(uuid4()) + self.created_at = datetime.now() + self.updated_at = self.created_at models.storage.new(self) + models.storage.save() + else: + kwargs["created_at"] = datetime.strptime(kwargs["created_at"], + "%Y-%m-%dT%H:%M:%S.%f") + kwargs["updated_at"] = datetime.strptime(kwargs["updated_at"], + "%Y-%m-%dT%H:%M:%S.%f") + for key, val in kwargs.items(): + if "__class__" not in key: + setattr(self, key, val) + + def __str__(self): + """ + print the instance + """ + return "[{:s}] ({:s}) {}".format(self.__class__.__name__, self.id, + self.__dict__) def save(self): - """Update updated_at with the current datetime.""" - self.updated_at = datetime.today() + """ + updates the public instance attribute + """ + self.updated_at = datetime.now() models.storage.save() def to_dict(self): - """Return the dictionary of the BaseModel instance. - - Includes the key/value pair __class__ representing - the class name of the object. - """ - rdict = self.__dict__.copy() - rdict["created_at"] = self.created_at.isoformat() - rdict["updated_at"] = self.updated_at.isoformat() - rdict["__class__"] = self.__class__.__name__ - return rdict - - def __str__(self): - """Return the print/str representation of the BaseModel instance.""" - clname = self.__class__.__name__ - return "[{}] ({}) {}".format(clname, self.id, self.__dict__) + """ + returns a dictionary containing all keys/values + """ + temp = dict(self.__dict__) + temp['__class__'] = self.__class__.__name__ + temp['updated_at'] = self.updated_at.strftime("%Y-%m-%dT%H:%M:%S.%f") + temp['created_at'] = self.created_at.strftime("%Y-%m-%dT%H:%M:%S.%f") + return temp diff --git a/models/city.py b/models/city.py new file mode 100755 index 0000000..6673791 --- /dev/null +++ b/models/city.py @@ -0,0 +1,11 @@ +#!/usr/bin/python3 +""" + class City that inherits from BaseModel +""" +from models.base_model import BaseModel + + +class City(BaseModel): + """ defining City class """ + name = "" + state_id = "" diff --git a/models/place.py b/models/place.py new file mode 100755 index 0000000..684cdd7 --- /dev/null +++ b/models/place.py @@ -0,0 +1,22 @@ +#!/usr/bin/python3 +""" + Place modules +""" +from models.base_model import BaseModel + + +class Place(BaseModel): + """ + Place Class inherit from base + """ + city_id = "" + user_id = "" + name = "" + description = "" + number_rooms = 0 + number_bathrooms = 0 + max_guest = 0 + price_by_night = 0 + latitude = 0.0 + longitude = 0.0 + amenity_ids = [] diff --git a/models/review.py b/models/review.py new file mode 100755 index 0000000..ae0917f --- /dev/null +++ b/models/review.py @@ -0,0 +1,12 @@ +#!/usr/bin/python3 +""" + class Review that inherits from BaseModel +""" +from models.base_model import BaseModel + + +class Review(BaseModel): + """ defining User class """ + place_id = "" + user_id = "" + text = "" diff --git a/models/state.py b/models/state.py new file mode 100755 index 0000000..c104473 --- /dev/null +++ b/models/state.py @@ -0,0 +1,10 @@ +#!/usr/bin/python3 +""" + class State that inherits from BaseModel +""" +from models.base_model import BaseModel + + +class State(BaseModel): + """ defining State class """ + name = "" diff --git a/models/user.py b/models/user.py new file mode 100755 index 0000000..5100bcd --- /dev/null +++ b/models/user.py @@ -0,0 +1,13 @@ +#!/usr/bin/python3 +""" + class User that inherits from BaseModel +""" +from models.base_model import BaseModel + + +class User(BaseModel): + """ defining User class """ + email = "" + password = "" + first_name = "" + last_name = "" diff --git a/tests/test_models/test_amenity.py b/tests/test_models/test_amenity.py old mode 100644 new mode 100755 index e69de29..91ffdea --- a/tests/test_models/test_amenity.py +++ b/tests/test_models/test_amenity.py @@ -0,0 +1,44 @@ +#!/usr/bin/python3 +"""Amenity""" +import unittest +from models.base_model import BaseModel +from models.city import City +from models.place import Place +from models.amenity import Amenity +from models.state import State +from models.review import Review + + +class Testamenity(unittest.TestCase): + """unit test""" + def test_class(self): + amen = Amenity() + self.assertEqual(amen.__class__.__name__, "Amenity") + + def test_base(self): + amen = Amenity() + self.assertTrue(issubclass(amen.__class__, BaseModel)) + + def test_amenity(self): + """Test attributes of Class Amenity""" + amenity = Amenity() + self.Assert true(hasattr(amenity, "name")) + self.assertEqual(amenity.name, "") + + def test_dict_value(self): + """ + test dict values + """ + time_format = "%Y-%m-%dT%H:%M:%S.%f" + inst = Amenity() + dict_con = inst.to_dict() + self.assertEqual(dict_con["__class__"], "Amenity") + self.assertEqual(type(dict_con["created_at"]), str) + self.assertEqual(type(dict_con["updated_at"]), str) + self.assertEqual( + dict_con["created_at"], + inst.created_at.strftime(time_format) + ) + self.assertEqual( + dict_con["updated_at"], + inst.updated_at.strftime(time_format)) diff --git a/tests/test_models/test_base_model.py b/tests/test_models/test_base_model.py index e69de29..8687860 100644 --- a/tests/test_models/test_base_model.py +++ b/tests/test_models/test_base_model.py @@ -0,0 +1,97 @@ +#!/usr/bin/python3 +""" + Unit Testing For BaseModel class +""" +from models import BaseModel +import unittest +from unittest import mock +import inspect +import time +from datetime import datetime +import models + + +class TestBaseModel(unittest.TestCase): + """ Testing the Base Class """ + def test_doc1(self): + """test documentation for module""" + res = "Module has no documenation" + self.assertIsNotNone(models.base_model.__doc__, res) + + def test_doc2(self): + """test documentation for class""" + res = "Module has no documenation" + self.assertIsNotNone(models.base_model.BaseModel.__doc__, res) + + def test_doc3(self): + """testing for methods""" + res = "method init has no documenation" + self.assertIsNotNone(models.base_model.BaseModel.__init__.__doc__, res) + res1 = "method __str__ has no documenation" + self.assertIsNotNone(models.base_model.BaseModel.__str__.__doc__, res1) + res2 = "method save has no documenation" + self.assertIsNotNone(models.base_model.BaseModel.save.__doc__, res2) + res3 = "method to_dict has no documenation" + self.assertIsNotNone(models.base_model.BaseModel.to_dict.__doc__, res3) + + def test_str(self): + """ + test str method + """ + instance = BaseModel() + correct_str = "[BaseModel] ({}) {}".format( + instance.id, + instance.__dict__ + ) + self.assertEqual(correct_str, str(instance)) + + def to_dict_value(self): + """ + test return value of dict + """ + ti = "%Y-%m-%dT%H:%M:%S.%f" + inst = BaseModel() + dict_base = instance.to_dict() + self.assertEqual(dict_base["__class__"], "BaseModel") + self.assertEqual(type(dict_base["created_at"]), str) + self.assertEqual(type(dict_base["updated_at"]), str) + self.assertEqual( + dict_base["created_at"], + inst.created_at.strftime(ti) + ) + self.assertEqual( + dict_base["updated_at"], + inst.updated_at.strftime(ti) + ) + + def test_to_dict(self): + """ + test to dic method + """ + inst = BaseModel() + inst.name = "kal" + dict_inst = inst.to_dict() + attr = [ + "id", + "created_at", + "updated_at", + "name", + "__class__"] + self.assertCountEqual(dict_inst.keys(), attr) + self.assertEqual(dict_inst['__class__'], 'BaseModel') + self.assertEqual(dict_inst['name'], "kal") + + @mock.patch("models.storage") + def test_save(self, mock_storage): + """ + test save and update + """ + instance = BaseModel() + old_value_created = instance.created_at + old_value_update = instance.updated_at + instance.save() + new_value_created = instance.created_at + new_value_updated = instance.updated_at + self.assertNotEqual(old_value_update, new_value_updated) + self.assertEqual(old_value_created, new_value_created) + self.assertTrue(mock_storage.save.called) diff --git a/tests/test_models/test_city.py b/tests/test_models/test_city.py index e69de29..8310a11 100644 --- a/tests/test_models/test_city.py +++ b/tests/test_models/test_city.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 +"""Test City""" +import unittest +from models.base_model import BaseModel +from models.city import City +from models.place import Place +from models.amenity import Amenity +from models.state import State +from models.review import Review +from models.user import User + + +class Testcity(unittest.TestCase): + """unit test""" + def test_class(self): + city1 = City() + self.assertEqual(city1.__class__.__name__, "City") + + def test_dict_value(self): + """ + test dict values + """ + time_format = "%Y-%m-%dT%H:%M:%S.%f" + city = City() + dict_con = city.to_dict() + self.assertEqual(dict_con["__class__"], "City") + self.assertEqual(type(dict_con["created_at"]), str) + self.assertEqual(type(dict_con["updated_at"]), str) + self.assertEqual( + dict_con["created_at"], + city.created_at.strftime(time_format) + ) + self.assertEqual( + dict_con["updated_at"], + city.updated_at.strftime(time_format)) + + def test_base(self): + city1 = City() + self.assertTrue(issubclass(city1.__class__, BaseModel)) + + def test_city(self): + """ + Test attributes of Class City + """ + my_city = City() + self.assertTrue(hasattr(mycity, "name")) + self.assertEqual(my_city.name, "") + self.assertTrue(hasattr(mycity, "state_id")) + self.assertEqual(my_city.state_id, "") diff --git a/tests/test_models/test_place.py b/tests/test_models/test_place.py index e69de29..8310a11 100644 --- a/tests/test_models/test_place.py +++ b/tests/test_models/test_place.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 +"""Test City""" +import unittest +from models.base_model import BaseModel +from models.city import City +from models.place import Place +from models.amenity import Amenity +from models.state import State +from models.review import Review +from models.user import User + + +class Testcity(unittest.TestCase): + """unit test""" + def test_class(self): + city1 = City() + self.assertEqual(city1.__class__.__name__, "City") + + def test_dict_value(self): + """ + test dict values + """ + time_format = "%Y-%m-%dT%H:%M:%S.%f" + city = City() + dict_con = city.to_dict() + self.assertEqual(dict_con["__class__"], "City") + self.assertEqual(type(dict_con["created_at"]), str) + self.assertEqual(type(dict_con["updated_at"]), str) + self.assertEqual( + dict_con["created_at"], + city.created_at.strftime(time_format) + ) + self.assertEqual( + dict_con["updated_at"], + city.updated_at.strftime(time_format)) + + def test_base(self): + city1 = City() + self.assertTrue(issubclass(city1.__class__, BaseModel)) + + def test_city(self): + """ + Test attributes of Class City + """ + my_city = City() + self.assertTrue(hasattr(mycity, "name")) + self.assertEqual(my_city.name, "") + self.assertTrue(hasattr(mycity, "state_id")) + self.assertEqual(my_city.state_id, "") diff --git a/tests/test_models/test_review.py b/tests/test_models/test_review.py index e69de29..987d310 100644 --- a/tests/test_models/test_review.py +++ b/tests/test_models/test_review.py @@ -0,0 +1,33 @@ +#!/usr/bin/python3 +"""Test Review""" +import unittest +from models.base_model import BaseModel +from models.city import City +from models.place import Place +from models.amenity import Amenity +from models.state import State +from models.review import Review +from models.user import User + + +class Testreview(unittest.TestCase): + """unit test""" + def test_class(self): + rev1 = Review() + self.assertEqual(rev1.__class__.__name__, "Review") + + def test_father(self): + rev1 = Review() + self.assertTrue(issubclass(rev1.__class__, BaseModel)) + + def test_review(self): + """ + Test review + """ + my_review = Review() + self.assertTrue(hasattr(my_review, "place_id")) + self.assertEqual(my_review.place_id, "") + self.assertTrue(hasattr(my_review, "user_id")) + self.assertEqual(my_review.user_id, "") + self.assertTrue(hasattr(my_review, "text")) + self.assertEqual(my_review.text, "") diff --git a/tests/test_models/test_state.py b/tests/test_models/test_state.py index e69de29..666306d 100644 --- a/tests/test_models/test_state.py +++ b/tests/test_models/test_state.py @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +""" + Test Case for state Model +""" +from models import BaseModel +from models import State +import unittest +import models + + +class Teststate(unittest.TestCase): + """ + unitesst for state class + """ + def issub_class(self): + """ + test if state class is sub class of base model + """ + state = State() + self.assertIsInstance(state, BaseModel) + self.assertTrue(hasattr(state, "id")) + self.assertTrue(hasattr(state, "created_at")) + self.assertTrue(hasattr(state, "update_at")) + + def test_name_attr(self): + """ + Test that State has attribute name + """ + state = State() + self.assertTrue(hasattr(state, "name")) + self.assertEqual(state.name, "") diff --git a/tests/test_models/test_user.py b/tests/test_models/test_user.py index e69de29..b9597b2 100644 --- a/tests/test_models/test_user.py +++ b/tests/test_models/test_user.py @@ -0,0 +1,27 @@ +#!/usr/bin/python3 +"""Test User""" +import unittest +from models.base_model import BaseModel +from models.city import City +from models.place import Place +from models.amenity import Amenity +from models.state import State +from models.review import Review +from models.user import User + + +class Testuser(unittest.TestCase): + """unit test""" + def test_User(self): + """ + Test Class Use + """ + my_user = User() + self.assertTrue(hasattr(my_user, "first_name")) + self.assertEqual(my_user.first_name, "") + self.assertTrue(hasattr(my_user, "last_name")) + self.assertEqual(my_user.last_name, "") + self.assertTrue(hasattr(my_user, "email")) + self.assertEqual(my_user.email, "") + self.assertTrue(hasattr(my_user, "password")) + self.assertEqual(my_user.password, "") diff --git a/web_static/8-index.html b/web_static/8-index.html index cabf3ab..cf1a563 100644 --- a/web_static/8-index.html +++ b/web_static/8-index.html @@ -62,7 +62,7 @@

My home

1 Bathroom
-Owner: KAlI ALX +Owner: brianbryank
This is a lovely bedroom and 1 bathroom apatment taht can accomadate 2 people. @@ -79,7 +79,7 @@

Tiny house

1 Bathroom
-Owner: John Lervon +Owner:Amos cm
This is a lovely bedroom and 1 bathroom apatment taht can accomadate 2 people. @@ -96,7 +96,7 @@

A suite

1 Bathroom
-Owner: Mr. Mine +Owner: Mr. Rotich
This is my personal project.