# CacaoDocs π«π
π **CacaoDocs** is a lightweight Python package that effortlessly extracts API documentation directly from your code's docstrings. πβ¨ Designed to make generating visually stunning docs quick and easy, it removes the hassle of heavy configuration tools like Sphinx. π«π
I created CacaoDocs because I wanted a simple and beautiful way to produce documentation from docstrings without the repetitive setup. π οΈπ‘ It was a cool project ideaβI was spending too much time customizing Sphinx to fit my needs, only to redo the whole process for each new project. So, I decided to build something streamlined and visually appealing instead. ππ
With CacaoDocs, you can focus more on your code and less on documentation setup, making your development workflow smoother and more enjoyable! ππ
## π§ Note
CacaoDocs is still under development. It doesn't feature many customization options yet, and you might encounter limitations. Don't expect a fully functional package out of the boxβbut feel free to contribute and help improve it! π€β¨
## β¨ Features
- **`doc_type="api"`**: Identify and document your API endpoints (methods and routes). π‘π οΈ
- **`doc_type="types"`**: Document data models (classes) that represent objects or entities. ποΈπ
- **`doc_type="docs"`**: General documentation for your classes and methods (e.g., core logic or utility functions). ππ§
- **Live Preview**: Instantly see your documentation changes in real-time as you code. ππ
- **Multiple Output Formats**: Generate docs in various formats like HTML & Json. ππ±π»
- **Global Search Functionality with FlexSearch**: Easily find what you need within your documentation with built-in search. ππ
<img width="336" alt="image" src="https://github.com/user-attachments/assets/21c8e836-5ec6-4364-9fb7-56ff8afeecd3" />
- **Link Generation**: Automatically create links between different parts of your documentation for easy navigation. ππΊοΈ
- **Code Snippet Copying**: Easily copy code examples from your documentation with a single click. ππ»
- **API Status Tracking**: Display the current status of each API endpoint, indicating whether it's under development or in production. π οΈπ
- **ER Diagram for the Types Page**: Visual representation of the data models and their relationships within the Types documentation. ππ
- **Recent Changes View Based on "Last Updated"**: Easily view the latest updates and modifications to your documentation based on the "Last Updated" timestamps. ππ
- **Analytics Integration**: Track documentation usage with Google Analytics 4 and Microsoft Clarity. ππ
- **Usage Insights**: Understand how users interact with your documentation through heatmaps and session recordings. π₯π
## π Upcoming Features
- **AI-Powered Documentation**: Leverage OpenAI to generate custom, intelligent documentation tailored to your codebase. π€πβ¨
- **Plugin System**: Extend CacaoDocs functionality with plugins to suit your specific needs. π§©π
---
Join the CacaoDocs community and contribute to making documentation generation easier and more beautiful for everyone! πβ€οΈ

## Installation
Install **CacaoDocs** from PyPI:
```bash
pip install cacaodocs
```
## Usage
### 1. Example with a Normal Class
Below is a simple example of how to annotate your methods using the `@CacaoDocs.doc_api` decorator. CacaoDocs will parse your docstrings and generate structured documentation automatically.
```python
from cacaodocs import CacaoDocs
class UserManager:
def __init__(self):
"""
Initializes the UserManager with an empty user database.
"""
self.users = {}
self.next_id = 1
@CacaoDocs.doc_api(doc_type="docs", tag="user_manager")
def create_user(self, username: str, email: str) -> dict:
"""
Method: create_user
Version: v1
Status: Production
Description:
Creates a new user with a unique ID, username, and email.
Args:
username (str): The username of the new user.
email (str): The email address of the new user.
Returns:
@type{User}
"""
user_id = self.next_id
self.users[user_id] = {
"id": user_id,
"username": username,
"email": email
}
self.next_id += 1
return self.users[user_id]
@CacaoDocs.doc_api(doc_type="docs", tag="user_manager")
def get_user(self, user_id: int) -> dict:
"""
Method: get_user
Version: v1
Status: Production
Description:
Retrieves the details of a user by their unique ID.
Args:
user_id (int): The unique identifier of the user.
Raises:
KeyError: If the user with the specified ID does not exist.
Returns:
@type{dict}: A dictionary containing the user's ID, username, and email.
"""
try:
return self.users[user_id]
except KeyError:
raise KeyError(f"User with ID {user_id} does not exist.")
```
### 2. Example in a Flask Application
Below is an example `app.py` showing how to set up CacaoDocs within a Flask app. Once your code is annotated with `@CacaoDocs.doc_api`, it will automatically detect endpoints and methods unless you explicitly override them in the docstring.
```python
from flask import Flask, request, jsonify
from cacaodocs import CacaoDocs
# Load the CacaoDocs configuration
CacaoDocs.load_config()
app = Flask(__name__)
@app.route('/api/users', methods=['POST'])
@CacaoDocs.doc_api(doc_type="api", tag="users")
def create_user():
"""
Method: POST
Version: v1
Status: Production
Last Updated: 2024-04-25
Description:
Creates a new user with the provided details.
Responses:
201:
description: "User successfully created."
example: {"id": 12345, "username": "johndoe"}
400:
description: "Bad request due to invalid input."
example: {"error": "Invalid email format."}
"""
data = request.json or {}
try:
# Assuming `db` is an instance of UserManager or similar
user = db.create_user(data)
return jsonify(user.to_dict()), 201
except Exception as e:
return jsonify({"error": str(e)}), 400
@app.route('/api/users/<int:user_id>', methods=['GET'])
@CacaoDocs.doc_api(doc_type="api", tag="users")
def get_user(user_id):
"""
Endpoint: /api/users_custom/<user_id>
Method: GET
Version: v1
Status: Production
Last Updated: 2024-04-25
Description:
Retrieves the details of a user given their unique ID.
Args:
user_id (int): The unique identifier of the user.
Raises:
UserNotFoundError: If no user is found with the given `user_id`.
Responses:
Data:
example: @type{User}
"""
return {"error": "User not found"}, 404
@app.route('/docs', methods=['GET'])
def get_documentation():
"""
Endpoint: /docs
Method: GET
Version: v1
Status: Production
Last Updated: 2024-04-25
Description:
Returns a JSON object containing metadata for all documented endpoints.
"""
documentation = CacaoDocs.get_json()
response = jsonify(documentation)
response.headers.add('Access-Control-Allow-Origin', '*') # Enable CORS
return response, 200
@app.route('/', methods=['GET'])
def get_documentation_html():
"""
Endpoint: /
Method: GET
Version: v1
Status: Production
Last Updated: 2024-04-25
Description:
Returns an HTML page containing the API documentation.
Returns:
200:
description: "HTML documentation retrieved successfully."
example: "<html><body>API Documentation</body></html>"
"""
html_documentation = CacaoDocs.get_html()
return html_documentation, 200, {'Content-Type': 'text/html'}
```
#### Generating HTML Documentation
If you need to serve the HTML version of your docs directly, you can simply call:
```python
html_documentation = CacaoDocs.get_html()
```
### 3. Example for `types`
You can also document data models or classes with `doc_type="types"`. For example:
```python
from dataclasses import dataclass, asdict
from cacaodocs import CacaoDocs
@dataclass
@CacaoDocs.doc_api(doc_type="types", tag="locations")
class Address:
"""
Description:
Represents a user's address in the system.
Args:
street (str): Street name and number
city (City): City information
country (Country): Country information
postal_code (str): Postal or ZIP code
"""
street: str
city: 'City'
country: 'Country'
postal_code: str
def to_dict(self) -> dict:
"""Convert address to dictionary format."""
return {
'street': self.street,
'city': asdict(self.city),
'country': asdict(self.country),
'postal_code': self.postal_code
}
@classmethod
def from_dict(cls, data: dict) -> 'Address':
"""Create an Address instance from a dictionary."""
return cls(
street=data['street'],
city=City(**data['city']),
country=Country(**data['country']),
postal_code=data['postal_code']
)
```
### 4. API Status Tracking
CacaoDocs now includes **API Status Tracking**, allowing you to indicate whether each endpoint is under development or in production. This helps in maintaining clarity about the stability and readiness of different parts of your API.
**Example:**
```python
@CacaoDocs.doc_api(doc_type="api", tag="users")
def delete_user(user_id: int):
"""
Endpoint: /api/users/<user_id>
Method: DELETE
Version: v1
Status: Under Development
Last Updated: 2024-05-10
Description:
Deletes a user by their unique ID.
Args:
user_id (int): The unique identifier of the user to delete.
Responses:
200:
description: "User successfully deleted."
404:
description: "User not found."
"""
# Implementation goes here
pass
```
### 5. ER Diagram for the Types Page
To provide a clear understanding of the relationships between different data models, CacaoDocs now supports embedding an **ER Diagram** within the Types documentation.
**Example:**

*Figure 1: ER Diagram for the Types Page*
### 6. Recent Changes View Based on "Last Updated"
CacaoDocs introduces a **Recent Changes View** that allows you to track the latest modifications to your documentation based on the "Last Updated" timestamps.
**Example:**
```json
{
"endpoints": [
{
"path": "/api/users",
"method": "POST",
"last_updated": "2024-04-25",
"status": "Production"
},
{
"path": "/api/users/<int:user_id>",
"method": "GET",
"last_updated": "2024-04-25",
"status": "Production"
},
{
"path": "/api/users/<user_id>",
"method": "DELETE",
"last_updated": "2024-05-10",
"status": "Under Development"
}
],
"types": [
{
"name": "Address",
"last_updated": "2024-03-15"
}
]
}
```
This JSON structure allows developers to quickly identify the most recently updated parts of the documentation, ensuring they stay informed about the latest changes.
## Contributing
CacaoDocs is a work in progress, and any contributions are welcome. Whether itβs:
- Suggesting improvements or new features
- Submitting bug reports
- Contributing directly with pull requests
Feel free to open an issue or create a PR in this repository.
---
**Happy documenting!**
---
# Screenshots
<img width="695" alt="image" src="https://github.com/user-attachments/assets/5dcac8db-8fe6-44d6-b683-b4afc37a59e2" />
*Figure 2: API Status Tracking*
<img width="809" alt="image" src="https://github.com/user-attachments/assets/fb946c05-48c3-4466-8578-5e266bc111ba" />
*Figure 3: Recent Changes View Based on "Last Updated"*
---
Feel free to customize the image URLs and additional sections as needed to fit your project's structure and resources.
Raw data
{
"_id": null,
"home_page": "https://github.com/jhd3197/CacaoDocs",
"name": "cacaodocs",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": null,
"author": "Juan Denis",
"author_email": "juan@vene.co",
"download_url": "https://files.pythonhosted.org/packages/f7/3a/3f9aaa58349f4e2b5e4de898891f644706200e086726ad07cb516bf9f233/cacaodocs-0.1.13.tar.gz",
"platform": null,
"description": "# CacaoDocs \ud83c\udf6b\ud83d\udcda\n\n\ud83c\udf1f **CacaoDocs** is a lightweight Python package that effortlessly extracts API documentation directly from your code's docstrings. \ud83d\udc0d\u2728 Designed to make generating visually stunning docs quick and easy, it removes the hassle of heavy configuration tools like Sphinx. \ud83d\udeab\ud83d\udcc4\n\nI created CacaoDocs because I wanted a simple and beautiful way to produce documentation from docstrings without the repetitive setup. \ud83d\udee0\ufe0f\ud83d\udca1 It was a cool project idea\u2014I was spending too much time customizing Sphinx to fit my needs, only to redo the whole process for each new project. So, I decided to build something streamlined and visually appealing instead. \ud83c\udf89\ud83d\udcda\n\nWith CacaoDocs, you can focus more on your code and less on documentation setup, making your development workflow smoother and more enjoyable! \ud83d\ude80\ud83d\udd0d\n\n## \ud83d\udea7 Note\nCacaoDocs is still under development. It doesn't feature many customization options yet, and you might encounter limitations. Don't expect a fully functional package out of the box\u2014but feel free to contribute and help improve it! \ud83e\udd1d\u2728\n\n## \u2728 Features\n- **`doc_type=\"api\"`**: Identify and document your API endpoints (methods and routes). \ud83d\udce1\ud83d\udee0\ufe0f\n- **`doc_type=\"types\"`**: Document data models (classes) that represent objects or entities. \ud83d\uddc3\ufe0f\ud83d\udd0d\n- **`doc_type=\"docs\"`**: General documentation for your classes and methods (e.g., core logic or utility functions). \ud83d\udcdd\ud83d\udd27\n- **Live Preview**: Instantly see your documentation changes in real-time as you code. \ud83d\udc40\ud83d\udd04\n- **Multiple Output Formats**: Generate docs in various formats like HTML & Json. \ud83d\udcc4\ud83d\udcf1\ud83d\udcbb\n- **Global Search Functionality with FlexSearch**: Easily find what you need within your documentation with built-in search. \ud83d\udd0d\ud83d\udcd1\n\n <img width=\"336\" alt=\"image\" src=\"https://github.com/user-attachments/assets/21c8e836-5ec6-4364-9fb7-56ff8afeecd3\" />\n\n- **Link Generation**: Automatically create links between different parts of your documentation for easy navigation. \ud83d\udd17\ud83d\uddfa\ufe0f\n- **Code Snippet Copying**: Easily copy code examples from your documentation with a single click. \ud83d\udccb\ud83d\udcbb\n- **API Status Tracking**: Display the current status of each API endpoint, indicating whether it's under development or in production. \ud83d\udee0\ufe0f\ud83d\udd04\n- **ER Diagram for the Types Page**: Visual representation of the data models and their relationships within the Types documentation. \ud83d\udcca\ud83d\udcda\n- **Recent Changes View Based on \"Last Updated\"**: Easily view the latest updates and modifications to your documentation based on the \"Last Updated\" timestamps. \ud83d\udd52\ud83d\udd0d\n- **Analytics Integration**: Track documentation usage with Google Analytics 4 and Microsoft Clarity. \ud83d\udcca\ud83d\udd0d\n- **Usage Insights**: Understand how users interact with your documentation through heatmaps and session recordings. \ud83d\udc65\ud83d\udcc8\n\n## \ud83d\ude80 Upcoming Features\n- **AI-Powered Documentation**: Leverage OpenAI to generate custom, intelligent documentation tailored to your codebase. \ud83e\udd16\ud83d\udcdd\u2728\n- **Plugin System**: Extend CacaoDocs functionality with plugins to suit your specific needs. \ud83e\udde9\ud83d\udd0c\n\n---\n\nJoin the CacaoDocs community and contribute to making documentation generation easier and more beautiful for everyone! \ud83c\udf0d\u2764\ufe0f\n\n\n\n## Installation\n\nInstall **CacaoDocs** from PyPI:\n\n```bash\npip install cacaodocs\n```\n\n## Usage\n\n### 1. Example with a Normal Class\n\nBelow is a simple example of how to annotate your methods using the `@CacaoDocs.doc_api` decorator. CacaoDocs will parse your docstrings and generate structured documentation automatically.\n\n```python\nfrom cacaodocs import CacaoDocs\n\nclass UserManager:\n def __init__(self):\n \"\"\"\n Initializes the UserManager with an empty user database.\n \"\"\"\n self.users = {}\n self.next_id = 1\n\n @CacaoDocs.doc_api(doc_type=\"docs\", tag=\"user_manager\")\n def create_user(self, username: str, email: str) -> dict:\n \"\"\"\n Method: create_user\n Version: v1\n Status: Production\n\n Description:\n Creates a new user with a unique ID, username, and email.\n\n Args:\n username (str): The username of the new user.\n email (str): The email address of the new user.\n\n Returns:\n @type{User}\n \"\"\"\n user_id = self.next_id\n self.users[user_id] = {\n \"id\": user_id,\n \"username\": username,\n \"email\": email\n }\n self.next_id += 1\n return self.users[user_id]\n\n @CacaoDocs.doc_api(doc_type=\"docs\", tag=\"user_manager\")\n def get_user(self, user_id: int) -> dict:\n \"\"\"\n Method: get_user\n Version: v1\n Status: Production\n\n Description:\n Retrieves the details of a user by their unique ID.\n\n Args:\n user_id (int): The unique identifier of the user.\n\n Raises:\n KeyError: If the user with the specified ID does not exist.\n\n Returns:\n @type{dict}: A dictionary containing the user's ID, username, and email.\n \"\"\"\n try:\n return self.users[user_id]\n except KeyError:\n raise KeyError(f\"User with ID {user_id} does not exist.\")\n```\n\n### 2. Example in a Flask Application\n\nBelow is an example `app.py` showing how to set up CacaoDocs within a Flask app. Once your code is annotated with `@CacaoDocs.doc_api`, it will automatically detect endpoints and methods unless you explicitly override them in the docstring.\n\n```python\nfrom flask import Flask, request, jsonify\nfrom cacaodocs import CacaoDocs\n\n# Load the CacaoDocs configuration\nCacaoDocs.load_config()\n\napp = Flask(__name__)\n\n@app.route('/api/users', methods=['POST'])\n@CacaoDocs.doc_api(doc_type=\"api\", tag=\"users\")\ndef create_user():\n \"\"\"\n Method: POST\n Version: v1\n Status: Production\n Last Updated: 2024-04-25\n\n Description:\n Creates a new user with the provided details.\n\n Responses:\n 201:\n description: \"User successfully created.\"\n example: {\"id\": 12345, \"username\": \"johndoe\"}\n 400:\n description: \"Bad request due to invalid input.\"\n example: {\"error\": \"Invalid email format.\"}\n \"\"\"\n data = request.json or {}\n try:\n # Assuming `db` is an instance of UserManager or similar\n user = db.create_user(data)\n return jsonify(user.to_dict()), 201\n except Exception as e:\n return jsonify({\"error\": str(e)}), 400\n\n@app.route('/api/users/<int:user_id>', methods=['GET'])\n@CacaoDocs.doc_api(doc_type=\"api\", tag=\"users\")\ndef get_user(user_id):\n \"\"\"\n Endpoint: /api/users_custom/<user_id>\n Method: GET\n Version: v1\n Status: Production\n Last Updated: 2024-04-25\n\n Description:\n Retrieves the details of a user given their unique ID.\n\n Args:\n user_id (int): The unique identifier of the user.\n\n Raises:\n UserNotFoundError: If no user is found with the given `user_id`.\n\n Responses:\n Data:\n example: @type{User}\n \"\"\"\n return {\"error\": \"User not found\"}, 404\n\n@app.route('/docs', methods=['GET'])\ndef get_documentation():\n \"\"\"\n Endpoint: /docs\n Method: GET\n Version: v1\n Status: Production\n Last Updated: 2024-04-25\n\n Description:\n Returns a JSON object containing metadata for all documented endpoints.\n \"\"\"\n documentation = CacaoDocs.get_json()\n response = jsonify(documentation)\n response.headers.add('Access-Control-Allow-Origin', '*') # Enable CORS\n return response, 200\n\n@app.route('/', methods=['GET'])\ndef get_documentation_html():\n \"\"\"\n Endpoint: /\n Method: GET\n Version: v1\n Status: Production\n Last Updated: 2024-04-25\n\n Description:\n Returns an HTML page containing the API documentation.\n\n Returns:\n 200:\n description: \"HTML documentation retrieved successfully.\"\n example: \"<html><body>API Documentation</body></html>\"\n \"\"\"\n html_documentation = CacaoDocs.get_html()\n return html_documentation, 200, {'Content-Type': 'text/html'}\n```\n\n#### Generating HTML Documentation\nIf you need to serve the HTML version of your docs directly, you can simply call:\n\n```python\nhtml_documentation = CacaoDocs.get_html()\n```\n\n### 3. Example for `types`\n\nYou can also document data models or classes with `doc_type=\"types\"`. For example:\n\n```python\nfrom dataclasses import dataclass, asdict\nfrom cacaodocs import CacaoDocs\n\n@dataclass\n@CacaoDocs.doc_api(doc_type=\"types\", tag=\"locations\")\nclass Address:\n \"\"\"\n Description:\n Represents a user's address in the system.\n\n Args:\n street (str): Street name and number\n city (City): City information\n country (Country): Country information\n postal_code (str): Postal or ZIP code\n \"\"\"\n street: str\n city: 'City'\n country: 'Country'\n postal_code: str\n\n def to_dict(self) -> dict:\n \"\"\"Convert address to dictionary format.\"\"\"\n return {\n 'street': self.street,\n 'city': asdict(self.city),\n 'country': asdict(self.country),\n 'postal_code': self.postal_code\n }\n\n @classmethod\n def from_dict(cls, data: dict) -> 'Address':\n \"\"\"Create an Address instance from a dictionary.\"\"\"\n return cls(\n street=data['street'],\n city=City(**data['city']),\n country=Country(**data['country']),\n postal_code=data['postal_code']\n )\n```\n\n### 4. API Status Tracking\n\nCacaoDocs now includes **API Status Tracking**, allowing you to indicate whether each endpoint is under development or in production. This helps in maintaining clarity about the stability and readiness of different parts of your API.\n\n**Example:**\n\n```python\n@CacaoDocs.doc_api(doc_type=\"api\", tag=\"users\")\ndef delete_user(user_id: int):\n \"\"\"\n Endpoint: /api/users/<user_id>\n Method: DELETE\n Version: v1\n Status: Under Development\n Last Updated: 2024-05-10\n\n Description:\n Deletes a user by their unique ID.\n\n Args:\n user_id (int): The unique identifier of the user to delete.\n\n Responses:\n 200:\n description: \"User successfully deleted.\"\n 404:\n description: \"User not found.\"\n \"\"\"\n # Implementation goes here\n pass\n```\n\n### 5. ER Diagram for the Types Page\n\nTo provide a clear understanding of the relationships between different data models, CacaoDocs now supports embedding an **ER Diagram** within the Types documentation.\n\n**Example:**\n\n\n\n*Figure 1: ER Diagram for the Types Page*\n\n### 6. Recent Changes View Based on \"Last Updated\"\n\nCacaoDocs introduces a **Recent Changes View** that allows you to track the latest modifications to your documentation based on the \"Last Updated\" timestamps.\n\n**Example:**\n\n```json\n{\n \"endpoints\": [\n {\n \"path\": \"/api/users\",\n \"method\": \"POST\",\n \"last_updated\": \"2024-04-25\",\n \"status\": \"Production\"\n },\n {\n \"path\": \"/api/users/<int:user_id>\",\n \"method\": \"GET\",\n \"last_updated\": \"2024-04-25\",\n \"status\": \"Production\"\n },\n {\n \"path\": \"/api/users/<user_id>\",\n \"method\": \"DELETE\",\n \"last_updated\": \"2024-05-10\",\n \"status\": \"Under Development\"\n }\n ],\n \"types\": [\n {\n \"name\": \"Address\",\n \"last_updated\": \"2024-03-15\"\n }\n ]\n}\n```\n\nThis JSON structure allows developers to quickly identify the most recently updated parts of the documentation, ensuring they stay informed about the latest changes.\n\n## Contributing\n\nCacaoDocs is a work in progress, and any contributions are welcome. Whether it\u2019s:\n- Suggesting improvements or new features \n- Submitting bug reports \n- Contributing directly with pull requests \n\nFeel free to open an issue or create a PR in this repository.\n\n---\n\n**Happy documenting!**\n\n---\n\n# Screenshots\n<img width=\"695\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5dcac8db-8fe6-44d6-b683-b4afc37a59e2\" />\n\n*Figure 2: API Status Tracking*\n\n<img width=\"809\" alt=\"image\" src=\"https://github.com/user-attachments/assets/fb946c05-48c3-4466-8578-5e266bc111ba\" />\n\n*Figure 3: Recent Changes View Based on \"Last Updated\"*\n\n---\n\nFeel free to customize the image URLs and additional sections as needed to fit your project's structure and resources.\n",
"bugtrack_url": null,
"license": null,
"summary": "A lightweight Python package to extract API documentation from docstrings.",
"version": "0.1.13",
"project_urls": {
"Homepage": "https://github.com/jhd3197/CacaoDocs"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8c17284e63ef75fcc8ae00ea3b3010e229e8cb89ba3dd23575aa484b6c0f5fbe",
"md5": "ed7f8e577ef66fda806e25fb3913d2fc",
"sha256": "66700253cfa9c5098414779ffa7e86f75a2dc932e3e7e6d03ba365061c3b512c"
},
"downloads": -1,
"filename": "cacaodocs-0.1.13-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ed7f8e577ef66fda806e25fb3913d2fc",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 2450495,
"upload_time": "2025-01-19T23:56:17",
"upload_time_iso_8601": "2025-01-19T23:56:17.375158Z",
"url": "https://files.pythonhosted.org/packages/8c/17/284e63ef75fcc8ae00ea3b3010e229e8cb89ba3dd23575aa484b6c0f5fbe/cacaodocs-0.1.13-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f73a3f9aaa58349f4e2b5e4de898891f644706200e086726ad07cb516bf9f233",
"md5": "797617efc08a7cc5bf4ac43efad9891f",
"sha256": "4bb893023c4a1019d5fa269475981b79d389f61d41597cff5eddc378bdd96110"
},
"downloads": -1,
"filename": "cacaodocs-0.1.13.tar.gz",
"has_sig": false,
"md5_digest": "797617efc08a7cc5bf4ac43efad9891f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 2434738,
"upload_time": "2025-01-19T23:56:19",
"upload_time_iso_8601": "2025-01-19T23:56:19.940654Z",
"url": "https://files.pythonhosted.org/packages/f7/3a/3f9aaa58349f4e2b5e4de898891f644706200e086726ad07cb516bf9f233/cacaodocs-0.1.13.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-19 23:56:19",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jhd3197",
"github_project": "CacaoDocs",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "Jinja2",
"specs": [
[
"==",
"3.1.5"
]
]
},
{
"name": "Markdown",
"specs": [
[
"==",
"3.7"
]
]
},
{
"name": "beautifulsoup4",
"specs": [
[
"==",
"4.12.3"
]
]
},
{
"name": "Flask",
"specs": [
[
"==",
"2.2.5"
]
]
},
{
"name": "PyYAML",
"specs": [
[
"==",
"6.0.2"
]
]
},
{
"name": "Werkzeug",
"specs": [
[
"==",
"3.0.6"
]
]
},
{
"name": "Flask-Cors",
"specs": [
[
"==",
"5.0.0"
]
]
}
],
"lcname": "cacaodocs"
}