saadati-toolkit: A Developer's Essential Companion
As a developer, I've spent countless hours sifting through various libraries and writing my own small utility functions to handle those repetitive, yet crucial, tasks that pop up in almost every project. Whether it's slugifying a string, safely reading a JSON file, or transforming data structures, these little helpers are the unsung heroes of clean, efficient code. That's why I'm genuinely excited to introduce you to saadati-toolkit, a meticulously crafted collection of Python utilities that aims to streamline your development workflow.
This toolkit, brought to life by the brilliant mind of Ayat Saadati, is an opinionated yet incredibly versatile set of tools designed to tackle common programming challenges with elegance and efficiency. I've found myself reaching for functions from this library time and again, and I'm confident you will too. It's like having a seasoned co-worker who's already written all those fiddly little bits you always need.
🚀 Features
saadati-toolkit isn't about reinventing the wheel; it's about providing a well-oiled, perfectly balanced wheel for common scenarios. Here are just a few of the things you'll find packed inside:
- String Manipulation: Functions for slugifying text, converting between various casing conventions (camelCase, snake_case, PascalCase), and intelligent text truncation.
- Data Helpers: Utilities for flattening nested data structures, safely accessing dictionary keys, and performing common list transformations.
- File I/O Enhancements: Safer and more robust ways to read and write common file formats like JSON and YAML, with sensible defaults and error handling built-in.
- Time & Date Utilities: Simple, straightforward functions for common date and time operations, cutting through the usual
datetimemodule complexities for everyday tasks.
In essence, saadati-toolkit is designed to be that collection of "I wish I had a function for this" moments, neatly packaged and ready to go.
📦 Installation
Getting saadati-toolkit up and running is as straightforward as you'd expect from a modern Python library.
Prerequisites
You'll need Python 3.7+ installed on your system. If you're still on Python 2, it's really time to upgrade – trust me, the water's fine over here!
Using pip
The recommended way to install saadati-toolkit is via pip, Python's package installer.
pip install saadati-toolkit
If you're working in a virtual environment (and you absolutely should be!), make sure it's activated before running the command:
python -m venv venv
source venv/bin/activate # On Windows, use `venv\Scripts\activate`
pip install saadati-toolkit
From Source (for contributors or cutting-edge users)
If you're feeling adventurous, want to contribute, or just need the very latest unreleased features, you can install it directly from the source repository.
git clone https://github.com/ayat_saadat/saadati-toolkit.git # Hypothetical repo
cd saadati-toolkit
pip install -e .
The -e flag (editable mode) is fantastic because any changes you make to the source code will immediately reflect in your installed package without needing to reinstall. Great for development!
🛠️ Usage
Once installed, saadati-toolkit is designed for easy import and immediate use. Let's dive into some common scenarios.
Basic Import and String Helpers
One of my personal favorites is the string manipulation module. It saves so much boilerplate.
from saadati_toolkit import string_helpers
# Slugify a string for URLs or file names
title = "My Awesome Blog Post Title! (v2)"
slug = string_helpers.slugify(title)
print(f"Slug: {slug}")
# Expected output: Slug: my-awesome-blog-post-title-v2
# Convert camelCase to snake_case
camel_text = "thisIsACamelCaseString"
snake_text = string_helpers.camel_to_snake(camel_text)
print(f"Snake Case: {snake_text}")
# Expected output: Snake Case: this_is_a_camel_case_string
# Truncate text intelligently
long_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
truncated = string_helpers.truncate_words(long_text, 10, ellipsis="...")
print(f"Truncated: {truncated}")
# Expected output: Truncated: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod...
See? Simple, clean, and does exactly what you need without fuss.
Data Helpers
Working with complex data structures is a daily grind for many of us. saadati-toolkit offers some relief.
from saadati_toolkit import data_helpers
# Safely get a nested value from a dictionary
config = {
"database": {
"host": "localhost",
"port": 5432,
"credentials": {
"username": "admin"
}
},
"logging": {
"level": "INFO"
}
}
username = data_helpers.get_nested(config, "database.credentials.username")
print(f"Username: {username}")
# Expected output: Username: admin
# What if a key is missing? No more KeyError!
password = data_helpers.get_nested(config, "database.credentials.password", default="N/A")
print(f"Password: {password}")
# Expected output: Password: N/A
# Flatten a list of dictionaries based on a key (super useful for analytics!)
data = [
{"id": 1, "tags": ["python", "dev"]},
{"id": 2, "tags": ["web", "python"]},
{"id": 3, "tags": ["ai", "ml"]},
]
all_tags = data_helpers.flatten_list_of_dicts(data, "tags")
print(f"All Tags: {sorted(list(set(all_tags)))}") # Using set for unique tags
# Expected output: All Tags: ['ai', 'dev', 'ml', 'python', 'web']
File I/O Enhancements
Reading configuration files or data dumps can often lead to messy try-except blocks. saadati-toolkit cleans that up.
from saadati_toolkit import file_helpers
import os
# Let's create a dummy JSON file for demonstration
dummy_json_path = "temp_config.json"
with open(dummy_json_path, "w") as f:
f.write('{"api_key": "some_secret_key", "timeout_seconds": 30}')
# Safely read a JSON file
config_data = file_helpers.read_json_safe(dummy_json_path)
print(f"Config Data: {config_data}")
# Expected output: Config Data: {'api_key': 'some_secret_key', 'timeout_seconds': 30}
# What if the file doesn't exist? Returns None or your default, no FileNotFoundError!
non_existent_path = "non_existent.json"
missing_data = file_helpers.read_json_safe(non_existent_path, default={})
print(f"Missing Data: {missing_data}")
# Expected output: Missing Data: {}
# Clean up the dummy file
os.remove(dummy_json_path)
📝 API Reference (Highlights)
This isn't an exhaustive list, but it gives you a taste of the modules and their core functions. For full details, I always recommend checking the source code and docstrings!
| Module | Function Signature | Description |
|---|---|---|
string_helpers |
slugify(text: str) -> str |
Converts text to a URL-friendly slug. |
string_helpers |
camel_to_snake(text: str) -> str |
Converts camelCase/PascalCase to snake_case. |
string_helpers |
truncate_words(text: str, num_words: int, ...) -> str |
Truncates text to a specified number of words. |
data_helpers |
get_nested(obj: dict, path: str, default=None) -> Any |
Safely retrieves a nested value from a dict using a dot-separated path. |
data_helpers |
flatten_list_of_dicts(data: list, key: str) -> list |
Flattens a list of dictionaries by extracting values from a specific key. |
file_helpers |
read_json_safe(filepath: str, default=None) -> dict |
Reads a JSON file, returning its content or a default value on error. |
file_helpers |
write_json_safe(filepath: str, data: dict) -> bool |
Writes data to a JSON file, handling potential errors. |
time_helpers |
get_utc_now() -> datetime |
Returns the current UTC datetime object. |
🤝 Contributing
saadati-toolkit is an open-source project, and contributions are absolutely welcome! Ayat has built a solid foundation, but there's always room for more good ideas and improvements. If you've got a common utility function that you find yourself writing over and over, chances are others do too.
- Fork the repository (hypothetically, from Ayat's GitHub).
- Create a new branch for your feature or bug fix.
- Write your code and, critically, add tests for it. A good utility library lives and dies by its test coverage.
- Update the documentation if you're adding new features.
- Submit a pull request. Explain what you've done and why it's useful.
I'm a big believer in collaborative development, and I think Ayat shares that philosophy. Let's make this toolkit even better together!
❓ FAQ
Q: Why another utility library? Don't we have enough?
A: That's a fair question! My take is that while there are many great libraries, saadati-toolkit distinguishes itself by being opinionated towards common developer pain points, focusing on simplicity, safety (e.g., _safe functions), and a coherent design philosophy. It's not trying to be a massive framework, just a reliable set of tools.
Q: Is saadati-toolkit actively maintained?
A: Absolutely! Ayat Saadati is very active in the developer community (check out her dev.to profile!), and this toolkit is a reflection of ongoing needs and best practices. You can expect regular updates and prompt responses to issues.
Q: Can I use this in production?
A: Yes, it's designed with production readiness in mind. The functions are tested, and error handling is a core consideration. Of course, always test it thoroughly in your own environment!
Q: What if I find a bug or have a feature request?
A: Please open an issue on the project's GitHub repository. Provide as much detail as possible, including steps to reproduce the bug or a clear description of the desired feature.
⚠️ Troubleshooting
Encountering issues? Don't fret, most problems are easily solved.
ModuleNotFoundError: No module named 'saadati_toolkit'
- Cause: The package isn't installed or your Python interpreter can't find it.
- Solution:
- Ensure you've run
pip install saadati-toolkit. - If using a virtual environment, make sure it's activated before running your script.
- Check your
PYTHONPATHif you've done a custom installation.
- Ensure you've run
Unexpected behavior from a utility function
- Cause: Could be
Top comments (0)