## HBnB
AirBnB clone.
----------
## Description 🏠
HBnB is a complete web application, integrating database storage, a back-end API, and front-end interfacing in a clone of AirBnB.
The project currently only implements the back-end console.
## Classes 🆑
HBnB utilizes the following classes:
| Class | Description | Attributes | Methods |
|-------------|---------------------------|-------------------------------|-----------------------------------|
| BaseModel | | id<br>created_at<br>updated_at | save<br>to_dict |
| FileStorage | | | all<br>new<br>save<br>reload |
| User | Inherits from BaseModel | email<br>password<br>first_name<br>last_name | |
| State | Inherits from BaseModel | | |
| City | Inherits from BaseModel | | |
| Amenity | Inherits from BaseModel | | |
| Place | Inherits from BaseModel | | |
| Review | Inherits from BaseModel | | |
## Storage 🛄
The above classes are handled by the abstracted storage engine defined in the [FileStorage](https://github.com/MachariaP/AirBnB_clone/blob/master/models/engine/file_storage.py) class.
Every time the backend is initialized, HBnB instantiates an instance of `FileStorage` called `storage`. The `storage` object is loaded/re-loaded from any class instances stored in the JSON file `file.json`. As class instances are created, updated, or deleted, the `storage` object is used to register corresponding changes in the `file.json`.
## Console 💻
The console is a command line interpreter that permits management of the backend of HBnB. It can be used to handle and manipulate all classes utilized by the application (achieved by calls on the `storage` object defined above).
### Using the Console
The HBnB console can be run both interactively and non-interactively. To run the console in non-interactive mode, pipe any command(s) into an execution of the file `console.py` at the command line.
EOF all count create destroy help quit show update
(hbnb) $
Alternatively, to use the HBnB console in interactive mode, run the file `console.py` by itself:
$ ./console.py
While running in interactive mode, the console displays a prompt for input:
$ ./console.py (hbnb)
To quit the console, enter the command `quit`, or input an EOF signal (ctrl-D).
$ ./console.py (hbnb) quit $
$ ./console.py (hbnb) EOF $
### Console Commands
The HBnB console supports the following commands:
- **create**
- Usage: `create <class>`
Creates a new instance of a given class. The class' ID is printed and the instance is saved to the file `file.json`.
$ ./console.py (hbnb) create BaseModel 119be863-6fe5-437e-a180-b9892e8746b8 (hbnb) quit $ cat file.json ; echo "" {"BaseModel.119be863-6fe5-437e-a180-b9892e8746b8": {"updated_at": "2019-02-17T2 1:30:42.215277", "created_at": "2019-02-17T21:30:42.215277", "class": "Base Model", "id": "119be863-6fe5-437e-a180-b9892e8746b8"}}
- **show**
- Usage: `show <class> <id>` or `<class>.show(<id>)`
Prints the string representation of a class instance based on a given id.
$ ./console.py (hbnb) create User 1e32232d-5a63-4d92-8092-ac3240b29f46 (hbnb) (hbnb) show User 1e32232d-5a63-4d92-8092-ac3240b29f46 [User] (1e32232d-5a63-4d92-8092-ac3240b29f46) {'id': '1e32232d-5a63-4d92-8092-a c3240b29f46', 'created_at': datetime.datetime(2019, 2, 17, 21, 34, 3, 635828), 'updated_at': datetime.datetime(2019, 2, 17, 21, 34, 3, 635828)} (hbnb) (hbnb) User.show(1e32232d-5a63-4d92-8092-ac3240
b29f46) [User] (1e32232d-5a63-4d92-8092-ac3240b29f46) {'id': '1e32232d-5a63-4d92-8092-a c3240b29f46', 'created_at': datetime.datetime(2019, 2, 17, 21, 34, 3, 635828), 'updated_at': datetime.datetime(2019, 2, 17, 21, 34, 3, 635828)} (hbnb)
- **destroy**
- Usage: `destroy <class> <id>` or `<class>.destroy(<id>)`
Deletes a class instance based on a given id. The storage file `file.json` is updated accordingly.
$ ./console.py (hbnb) create State d2d789cd-7427-4920-aaae-88cbcf8bffe2 (hbnb) create Place 3e-8329-4f47-9947-dca80c03d3ed (hbnb) (hbnb) destroy State d2d789cd-7427-4920-aaae-88cbcf8bffe2 (hbnb) Place.destroy(03486a3e-8329-4f47-9947-dca80c03d3ed) (hbnb) quit $ cat file.json ; echo "" {}
- **all**
- Usage: `all` or `all <class>` or `<class>.all()`
Prints the string representations of all instances of a given class. If no class name is provided, the command prints all instances of every class.
$ ./console.py (hbnb) create BaseModel fce2124c-8537-489b-956e-22da455cbee8 (hbnb) create BaseModel 450490fd-344e-47cf-8342-126244c2ba99 (hbnb) create User b742dbc3-f4bf-425e-b1d4-165f52c6ff81 (hbnb) create User 8f2d75c8-fb82-48e1-8ae5-2544c909a9fe (hbnb) (hbnb) all BaseModel ["[BaseModel] (450490fd-344e-47cf-8342-126244c2ba99) {'updated_at': datetime.da tetime(2019, 2, 17, 21, 45, 5, 963516), 'created_at': datetime.datetime(2019, 2 , 17, 21, 45, 5, 963516), 'id': '450490fd-344e-47cf-8342-126244c2ba99'}", "[Bas eModel] (fce2124c-8537-489b-956e-22da455cbee8) {'updated_at': datetime.datetime (2019, 2, 17, 21, 43, 56, 899348), 'created_at': datetime.datetime(2019, 2, 17, 21, 43, 56, 899348), 'id': 'fce2124c-8537-489b-956e-22da455cbee8'}"] (hbnb) (hbnb) User.all() ["[User] (8f2d75c8-fb82-48e1-8ae5-2544c909a9fe) {'updated_at': datetime.datetim e(2019, 2, 17, 21, 44, 44, 428413), 'created_at': datetime.datetime(2019, 2, 17 , 21, 44, 44, 428413), 'id': '8f2d75c8-fb82-48e1-8ae5-2544c909a9fe'}", "[User] (b742dbc3-f4bf-425e-b1d4-165f52c6ff81) {'updated_at': datetime.datetime(2019, 2 , 17, 21, 44, 15, 974608), 'created_at': datetime.datetime(2019, 2, 17, 21, 44, 15, 974608), 'id': 'b742dbc3-f4bf-425e-b1d4-165f52c6ff81'}"] (hbnb) (hbnb) all ["[User] (8f2d75c8-fb82-48e1-8ae5-2544c909a9fe) {'updated_at': datetime.datetim e(2019, 2, 17, 21, 44, 44, 428413), 'created_at': datetime.datetime(2019, 2, 17 , 21, 44, 44, 428413), 'id': '8f2d75c8-fb82-48e1-8ae5-2544c909a9fe'}", "[BaseMo del] (450490fd-344e-47cf-8342-126244c2ba99) {'updated_at': datetime.datetime(20 19, 2, 17, 21, 45, 5, 963516), 'created_at': datetime.datetime(2019, 2, 17, 21, 45, 5, 963516), 'id': '450490fd-344e-47cf-8342-126244c2ba99'}", "[User] (b742db c3-f4bf-425e-b1d4-165f52c6ff81) {'updated_at': datetime.datetime(2019, 2, 17, 2 1, 44, 15, 974608), 'created_at': datetime.datetime(2019, 2, 17, 21, 44, 15, 97 4608), 'id': 'b742dbc3-f4bf-425e-b1d4-165f52c6ff81'}", "[BaseModel] (fce2124c-8 537-489b-956e-22da455cbee8) {'updated_at': datetime.datetime(2019,
2, 17, 21, 4 3, 56, 899348), 'created_at': datetime.datetime(2019, 2, 17, 21, 43, 56, 899348 ), 'id': 'fce2124c-8537-489b-956e-22da455cbee8'}"] (hbnb)
- **count**
- Usage: `count <class>` or `<class>.count()`
Retrieves the number of instances of a given class.
$ ./console.py (hbnb) create Place 12c73223-f3d3-4dec-9629-bd19c8fadd8a (hbnb) create Place aa229cbb-5b19-4c32-8562-f90a3437d301 (hbnb) create City 22a51611-17bd-4d8f-ba1b-3bf07d327208 (hbnb) (hbnb) count Place 2 (hbnb) city.count() 1 (hbnb)
- **update**
- Usage: `update <class> <id> <attribute name> "<attribute value>"` or `<class>.update(<id>, <attribute name>, <attribute value>)` or `<class>.update( <id>, <attribute dictionary>)`.
Updates a class instance based on a given id with a given key/value attribute pair or dictionary of attribute pairs. If `update` is called with a single key/value attribute pair, only "simple" attributes can be updated (ie. not `id`, `created_at`, and `updated_at`). However, any attribute can be updated by providing a dictionary.
$ ./console.py (hbnb) create User 6f348019-0499-420f-8eec-ef0fdc863c02 (hbnb) (hbnb) update User 6f348019-0499-420f-8eec-ef0fdc863c02 first_name "Holberton" (hbnb) show User 6f348019-0499-420f-8eec-ef0fdc863c02 [User] (6f348019-0499-420f-8eec-ef0fdc863c02) {'created_at': datetime.datetime( 2019, 2, 17, 21, 54, 39, 234382), 'first_name': 'Holberton', 'updated_at': date time.datetime(2019, 2, 17, 21, 54, 39, 234382), 'id': '6f348019-0499-420f-8eec- ef0fdc863c02'} (hbnb) (hbnb) User.update(6f348019-0499-420f-8eec-ef0fdc863c02, address, "98 Mission S t") (hbnb) User.show(6f348019-0499-420f-8eec-ef0fdc863c02) [User] (6f348019-0499-420f-8eec-ef0fdc863c02) {'created_at': datetime.datetime( 2019, 2, 17, 21, 54, 39, 234382), 'address': '98 Mission St', 'first_name': 'Ho lberton', 'updated_at': datetime.datetime(2019, 2, 17, 21, 54, 39, 234382), 'id ': '6f348019-0499-420f-8eec-ef0fdc863c02'} (hbnb) (hbnb) User.update(6f348019-0499-420f-8eec-ef0fdc863c02, {'email': 'holberton@h olberton.com', 'last_name': 'School'}) [User] (6f348019-0499-420f-8eec-ef0fdc863c02) {'email': '[email protected] m', 'first_name': 'Holberton', 'updated_at': datetime.datetime(2019, 2, 17, 21, 54, 39, 234382), 'address': '98 Mission St', 'last_name': 'School', 'id': '6f34 8019-0499-420f-8eec-ef0fdc863c02', 'created_at': datetime.datetime(2019, 2, 17, 21, 54, 39, 234382)} (hbnb)
## Testing 📏
Unittests for the HolbertonBnB project are defined in the [tests](https://github.com/MachariaP/AirBnB_clone/blob/master/tests) folder. To run the entire test suite simultaneously, execute the following command:
$ python3 unittest -m discover tests
Alternatively, you can specify a single test file to run at a time:
$ python3 unittest -m tests/test_console.py
## Authors ✒️
- **Phinehas Macharia** <[MachariaP](https://github.com/MachariaP)>
- **Dinar Wanjiru** <[Dinarwanjiru](https://github.com/Dinarwanjiru)>