From 1d2e33ba5a88c551ef54418f2777531a970bbe8d Mon Sep 17 00:00:00 2001 From: "kilian.lehn" Date: Wed, 18 Oct 2023 21:01:39 +0200 Subject: [PATCH] Added PUML overview diagram to README.md for a quick project overview. And made some alternative structure of README.md --- README.md | 51 +++++++++++++++++++------ docs/images/logic_in_uml_structure.png | Bin 0 -> 47943 bytes docs/puml/logic_in_uml_structure.puml | 35 +++++++++++++++++ 3 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 docs/images/logic_in_uml_structure.png create mode 100644 docs/puml/logic_in_uml_structure.puml diff --git a/README.md b/README.md index 1c779a4..cefd15c 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,39 @@ # Python Firebase -Python interface to the Firebase's REST API +Python interface to the Firebase's REST API. Firebase provides a platform that allows you to develop web and mobile applications without server-side programming, making development easier and faster. [![Firebase](https://szimek.github.io/presentation-firebase-intro/images/firebase_logo.png)](http://www.firebase.com) +## Table of Contents +- [Installation](#installation) +- [Getting Started](#getting-started) +- [Authentication](#authentication) +- [Concurrency](#concurrency) +- [System Overview with UML](#system-overview-with-uml) +- [Further Topics](#further-topics) +- [Shortcomings](#shortcomings) +- [TODO](#todo) + ## Installation [![Build Status](https://travis-ci.org/ozgur/python-firebase.png?branch=master)](https://travis-ci.org/ozgur/python-firebase) -python-firebase highly makes use of the **requests** library so before you begin, you need to have that package installed. +To use `python-firebase`, you must first install the `requests` library. - $ sudo pip install requests - $ sudo pip install python-firebase +```shell +$ sudo pip install requests +$ sudo pip install python-firebase +``` ## Getting Started -You can fetch any of your data in JSON format by appending '.json' to the end of the URL in which your data resides and, then send an HTTPS request through your browser. Like all other REST specific APIs, Firebase offers a client to update(PATCH, PUT), create(POST), or remove(DELETE) his stored data along with just to fetch it. +With Firebase, you can easily fetch your stored data in JSON format. The `python-firebase` interface provides both synchronous and asynchronous methods to interact with your Firebase storage. -The library provides all the correspoding methods for those actions in both synchoronous and asynchronous manner. You can just start an asynchronous GET request with your callback function, and the method +You can fetch any of your data in JSON format by appending '.json' to the end of the URL in which your data resides and, then send an HTTPS request through your browser. Like all other REST specific APIs, Firebase offers a client to update(PATCH, PUT), create(POST), or remove(DELETE) his stored data along with just to fetch it. +The library provides all the correspoding methods for those actions in both synchoronous and asynchronous manner. You can just start an asynchronous GET request with your callback function, and the method. To fetch all the users in your storage simply do the following: - ```python from firebase import firebase fb_app = firebase.FirebaseApplication('https://your_storage.firebaseio.com', None) @@ -29,10 +41,9 @@ result = fb_app.get('/users', None) print result {'1': 'John Doe', '2': 'Jane Doe'} ``` - - The second argument of **get** method is the name of the snapshot. Thus, if you leave it NULL, you get the data in the URL **/users.json**. Besides, if you set it to **1**, you get the data in the url **/users/1.json**. In other words, you get the user whose ID equals to 1. + ```python from firebase import firebase fb_app = firebase.FirebaseApplication('https://your_storage.firebaseio.com', None) @@ -78,7 +89,7 @@ fb_app.delete('/users', '1') ## Authentication -Authentication in Firebase is nothing but to simply creating a token that conforms to the JWT standards and, putting it into the querystring with the name **auth**. The library creates that token for you so you never end up struggling with constructing a valid token on your own. If the data has been protected against write/read operations with some security rules, the backend sends an appropriate error message back to the client with the status code **403 Forbidden**. +Firebase uses token-based authentication. Here's how you can authenticate and retrieve data: ```python from firebase import firebase @@ -123,8 +134,26 @@ def log_user(response): fb_app.get_async('/users', None, {'print': 'pretty'}, callback=log_user) ``` -# TODO +## System Overview with UML + +To better understand the interactions between the user, Python console, and Firebase, refer to the following UML diagram: + +![UML Overview](./docs/images/logic_in_uml_structure.png) + +## Further Topics + +As you delve deeper into `python-firebase`, there are advanced topics you might want to explore, such as integrating Firebase with other services, using Firebase with advanced querying, and more. + +## Shortcomings + +While `python-firebase` provides a robust interface, there might be certain limitations: + +1. It primarily supports RESTful operations. For real-time data synchronization, consider using the official Firebase SDKs. +2. Error handling might be generic in some cases. Always handle exceptions appropriately. + +## TODO - [ ] Async calls must deliver exceptions raised back to the main process. - [ ] More regression/stress tests on asynchronous calls. - [ ] Docs must be generated. + diff --git a/docs/images/logic_in_uml_structure.png b/docs/images/logic_in_uml_structure.png new file mode 100644 index 0000000000000000000000000000000000000000..36fed7cdc172aee9d640fe4c0db4e86f2c6d2df0 GIT binary patch literal 47943 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 literal 0 HcmV?d00001 diff --git a/docs/puml/logic_in_uml_structure.puml b/docs/puml/logic_in_uml_structure.puml new file mode 100644 index 0000000..f6ceccb --- /dev/null +++ b/docs/puml/logic_in_uml_structure.puml @@ -0,0 +1,35 @@ +@startuml + +actor User +participant "Python Console" as PC +participant "Firebase" as FB + +User -> PC: Install and start python-firebase +PC -> User: Start success message + +User -> PC: Send GET request for data in Firebase +PC -> FB: Request data +FB -> PC: Send requested data +PC -> User: Return the fetched data + +User -> PC: Send POST request to create new data in Firebase +PC -> FB: Create new data +FB -> PC: Confirm data creation +PC -> User: Return confirmation + +User -> PC: Send DELETE request to remove data in Firebase +PC -> FB: Remove data +FB -> PC: Confirm data deletion +PC -> User: Return confirmation + +User -> PC: Authenticate user in Firebase +PC -> FB: Send authentication details +FB -> PC: Authenticate and return token +PC -> User: Return Firebase auth token + +User -> PC: Trigger asynchronous calls +PC -> FB: Execute async calls and return data +FB -> PC: Return async call results +PC -> User: Return results of async calls + +@enduml