From b9d1767e788b30aded8989ce67fdc14ab9e30dd0 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Sat, 24 Mar 2018 03:02:55 +0000 Subject: [PATCH 01/23] Update readme --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ebb8f58..72b191af 100644 --- a/README.md +++ b/README.md @@ -52,4 +52,10 @@ from the root directory. ## Bugs -+ No known bugs at this time. \ No newline at end of file ++ No known bugs at this time. + +## Authors +* [Binita Rai](https://github.com/rayraib) +* [Steven Garcia](https://github.com/stvngrcia) +* [Sue Kalia](https://github.com/vkalia602) +* [Yunju Chen](https://github.com/yunjuc) From f27a85e5911b1af69e621417abe4d69f91299cd3 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Sat, 24 Mar 2018 03:12:47 +0000 Subject: [PATCH 02/23] Update authors --- AUTHORS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 6894840c..d20fb2ab 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,4 +1,6 @@ # This file lists all individuals having contributed content to the repository. Steven Garcia -Binita Rai \ No newline at end of file +Binita Rai +Yunju Chen +Sue Kalia <267@holbertonschool.com> From 50181fb35778964add5580ce1917c7768380d9e5 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Sat, 24 Mar 2018 06:28:14 +0000 Subject: [PATCH 03/23] First commit --- setup_mysql_dev.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 setup_mysql_dev.sql diff --git a/setup_mysql_dev.sql b/setup_mysql_dev.sql new file mode 100644 index 00000000..aef0474b --- /dev/null +++ b/setup_mysql_dev.sql @@ -0,0 +1,7 @@ +-- Set up MYSQL development + +CREATE DATABASE IF NOT EXISTS hbnb_dev_db; +CREATE USER IF NOT EXISTS 'hbnb_dev'@'localhost' IDENTIFIED BY 'hbnb_dev_pwd'; +GRANT ALL PRIVILEGES ON hbnb_dev_db . * TO 'hbnb_dev'@'localhost'; +GRANT SELECT ON performance_schema . * TO 'hbnb_dev'@'localhost'; +FLUSH PRIVILEGES; From 843510170011166ae201271329bf1ecebd421e1f Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Sat, 24 Mar 2018 06:36:37 +0000 Subject: [PATCH 04/23] First commit --- setup_mysql_test.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 setup_mysql_test.sql diff --git a/setup_mysql_test.sql b/setup_mysql_test.sql new file mode 100644 index 00000000..a8a7678d --- /dev/null +++ b/setup_mysql_test.sql @@ -0,0 +1,7 @@ +-- Set up MYSQL test + +CREATE DATABASE IF NOT EXISTS hbnb_test_db; +CREATE USER IF NOT EXISTS 'hbnb_test'@'localhost' IDENTIFIED BY 'hbnb_test_pwd'; +GRANT ALL PRIVILEGES ON hbnb_test_db . * TO 'hbnb_test'@'localhost'; +GRANT SELECT ON performance_schema . * TO 'hbnb_test'@'localhost'; +FLUSH PRIVILEGES; From 4738eb4f1072c255d2159f53a0572f34c58ac20d Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Sat, 24 Mar 2018 20:39:30 +0000 Subject: [PATCH 05/23] Add delete function --- models/engine/file_storage.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 8c0afacd..53405432 100755 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -13,7 +13,7 @@ class FileStorage: __file_path = "file.json" __objects = {} - def all(self): + def all(self, cls=None): ''' Return the dictionary ''' @@ -53,3 +53,10 @@ def reload(self): FileStorage.__objects[key] = class_name(**val) except FileNotFoundError: pass + + def delete(self, obj=None): + ''' + Delete an object from __objects. + ''' + key = str(obj.__class__.__name__) + "." + str(obj.id) + del FileStorage.__objects[key] From 208fbf7a2087c8d6a4f99cbbe7bf616e84ca2165 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Sat, 24 Mar 2018 21:22:51 +0000 Subject: [PATCH 06/23] Add test case --- tests/test_models/test_engine/test_file_storage.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_models/test_engine/test_file_storage.py b/tests/test_models/test_engine/test_file_storage.py index 063c488c..da4e3fdd 100755 --- a/tests/test_models/test_engine/test_file_storage.py +++ b/tests/test_models/test_engine/test_file_storage.py @@ -101,3 +101,14 @@ def test_reaload_without_file(self): self.assertTrue(True) except: self.assertTrue(False) + + def test_delete_method(self): + ''' + Tests that the delete method removes an object from the + FileStorage.__object + ''' + self.storage.new(self.my_model) + key = str(self.my_model.__class__.__name__ + "." + self.my_model.id) + self.assertTrue(key in self.storage._FileStorage__objects) + self.storage.delete(self.my_model) + self.assertFalse(key in self.storage._FileStorage__objects) From af1b2c69d61facc0ad84cf355174e1373ccd1388 Mon Sep 17 00:00:00 2001 From: vkalia602 Date: Sun, 25 Mar 2018 01:17:34 +0000 Subject: [PATCH 07/23] Added content to create function --- console.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/console.py b/console.py index 97c38d78..73190dcf 100755 --- a/console.py +++ b/console.py @@ -39,15 +39,36 @@ def do_create(self, args): Create a new instance of class BaseModel and saves it to the JSON file. ''' + new_dict = {} + args_list = [] + if len(args) == 0: print("** class name missing **") return + args = shlex.split(args) + class_name = args[0] + + for i in range(1, len(args)): + args_list.append(args[i].split("=")) + + for i in range(len(args_list)): + value = args_list[i][1] + value = value.replace("_", " ") + value = value.replace('"', '\"') + if value.isdigit(): + if value.find('.'): + value = float(value) + else: + value = int(value) + new_dict[args_list[i][0]] = value + try: - args = shlex.split(args) - new_instance = eval(args[0])() + new_instance = eval(class_name)() + for key, val in new_dict.items(): + setattr(new_instance, key, val) + new_instance.save() print(new_instance.id) - except: print("** class doesn't exist **") From 5b5093e84ea20ecec157c6204a5dfaf875cdd77b Mon Sep 17 00:00:00 2001 From: vkalia602 Date: Sun, 25 Mar 2018 19:51:08 +0000 Subject: [PATCH 08/23] new updates --- console.py | 8 ++++++-- file.json | 1 + models/base_model.py | 24 ++++++++++++++++++++---- models/city.py | 12 +++++++----- models/state.py | 9 +++++---- test_params_create | 6 ++++++ tests/test_console.py | 4 ++++ 7 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 file.json create mode 100644 test_params_create diff --git a/console.py b/console.py index 73190dcf..3c180a66 100755 --- a/console.py +++ b/console.py @@ -45,7 +45,7 @@ def do_create(self, args): if len(args) == 0: print("** class name missing **") return - args = shlex.split(args) + args = shlex.split(args, posix=False) class_name = args[0] for i in range(1, len(args)): @@ -60,7 +60,11 @@ def do_create(self, args): value = float(value) else: value = int(value) - new_dict[args_list[i][0]] = value + new_dict[args_list[i][0]] = value + elif value.startswith('"') and value.endswith('"'): + new_dict[args_list[i][0]] = value + else: + pass try: new_instance = eval(class_name)() diff --git a/file.json b/file.json new file mode 100644 index 00000000..cefce139 --- /dev/null +++ b/file.json @@ -0,0 +1 @@ +{"State.ea524cfc-0b84-4a27-b5a7-00c61ff2f3b9": {"created_at": "2018-03-25T01:11:08.001525", "id": "ea524cfc-0b84-4a27-b5a7-00c61ff2f3b9", "name": "Arizona", "updated_at": "2018-03-25T01:11:08.001553", "__class__": "State"}, "State.743b5529-2540-43ff-9801-8b94b029740d": {"created_at": "2018-03-25T00:56:39.953954", "id": "743b5529-2540-43ff-9801-8b94b029740d", "name": "Arizona", "updated_at": "2018-03-25T00:56:39.953976", "__class__": "State"}, "State.7dc1e60d-9f6b-4bd0-bb8d-17839bc02112": {"created_at": "2018-03-25T01:11:08.000360", "id": "7dc1e60d-9f6b-4bd0-bb8d-17839bc02112", "name": "California", "updated_at": "2018-03-25T01:11:08.000388", "__class__": "State"}, "Place.86b08f5e-b448-4a4c-b289-de3e976a5840": {"created_at": "2018-03-25T00:56:39.960636", "city_id": "0001", "latitude": "37.773972", "price_by_night": "300", "name": "My little house", "number_bathrooms": "2", "user_id": "0001", "longitude": "-122.431297", "updated_at": "2018-03-25T00:56:39.960669", "__class__": "Place", "number_rooms": "4", "id": "86b08f5e-b448-4a4c-b289-de3e976a5840", "max_guest": "10"}, "State.60df8bca-8e3f-4a43-bdeb-450f921cf18a": {"created_at": "2018-03-25T00:56:39.952821", "id": "60df8bca-8e3f-4a43-bdeb-450f921cf18a", "name": "California", "updated_at": "2018-03-25T00:56:39.952846", "__class__": "State"}, "Place.928de0dd-76a5-4205-86a8-0c9375fef064": {"created_at": "2018-03-25T01:11:08.003392", "city_id": 1.0, "latitude": "37.773972", "price_by_night": 300.0, "name": "My little house", "number_bathrooms": 2.0, "user_id": 1.0, "longitude": "-122.431297", "updated_at": "2018-03-25T01:11:08.003416", "__class__": "Place", "number_rooms": 4.0, "id": "928de0dd-76a5-4205-86a8-0c9375fef064", "max_guest": 10.0}} \ No newline at end of file diff --git a/models/base_model.py b/models/base_model.py index aa633ba3..30613337 100755 --- a/models/base_model.py +++ b/models/base_model.py @@ -5,21 +5,27 @@ import uuid from datetime import datetime import models +from sqlalchemy import Column, Integer, String +from sqlalchemy.ext.declarative import declarative_base +Base = declarative_base() class BaseModel: ''' Base class for other classes to be used for the duration. ''' + id = Column(String(60), primary_key=True, nullable=False) + created_at = Column(DateTime, default=datetime.utcnow(), nullable = False) + updated_at = Column(DateTime, default=datetime.utcnow(), nullable = False) + def __init__(self, *args, **kwargs): ''' Initialize public instance attributes. ''' if (len(kwargs) == 0): self.id = str(uuid.uuid4()) - self.created_at = datetime.now() - self.updated_at = datetime.now() - models.storage.new(self) + self.created_at = datetime.utcnow() + self.updated_at = datetime.utcnow() else: kwargs["created_at"] = datetime.strptime(kwargs["created_at"], "%Y-%m-%dT%H:%M:%S.%f") @@ -47,6 +53,7 @@ def save(self): ''' Update the updated_at attribute with new. ''' + models.storage.new(self) self.updated_at = datetime.now() models.storage.save() @@ -58,5 +65,14 @@ def to_dict(self): cp_dct['__class__'] = self.__class__.__name__ cp_dct['updated_at'] = self.updated_at.strftime("%Y-%m-%dT%H:%M:%S.%f") cp_dct['created_at'] = self.created_at.strftime("%Y-%m-%dT%H:%M:%S.%f") - + try: + cp_dct.pop("_sa_instance_state") + except KeyError: + pass return (cp_dct) + + def delete(self): + ''' + Method to delete current instance from the storage + ''' + models.storage.delete() diff --git a/models/city.py b/models/city.py index 8cc96e34..a8c74cd6 100755 --- a/models/city.py +++ b/models/city.py @@ -2,12 +2,14 @@ ''' Define the class City. ''' -from models.base_model import BaseModel +from models.base_model import BaseModel, Base +from sqlalchemy.ext.declarative import declared_attr +from sqlalchemy import Column, Integer, String, ForeignKey - -class City(BaseModel): +class City(BaseModel, Base): ''' Define the class City that inherits from BaseModel. ''' - state_id = "" - name = "" + __tablename__ = 'cities' + name = Column(String(128), nullable=False) + state_id = Column(String(60), nullable=False, ForeignKey('states.id')) diff --git a/models/state.py b/models/state.py index 49d08e29..d9cf25f3 100755 --- a/models/state.py +++ b/models/state.py @@ -3,11 +3,12 @@ Implementation of the State class ''' -from models.base_model import BaseModel +from models.base_model import BaseModel, Base +from sqlalchemy import Column, Integer, String, ForeignKey - -class State(BaseModel): +class State(BaseModel, Base): ''' Implementation for the State. ''' - name = "" + __tablename__ = 'states' + name = Column(String(128), nullable=False) diff --git a/test_params_create b/test_params_create new file mode 100644 index 00000000..208e1c67 --- /dev/null +++ b/test_params_create @@ -0,0 +1,6 @@ +create State name="California" +create State name="Arizona" +all State + +create Place city_id="0001" user_id="0001" name="My_little_house" number_rooms=4 number_bathrooms=2 max_guest=10 price_by_night=30.0 latitude=37.773972 longitude=-122.431297 +all Place \ No newline at end of file diff --git a/tests/test_console.py b/tests/test_console.py index 3e543811..c7588660 100755 --- a/tests/test_console.py +++ b/tests/test_console.py @@ -142,3 +142,7 @@ def test_update(self): self.assertTrue(console.onecmd("update")) ''' + ''' + New Tests for project 0x02. AirBnB clone - MySQL + + ''' From 375ad716d4b18f45de112190ef668228faf99d81 Mon Sep 17 00:00:00 2001 From: vkalia602 Date: Mon, 26 Mar 2018 04:56:35 +0000 Subject: [PATCH 09/23] Added things --- file.json | 1 - models/__init__.py | 16 +++++++++-- models/base_model.py | 4 +-- models/city.py | 12 ++++++-- models/engine/#__init__.py# | 4 +++ models/engine/db_storage.py | 55 ++++++++++++++++++++++++++++++++++++ models/engine/db_storage.py~ | 54 +++++++++++++++++++++++++++++++++++ models/state.py | 10 +++++-- 8 files changed, 145 insertions(+), 11 deletions(-) delete mode 100644 file.json create mode 100755 models/engine/#__init__.py# create mode 100755 models/engine/db_storage.py create mode 100755 models/engine/db_storage.py~ diff --git a/file.json b/file.json deleted file mode 100644 index cefce139..00000000 --- a/file.json +++ /dev/null @@ -1 +0,0 @@ -{"State.ea524cfc-0b84-4a27-b5a7-00c61ff2f3b9": {"created_at": "2018-03-25T01:11:08.001525", "id": "ea524cfc-0b84-4a27-b5a7-00c61ff2f3b9", "name": "Arizona", "updated_at": "2018-03-25T01:11:08.001553", "__class__": "State"}, "State.743b5529-2540-43ff-9801-8b94b029740d": {"created_at": "2018-03-25T00:56:39.953954", "id": "743b5529-2540-43ff-9801-8b94b029740d", "name": "Arizona", "updated_at": "2018-03-25T00:56:39.953976", "__class__": "State"}, "State.7dc1e60d-9f6b-4bd0-bb8d-17839bc02112": {"created_at": "2018-03-25T01:11:08.000360", "id": "7dc1e60d-9f6b-4bd0-bb8d-17839bc02112", "name": "California", "updated_at": "2018-03-25T01:11:08.000388", "__class__": "State"}, "Place.86b08f5e-b448-4a4c-b289-de3e976a5840": {"created_at": "2018-03-25T00:56:39.960636", "city_id": "0001", "latitude": "37.773972", "price_by_night": "300", "name": "My little house", "number_bathrooms": "2", "user_id": "0001", "longitude": "-122.431297", "updated_at": "2018-03-25T00:56:39.960669", "__class__": "Place", "number_rooms": "4", "id": "86b08f5e-b448-4a4c-b289-de3e976a5840", "max_guest": "10"}, "State.60df8bca-8e3f-4a43-bdeb-450f921cf18a": {"created_at": "2018-03-25T00:56:39.952821", "id": "60df8bca-8e3f-4a43-bdeb-450f921cf18a", "name": "California", "updated_at": "2018-03-25T00:56:39.952846", "__class__": "State"}, "Place.928de0dd-76a5-4205-86a8-0c9375fef064": {"created_at": "2018-03-25T01:11:08.003392", "city_id": 1.0, "latitude": "37.773972", "price_by_night": 300.0, "name": "My little house", "number_bathrooms": 2.0, "user_id": 1.0, "longitude": "-122.431297", "updated_at": "2018-03-25T01:11:08.003416", "__class__": "Place", "number_rooms": 4.0, "id": "928de0dd-76a5-4205-86a8-0c9375fef064", "max_guest": 10.0}} \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index 7d34021f..f977f93c 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -3,7 +3,6 @@ Package initializer ''' -from models.engine.file_storage import FileStorage from models.base_model import BaseModel from models.user import User from models.place import Place @@ -11,11 +10,22 @@ from models.city import City from models.amenity import Amenity from models.review import Review +from os import getenv classes = {"User": User, "BaseModel": BaseModel, "Place": Place, "State": State, "City": City, "Amenity": Amenity, "Review": Review} -storage = FileStorage() -storage.reload() +HBNB_MYSQL_USER = getenv('HBNB_MYSQL_USER') +HBNB_MYSQL_PWD = getenv('HBNB_MYSQL_PWD') +HBNB_MYSQL_HOST = getenv('HBNB_MYSQL_HOST') +HBNB_MYSQL_DB = getenv('HBNB_MYSQL_DB') +HBNB_TYPE_STORAGE = getenv('HBNB_TYPE_STORAGE') + +if HBNB_TYPE_STORAGE == 'db': + from engine.dbstorage import DBStorage +else: + from models.engine.file_storage import FileStorage + storage = FileStorage() + storage.reload() diff --git a/models/base_model.py b/models/base_model.py index 30613337..17550085 100755 --- a/models/base_model.py +++ b/models/base_model.py @@ -5,7 +5,7 @@ import uuid from datetime import datetime import models -from sqlalchemy import Column, Integer, String +from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() @@ -75,4 +75,4 @@ def delete(self): ''' Method to delete current instance from the storage ''' - models.storage.delete() + models.storage.delete(self) diff --git a/models/city.py b/models/city.py index a8c74cd6..23960800 100755 --- a/models/city.py +++ b/models/city.py @@ -3,13 +3,19 @@ Define the class City. ''' from models.base_model import BaseModel, Base +from models.state import State from sqlalchemy.ext.declarative import declared_attr from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import relationship class City(BaseModel, Base): ''' Define the class City that inherits from BaseModel. ''' - __tablename__ = 'cities' - name = Column(String(128), nullable=False) - state_id = Column(String(60), nullable=False, ForeignKey('states.id')) + if HBNB_TYPE_STORAGE == 'db': + __tablename__ = 'cities' + name = Column(String(128), nullable=False) + state_id = Column(String(60), ForeignKey=('states.id'), nullable=False) + state = relationship('State', back_populates = 'cities') + else: + diff --git a/models/engine/#__init__.py# b/models/engine/#__init__.py# new file mode 100755 index 00000000..b6bcff20 --- /dev/null +++ b/models/engine/#__init__.py# @@ -0,0 +1,4 @@ +#!/usr/bin/python3 +''' + Package initializer +''' diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py new file mode 100755 index 00000000..9240fd5e --- /dev/null +++ b/models/engine/db_storage.py @@ -0,0 +1,55 @@ +#!/usr/bin/python3 +''' + This module defines DBStorage class +''' +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models.base_model import BaseModel, Base +from models.amenity import Amenity +from models.city import City +from models.place import Place +from models.review import Review +from models.state import State +from models.user import User +from os import os + +class DBStorage: + ''' + Class DBStorage for database in MySQL + Attributes: + engine- + session- + ''' + __engine = None + __session = None + + def __init__(self): + self.__engine = create_engine('mysql+mysqldb://{}:{}@{}/{}' + .format(HBNB_MYSQL_USER, HBNB_MYSQL_PWD, + HBNB_MYSQL_HOST, HBNB_MYSQL_DB), + pool_pre_ping=True) + if HBNB_ENV == 'test': + Base.metadata.drop_all(self.__engine) + + def all(self, cls=None): + ''' + Method that creates a query and prints a dictionary of cls + ''' + if cls is not None: + for obj in session.query(cls): + print(obj) + def new(self, obj): + self.__session.add(self) + + def save(self): + self.__session.commit(self) + + def delete(self, obj=None): + self.__session.delete(self) + + def reload(self): + Base.metadata.create_all(self.__engine) + session_factory = sessionmaker(bind=self.__engine, + expire_on_commit=False) + Session = scoped_session(session_factory) + self.__session = Session() diff --git a/models/engine/db_storage.py~ b/models/engine/db_storage.py~ new file mode 100755 index 00000000..a4ebed1c --- /dev/null +++ b/models/engine/db_storage.py~ @@ -0,0 +1,54 @@ +#!/usr/bin/python3 +''' + This module defines DBStorage class +''' +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models.base_model import BaseModel, Base +from models.amenity import Amenity +from models.city import City +from models.place import Place +from models.review import Review +from models.state import State +from models.user import User + +class DBStorage: + ''' + Class DBStorage for database in MySQL + Attributes: + engine- + session- + ''' + __engine = None + __session = None + + def __init__(self): + self.__engine = create_engine('mysql+mysqldb://{}:{}@{}/{}' + .format(HBNB_MYSQL_USER, HBNB_MYSQL_PWD, + HBNB_MYSQL_HOST, HBNB_MYSQL_DB), + pool_pre_ping=True) + if HBNB_ENV == 'test': + Base.metadata.drop_all(self.__engine) + + def all(self, cls=None): + ''' + Method that creates a query and prints a dictionary of cls + ''' + if cls is not None: + for obj in session.query(cls): + print(obj) + def new(self, obj): + self.__session.add(self) + + def save(self): + self.__session.commit(self) + + def delete(self, obj=None): + self.__session.delete(self) + + def reload(self): + Base.metadata.create_all(self.__engine) + session_factory = sessionmaker(bind=self.__engine, + expire_on_commit=False) + Session = scoped_session(session_factory) + self.__session = Session() diff --git a/models/state.py b/models/state.py index d9cf25f3..c42f5f68 100755 --- a/models/state.py +++ b/models/state.py @@ -5,10 +5,16 @@ from models.base_model import BaseModel, Base from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import relationship class State(BaseModel, Base): ''' Implementation for the State. ''' - __tablename__ = 'states' - name = Column(String(128), nullable=False) + if HBNB_TYPE_STORAGE == 'db': + __tablename__ = 'states' + name = Column(String(128), nullable=False) + cities = relationship("City", back_populates='state', + cascade = 'all, delete, delete-orphan') + else: + From 95f1bb33737e326ac67e451fceeaaab617ca6283 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Sun, 25 Mar 2018 23:03:39 -0700 Subject: [PATCH 10/23] Delete #__init__.py# --- models/engine/#__init__.py# | 4 ---- 1 file changed, 4 deletions(-) delete mode 100755 models/engine/#__init__.py# diff --git a/models/engine/#__init__.py# b/models/engine/#__init__.py# deleted file mode 100755 index b6bcff20..00000000 --- a/models/engine/#__init__.py# +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/python3 -''' - Package initializer -''' From e735af0d23f35832fae639b6e44b6d0d2cdb448b Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 06:07:10 +0000 Subject: [PATCH 11/23] Update storage() --- models/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/models/__init__.py b/models/__init__.py index f977f93c..fe4a55b0 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -25,7 +25,8 @@ if HBNB_TYPE_STORAGE == 'db': from engine.dbstorage import DBStorage + storage = DBStorage else: from models.engine.file_storage import FileStorage storage = FileStorage() - storage.reload() +storage.reload() From 5f02ed7203d837b0fea3926b0001ddc3611d8a8e Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Sun, 25 Mar 2018 23:08:12 -0700 Subject: [PATCH 12/23] Delete db_storage.py~ --- models/engine/db_storage.py~ | 54 ------------------------------------ 1 file changed, 54 deletions(-) delete mode 100755 models/engine/db_storage.py~ diff --git a/models/engine/db_storage.py~ b/models/engine/db_storage.py~ deleted file mode 100755 index a4ebed1c..00000000 --- a/models/engine/db_storage.py~ +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/python3 -''' - This module defines DBStorage class -''' -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker -from models.base_model import BaseModel, Base -from models.amenity import Amenity -from models.city import City -from models.place import Place -from models.review import Review -from models.state import State -from models.user import User - -class DBStorage: - ''' - Class DBStorage for database in MySQL - Attributes: - engine- - session- - ''' - __engine = None - __session = None - - def __init__(self): - self.__engine = create_engine('mysql+mysqldb://{}:{}@{}/{}' - .format(HBNB_MYSQL_USER, HBNB_MYSQL_PWD, - HBNB_MYSQL_HOST, HBNB_MYSQL_DB), - pool_pre_ping=True) - if HBNB_ENV == 'test': - Base.metadata.drop_all(self.__engine) - - def all(self, cls=None): - ''' - Method that creates a query and prints a dictionary of cls - ''' - if cls is not None: - for obj in session.query(cls): - print(obj) - def new(self, obj): - self.__session.add(self) - - def save(self): - self.__session.commit(self) - - def delete(self, obj=None): - self.__session.delete(self) - - def reload(self): - Base.metadata.create_all(self.__engine) - session_factory = sessionmaker(bind=self.__engine, - expire_on_commit=False) - Session = scoped_session(session_factory) - self.__session = Session() From 4f5447dea9d844b5609e959559f0db4d8935a0e5 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 06:14:22 +0000 Subject: [PATCH 13/23] Add doc string --- models/engine/__init__.py | 4 ---- models/engine/db_storage.py | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/models/engine/__init__.py b/models/engine/__init__.py index b6bcff20..e69de29b 100755 --- a/models/engine/__init__.py +++ b/models/engine/__init__.py @@ -1,4 +0,0 @@ -#!/usr/bin/python3 -''' - Package initializer -''' diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 9240fd5e..7cb40ffc 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -13,6 +13,7 @@ from models.user import User from os import os + class DBStorage: ''' Class DBStorage for database in MySQL @@ -24,6 +25,9 @@ class DBStorage: __session = None def __init__(self): + ''' + Instantiate DBStorage + ''' self.__engine = create_engine('mysql+mysqldb://{}:{}@{}/{}' .format(HBNB_MYSQL_USER, HBNB_MYSQL_PWD, HBNB_MYSQL_HOST, HBNB_MYSQL_DB), @@ -38,16 +42,29 @@ def all(self, cls=None): if cls is not None: for obj in session.query(cls): print(obj) + def new(self, obj): + ''' + Add a new object to database + ''' self.__session.add(self) def save(self): + ''' + Save change to database + ''' self.__session.commit(self) def delete(self, obj=None): + ''' + Delete an object from database + ''' self.__session.delete(self) def reload(self): + ''' + To reload data from database + ''' Base.metadata.create_all(self.__engine) session_factory = sessionmaker(bind=self.__engine, expire_on_commit=False) From 491753ee6cbc94eacddaf348899b38dbf2066d7c Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 06:22:40 +0000 Subject: [PATCH 14/23] pep8 error --- models/base_model.py | 6 ++++-- models/city.py | 6 +++--- models/state.py | 5 ++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/models/base_model.py b/models/base_model.py index 17550085..40eaf212 100755 --- a/models/base_model.py +++ b/models/base_model.py @@ -8,15 +8,17 @@ from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_base + Base = declarative_base() + class BaseModel: ''' Base class for other classes to be used for the duration. ''' id = Column(String(60), primary_key=True, nullable=False) - created_at = Column(DateTime, default=datetime.utcnow(), nullable = False) - updated_at = Column(DateTime, default=datetime.utcnow(), nullable = False) + created_at = Column(DateTime, default=datetime.utcnow(), nullable=False) + updated_at = Column(DateTime, default=datetime.utcnow(), nullable=False) def __init__(self, *args, **kwargs): ''' diff --git a/models/city.py b/models/city.py index 23960800..4e02dfec 100755 --- a/models/city.py +++ b/models/city.py @@ -8,6 +8,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship + class City(BaseModel, Base): ''' Define the class City that inherits from BaseModel. @@ -15,7 +16,6 @@ class City(BaseModel, Base): if HBNB_TYPE_STORAGE == 'db': __tablename__ = 'cities' name = Column(String(128), nullable=False) - state_id = Column(String(60), ForeignKey=('states.id'), nullable=False) - state = relationship('State', back_populates = 'cities') + state_id = Column(String(60), ForeignKey=('states.id'), nullable=False) + state = relationship('State', back_populates='cities') else: - diff --git a/models/state.py b/models/state.py index c42f5f68..80b2c2fa 100755 --- a/models/state.py +++ b/models/state.py @@ -2,11 +2,11 @@ ''' Implementation of the State class ''' - from models.base_model import BaseModel, Base from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship + class State(BaseModel, Base): ''' Implementation for the State. @@ -15,6 +15,5 @@ class State(BaseModel, Base): __tablename__ = 'states' name = Column(String(128), nullable=False) cities = relationship("City", back_populates='state', - cascade = 'all, delete, delete-orphan') + cascade='all, delete, delete-orphan') else: - From 3d0fabc9533c58fcc8062f365cd953b8ce8d242e Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 06:22:59 +0000 Subject: [PATCH 15/23] Update file --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ab472530..5a7d8b17 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__ -*.pyc \ No newline at end of file +*.pyc +*.py~ From bee0cb2be57c49080ed03aa4f9e95627bcdd8ee2 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 17:31:39 +0000 Subject: [PATCH 16/23] Delete obj if not None --- models/engine/file_storage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 53405432..5c612fc5 100755 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -59,4 +59,5 @@ def delete(self, obj=None): Delete an object from __objects. ''' key = str(obj.__class__.__name__) + "." + str(obj.id) - del FileStorage.__objects[key] + if obj is not None: + del FileStorage.__objects[key] From 59be1ecae8cb6dccb78d00b4e0a992a67d997f7c Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 17:46:16 +0000 Subject: [PATCH 17/23] Check if obj is None --- models/engine/file_storage.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 5c612fc5..5200e14c 100755 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -58,6 +58,7 @@ def delete(self, obj=None): ''' Delete an object from __objects. ''' - key = str(obj.__class__.__name__) + "." + str(obj.id) if obj is not None: - del FileStorage.__objects[key] + key = str(obj.__class__.__name__) + "." + str(obj.id) + if key in FileStorage.__objects: + del FileStorage.__objects[key] From d1377ed548e2e38a26acb2d695f3d1edc8896380 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 20:25:40 +0000 Subject: [PATCH 18/23] Update code --- models/__init__.py | 6 +++--- models/city.py | 14 +++++++++++--- models/engine/db_storage.py | 10 +++++----- models/state.py | 22 +++++++++++++++++++++- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/models/__init__.py b/models/__init__.py index fe4a55b0..47a94e82 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -2,7 +2,6 @@ ''' Package initializer ''' - from models.base_model import BaseModel from models.user import User from models.place import Place @@ -12,6 +11,7 @@ from models.review import Review from os import getenv + classes = {"User": User, "BaseModel": BaseModel, "Place": Place, "State": State, "City": City, "Amenity": Amenity, @@ -24,8 +24,8 @@ HBNB_TYPE_STORAGE = getenv('HBNB_TYPE_STORAGE') if HBNB_TYPE_STORAGE == 'db': - from engine.dbstorage import DBStorage - storage = DBStorage + from models.engine.db_storage import DBStorage + storage = DBStorage() else: from models.engine.file_storage import FileStorage storage = FileStorage() diff --git a/models/city.py b/models/city.py index 4e02dfec..91971412 100755 --- a/models/city.py +++ b/models/city.py @@ -3,19 +3,27 @@ Define the class City. ''' from models.base_model import BaseModel, Base -from models.state import State from sqlalchemy.ext.declarative import declared_attr from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship +from os import getenv class City(BaseModel, Base): ''' Define the class City that inherits from BaseModel. ''' - if HBNB_TYPE_STORAGE == 'db': + if getenv('HBNB_TYPE_STORAGE') == 'db': __tablename__ = 'cities' name = Column(String(128), nullable=False) - state_id = Column(String(60), ForeignKey=('states.id'), nullable=False) + state_id = Column(String(60), ForeignKey('states.id'), nullable=False) state = relationship('State', back_populates='cities') else: + name = "" + state_id = "" + + def __init__(self): + ''' + Instantiate City + ''' + super().__init__() diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 7cb40ffc..8cd5ffaf 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -11,7 +11,6 @@ from models.review import Review from models.state import State from models.user import User -from os import os class DBStorage: @@ -42,6 +41,7 @@ def all(self, cls=None): if cls is not None: for obj in session.query(cls): print(obj) +# print("[{}] ({}) {}".format(cls, obj.id, ) def new(self, obj): ''' @@ -57,9 +57,10 @@ def save(self): def delete(self, obj=None): ''' - Delete an object from database + Delete an object from database if not none ''' - self.__session.delete(self) + if obj is not None: + self.__session.delete(self) def reload(self): ''' @@ -68,5 +69,4 @@ def reload(self): Base.metadata.create_all(self.__engine) session_factory = sessionmaker(bind=self.__engine, expire_on_commit=False) - Session = scoped_session(session_factory) - self.__session = Session() + self.__sessioin = scoped_session(session_factory) diff --git a/models/state.py b/models/state.py index 80b2c2fa..2a779fcd 100755 --- a/models/state.py +++ b/models/state.py @@ -5,15 +5,35 @@ from models.base_model import BaseModel, Base from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship +from models import city +from os import getenv class State(BaseModel, Base): ''' Implementation for the State. ''' - if HBNB_TYPE_STORAGE == 'db': + if getenv('HBNB_TYPE_STORAGE') == 'db': __tablename__ = 'states' name = Column(String(128), nullable=False) cities = relationship("City", back_populates='state', cascade='all, delete, delete-orphan') else: + name = "" + + def __init__(self): + ''' + Instantiate State + ''' + super().__init__() + +""" + if getenv('HBNB_TYPE_STORAGE') is not 'db': + @property + def cities(self): + ''' + Set getter for cities + ''' + all_cities = models.storage.all(city) + for +""" From dc6c71f657d34f501ca3fd24cbda6e0bd5938d17 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 20:54:11 +0000 Subject: [PATCH 19/23] Update code --- models/__init__.py | 8 +------- models/engine/db_storage.py | 8 +++++--- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/models/__init__.py b/models/__init__.py index 47a94e82..050708db 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -17,13 +17,7 @@ "City": City, "Amenity": Amenity, "Review": Review} -HBNB_MYSQL_USER = getenv('HBNB_MYSQL_USER') -HBNB_MYSQL_PWD = getenv('HBNB_MYSQL_PWD') -HBNB_MYSQL_HOST = getenv('HBNB_MYSQL_HOST') -HBNB_MYSQL_DB = getenv('HBNB_MYSQL_DB') -HBNB_TYPE_STORAGE = getenv('HBNB_TYPE_STORAGE') - -if HBNB_TYPE_STORAGE == 'db': +if getenv('HBNB_TYPE_STORAGE') == 'db': from models.engine.db_storage import DBStorage storage = DBStorage() else: diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 8cd5ffaf..9f3c46c3 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -4,6 +4,7 @@ ''' from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker +from sqlalchemy.orm import scoped_session from models.base_model import BaseModel, Base from models.amenity import Amenity from models.city import City @@ -11,6 +12,7 @@ from models.review import Review from models.state import State from models.user import User +from os import getenv class DBStorage: @@ -28,10 +30,10 @@ def __init__(self): Instantiate DBStorage ''' self.__engine = create_engine('mysql+mysqldb://{}:{}@{}/{}' - .format(HBNB_MYSQL_USER, HBNB_MYSQL_PWD, - HBNB_MYSQL_HOST, HBNB_MYSQL_DB), + .format(getenv('HBNB_MYSQL_USER'), getenv('HBNB_MYSQL_PWD'), + getenv('HBNB_MYSQL_HOST'), getenv('HBNB_MYSQL_DB')), pool_pre_ping=True) - if HBNB_ENV == 'test': + if getenv('HBNB_ENV') == 'test': Base.metadata.drop_all(self.__engine) def all(self, cls=None): From 0ba9560301efc538df1b5d6cbd28bfd1d0c49804 Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 21:32:29 +0000 Subject: [PATCH 20/23] Add cities getter --- models/state.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/models/state.py b/models/state.py index 2a779fcd..5d6e6e98 100755 --- a/models/state.py +++ b/models/state.py @@ -20,20 +20,20 @@ class State(BaseModel, Base): cascade='all, delete, delete-orphan') else: name = "" + @property + def cities (self): + ''' + Getter for citites + ''' + all_cities = models.storage.all(City) + cities = {} + for key, obj in city_list: + if key == state_id: + cities[key] = obj + return cities def __init__(self): ''' Instantiate State ''' super().__init__() - -""" - if getenv('HBNB_TYPE_STORAGE') is not 'db': - @property - def cities(self): - ''' - Set getter for cities - ''' - all_cities = models.storage.all(city) - for -""" From 03e28172c3afd04b54e1e960bccd314c77551712 Mon Sep 17 00:00:00 2001 From: vkalia602 Date: Mon, 26 Mar 2018 21:38:30 +0000 Subject: [PATCH 21/23] Added env variables --- models/engine/db_storage.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 9f3c46c3..405cd198 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -13,7 +13,11 @@ from models.state import State from models.user import User from os import getenv - +HBNB_MYSQL_USER = getenv('HBNB_MYSQL_USER') +HBNB_MYSQL_PWD = getenv('HBNB_MYSQL_PWD') +HBNB_MYSQL_HOST = getenv('HBNB_MYSQL_HOST') +HBNB_MYSQL_DB = getenv('HBNB_MYSQL_DB') +HBNB_ENV = getenv('HBNB_ENV') class DBStorage: ''' @@ -30,8 +34,8 @@ def __init__(self): Instantiate DBStorage ''' self.__engine = create_engine('mysql+mysqldb://{}:{}@{}/{}' - .format(getenv('HBNB_MYSQL_USER'), getenv('HBNB_MYSQL_PWD'), - getenv('HBNB_MYSQL_HOST'), getenv('HBNB_MYSQL_DB')), + .format(HBNB_MYSQL_USER, HBNB_MYSQL_PWD, + HBNB_MYSQL_HOST, HBNB_MYSQL_DB), pool_pre_ping=True) if getenv('HBNB_ENV') == 'test': Base.metadata.drop_all(self.__engine) From d5d5df78ae9b66b1f801193bbab4d485352db8cc Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Mon, 26 Mar 2018 22:30:15 +0000 Subject: [PATCH 22/23] Udpate all() --- models/engine/file_storage.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 5200e14c..65a357d6 100755 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -17,7 +17,14 @@ def all(self, cls=None): ''' Return the dictionary ''' - return self.__objects + if cls is not None: + cls_dict = {} + for k, v in self.__objects.items(): + if type(v) == cls : + cls_dict[k] = v + return cls_dict + else: + return self.__objects def new(self, obj): ''' From 93231745702b87ecd665db8c2e03b0a8c4ed97bb Mon Sep 17 00:00:00 2001 From: Yunju Chen Date: Tue, 27 Mar 2018 00:36:11 +0000 Subject: [PATCH 23/23] Add all() --- models/engine/db_storage.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 405cd198..1430248e 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -19,6 +19,7 @@ HBNB_MYSQL_DB = getenv('HBNB_MYSQL_DB') HBNB_ENV = getenv('HBNB_ENV') + class DBStorage: ''' Class DBStorage for database in MySQL @@ -37,36 +38,44 @@ def __init__(self): .format(HBNB_MYSQL_USER, HBNB_MYSQL_PWD, HBNB_MYSQL_HOST, HBNB_MYSQL_DB), pool_pre_ping=True) - if getenv('HBNB_ENV') == 'test': + if HBNB_ENV == 'test': Base.metadata.drop_all(self.__engine) def all(self, cls=None): ''' Method that creates a query and prints a dictionary of cls ''' + obj_dict = {} if cls is not None: for obj in session.query(cls): - print(obj) -# print("[{}] ({}) {}".format(cls, obj.id, ) + key = cls + '.' + obj.id + obj_dict[key] = obj + else + all_tables = metadata.tables.keys() + for cls in all_tables: + for obj in session.query(cls): + key = cls + '.' + obj.id + obj_dict[key] = obj + return obj_dict def new(self, obj): ''' Add a new object to database ''' - self.__session.add(self) + self.__session.add(obj) def save(self): ''' Save change to database ''' - self.__session.commit(self) + self.__session.commit() def delete(self, obj=None): ''' Delete an object from database if not none ''' if obj is not None: - self.__session.delete(self) + self.__session.delete(obj) def reload(self): ''' @@ -75,4 +84,4 @@ def reload(self): Base.metadata.create_all(self.__engine) session_factory = sessionmaker(bind=self.__engine, expire_on_commit=False) - self.__sessioin = scoped_session(session_factory) + self.__session = scoped_session(session_factory)