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.