forked from Nazasophie/AirBnB_clone_v3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
file_storage.py
executable file
·94 lines (81 loc) · 3.03 KB
/
file_storage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/python3
"""
Contains the FileStorage class
"""
import json
from models.amenity import Amenity
from models.base_model import BaseModel
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
classes = {"Amenity": Amenity, "BaseModel": BaseModel, "City": City,
"Place": Place, "Review": Review, "State": State, "User": User}
class FileStorage:
"""serializes instances to a JSON file & deserializes back to instances"""
# string - path to the JSON file
__file_path = "file.json"
# dictionary - empty but will store all objects by <class name>.id
__objects = {}
def all(self, cls=None):
"""returns the dictionary __objects"""
if cls is not None:
new_dict = {}
for key, value in self.__objects.items():
if cls == value.__class__ or cls == value.__class__.__name__:
new_dict[key] = value
return new_dict
return self.__objects
def new(self, obj):
"""sets in __objects the obj with key <obj class name>.id"""
if obj is not None:
key = obj.__class__.__name__ + "." + obj.id
self.__objects[key] = obj
def save(self):
"""serializes __objects to the JSON file (path: __file_path)"""
json_objects = {}
for key in self.__objects:
json_objects[key] = self.__objects[key].to_dict()
with open(self.__file_path, 'w') as f:
json.dump(json_objects, f)
def get(self, cls, id):
"""A method to retrieve one object
Returns the object based on the class name and its ID, or
None if not found
"""
if type(cls) is str:
cls = classes.get(cls)
if cls is None:
return None
for item in self.__objects.values():
if item.__class__ == cls and item.id == id:
return item
def count(self, cls=None):
"""A method to count the number of objects in storage
Returns the number of objects in storage matching the given class name
If no name is passed, returns the count of all objects in storage
"""
if type(cls) is str:
cls = classes.get(cls)
if cls is None:
return len(self.all())
return len(self.all(cls))
def reload(self):
"""deserializes the JSON file to __objects"""
try:
with open(self.__file_path, 'r') as f:
jo = json.load(f)
for key in jo:
self.__objects[key] = classes[jo[key]["__class__"]](**jo[key])
except:
pass
def delete(self, obj=None):
"""delete obj from __objects if it’s inside"""
if obj is not None:
key = obj.__class__.__name__ + '.' + obj.id
if key in self.__objects:
del self.__objects[key]
def close(self):
"""call reload() method for deserializing the JSON file to objects"""
self.reload()