This project is to understand what is Python and how use it, it was made in the software development program of Holberton School.
πBackground Context
Before starting, please read the AirBnB concept page.
This is the first step towards building your first full web application: the AirBnB clone. This first step is very important because you will use what you build during this project with all other following projects: HTML/CSS templating, database storage, API, front-end integrationβ¦
Each task is linked and will help you to:
- put in place a parent class (called
BaseModel
) to take care of the initialization, serialization and deserialization of your future instances - create a simple flow of serialization/deserialization: Instance <-> Dictionary <-> JSON string <-> file
- create all classes used for AirBnB (
User
,State
,City
,Place
β¦) that inherit fromBaseModel
- create the first abstracted storage engine of the project: File storage.
- create all unittests to validate all our classes and storage engine
Do you remember the Shell? Itβs exactly the same but limited to a specific use-case. In our case, we want to be able to manage the objects of our project:
- Create a new object (ex: a new User or a new Place)
- Retrieve an object from a file, a database etcβ¦
- Do operations on objects (count, compute stats, etcβ¦)
- Update attributes of an object
- Destroy an object
At the end of this project, you are expected to be able to explain to anyone, without the help of Google:
- How to create a Python package
- How to create a command interpreter in Python using the
cmd
module - What is Unit testing and how to implement it in a large project
- How to serialize and deserialize a Class
- How to write and read a JSON file
- How to manage
datetime
- What is an
UUID
- What is
*args
and how to use it - What is
**kwargs
and how to use it - How to handle named arguments in a function
- Allowed editors:
vi
,vim
,emacs
- All your files will be interpreted/compiled on Ubuntu 20.04 LTS using python3 (version 3.8.5)
- All your files should end with a new line
- The first line of all your files should be exactly
#!/usr/bin/python3
- A
README.md
file, at the root of the folder of the project, is mandatory - Your code should use the pycodestyle (version 2.7.*)
- All your files must be executable
- The length of your files will be tested using
wc
- All your modules should have a documentation (
python3 -c 'print(__import__("my_module").__doc__)'
) - All your classes should have a documentation (
python3 -c 'print(__import__("my_module").MyClass.__doc__)'
) - All your functions (inside and outside a class) should have a documentation (
python3 -c 'print(__import__("my_module").my_function.__doc__
)' andpython3 -c 'print(__import__("my_module").MyClass.my_function.__doc__)'
) - A documentation is not a simple word, itβs a real sentence explaining whatβs the purpose of the module, class or method (the length of it will be verified)
- Allowed editors:
vi
,vim
,emacs
- All your files should end with a new line
- All your test files should be inside a folder
tests
- You have to use the unittest module
- All your test files should be python files (extension:
.py
) - All your test files and folders should start by
test_
- Your file organization in the tests folder should be the same as your project
- e.g., For
models/base_model.py
, unit tests must be in:tests/test_models/test_base_model.py
- e.g., For
models/user.py
, unit tests must be in:tests/test_models/test_user.py
- All your tests should be executed by using this command:
python3 -m unittest discover tests
- You can also test file by file by using this command:
python3 -m unittest tests/test_models/test_base_model.py
- All your modules should have a documentation (
python3 -c 'print(__import__("my_module").__doc__)'
) - All your classes should have a documentation (
python3 -c 'print(__import__("my_module").MyClass.__doc__)'
) - All your functions (inside and outside a class) should have a documentation (
python3 -c 'print(__import__("my_module").my_function.__doc__)'
andpython3 -c 'print(__import__("my_module").MyClass.my_function.__doc__)'
) - We strongly encourage you to work together on test cases, so that you donβt miss any edge case
There should be one project repository per group. If you clone/fork/whatever a project repository with the same name before the second deadline, you risk a 0% score.
Your shell should work like this in interactive mode:
$ ./console.py
(hbnb) help
Documented commands (type help <topic>):
========================================
EOF help quit
(hbnb)
(hbnb)
(hbnb) quit
$
But also in non-interactive mode: (like the Shell project in C)
$ echo "help" | ./console.py
(hbnb)
Documented commands (type help <topic>):
========================================
EOF help quit
(hbnb)
$
$ cat test_help
help
$
$ cat test_help | ./console.py
(hbnb)
Documented commands (type help <topic>):
========================================
EOF help quit
(hbnb)
$
All tests should also pass in non-interactive mode: $ echo "python3 -m unittest discover tests" | bash
This repository is the starting point for our ambitious AirBnB Clone project. Here, we've built a command-line interpreter to manage AirBnB objects, laying the foundation for a full web application. You'll find Python scripts, unit tests, and comprehensive documentation that demonstrate our commitment to quality and best practices.
.
βββ AUTHORS
βββ README.md
βββ console.py
βββ file.json
βββ models
β βββ __init__.py
β βββ amenity.py
β βββ base_model.py
β βββ city.py
β βββ engine
β β βββ __init__.py
β β βββ file_storage.py
β βββ place.py
β βββ review.py
β βββ state.py
β βββ user.py
βββ tests
βββ __init__.py
βββ test_models
βββ __init__.py
βββ test_amenity.py
βββ test_base_model.py
βββ test_city.py
βββ test_engine
β βββ __init__.py
β βββ test_file_storage.py
βββ test_place.py
βββ test_review.py
βββ test_state.py
βββ test_user.py
Clone this repository:
root@user$ git clone https://github.com/RaphSchp/holbertonschool-AirBnB_clone.git
In terminal navigate to root directory and run this command:
holbertonschool-AirBnB_clone$ ./console.py
Interpreter will begin and prompt user:
(hbnb)
Commands | Sample Usage | Functionality |
---|---|---|
help |
help |
displays all commands available |
create |
create <class> |
creates new object (ex. a new User, Place) |
update |
User.update('123', {'name' : '(NAME)'}) |
updates attribute of an object |
destroy |
User.destroy('123') |
destroys specified object |
show |
User.show('123') |
retrieve an object from a file, a database |
all |
User.all() |
display all objects in class |
quit |
quit |
exits |
Interactive Mode
$ ./console.py
(hbnb) help
Documented commands (type help <topic>):
========================================
EOF help quit
(hbnb)
(hbnb)
(hbnb) quit
$
Non-Interactive Mode
$ echo "help" | ./console.py
(hbnb)
Documented commands (type help <topic>):
========================================
EOF help quit
(hbnb)
$
$ cat test_help
help
$
$ cat test_help | ./console.py
(hbnb)
Documented commands (type help <topic>):
========================================
EOF help quit
(hbnb)
$
To test the files, classes, and functions in this project use the following commands:
python3 -m unittest discover tests
You can also test file by file by using this command:
python3 -m unittest tests/test_models/test_base_model.py
This program is distributed under the terms of the Holberton license.