Setting up code quality tools in a project can seem intimidating at first, but I took on the challenge with ReadCraft and had an awesome experience! In this post, I’ll walk you through the tools I picked, the setup process, and the surprising discoveries along the way. I’ll also share the challenges I faced, including a tricky token usage fix, and how I tackled them. Let’s dive in! 🌊
🛠 Tools of the Trade: Why Black and Flake8?
To maintain clean, readable code, I chose two Python tools that make life a lot easier:
Black: Black is a “no-nonsense” code formatter. It decides on a code style and enforces it every time you run it, so you don’t need to worry about formatting. It’s fast, opinionated, and gives you back time that would have gone into tedious formatting debates.
Flake8: Flake8 is a linter that spots issues and potential bugs in Python code. Think of it as a super-smart friend who catches mistakes before they become headaches. Flake8 goes through the code, highlights errors, and keeps everything consistent. 🎩
These tools keep code quality high and avoid cluttering up my code with mistakes or inconsistencies. Want to add these to your project? Here’s how I set them up!
🔧 The Setup Process: Making Magic Happen ✨
Here’s the step-by-step guide to setting up Black and Flake8 for ReadCraft (or any Python project):
Step 1: Configuring Black
- Configuration File: I created a pyproject.toml file to store Black’s settings. This config file specifies the line length, which Black enforces to keep code easily readable.
- Ignore Unwanted Files: I added a .blackignore file to exclude directories like venv/ and output folders. This way, Black only formats the relevant files and skips unnecessary ones.
Step 2: Setting Up Flake8
- Configuration File: I added a .flake8 file to set up the linter. This config file tells Flake8 which issues to ignore, sets a max line length, and specifies folders to exclude (e.g., .git and virtual environments).
- Running the Linter: Running flake8 . in the terminal checks all Python files in the current directory, identifying errors and stylistic inconsistencies.
Fixing the Token Usage Issue
While setting up the code, I ran into an interesting problem: I was trying to check token usage directly from the API, but I wasn’t handling it correctly in my code. With some guidance (shoutout to the help I received!), I updated the code to ensure that token usage was only calculated once and displayed correctly.
Making it Easy with a Script
To simplify running both tools, I created a shell script format.sh:
#!/bin/bash
# Run Black only on the main project files
black readme_generator.py
# Run Flake8 for linting
flake8 .
Now, with a single ./format.sh command, Black and Flake8 will work their magic on the key project files, keeping everything formatted and linted.
🔎 What Did I Find? The Surprising Results! 🤯
After running Black and Flake8, I was impressed—and a little surprised. Here’s what each tool found:
- Black made my code look sleek and consistent. It fixed indentation issues and adjusted line lengths, making everything cleaner and more readable.
- Flake8 flagged a variety of issues: unused imports, variables assigned but not used, and some style inconsistencies. These are easy to overlook but can create confusion or bugs over time. Fixing these made the code more reliable and professional.
🎨 Integrating Tools with VSCode: Making It Seamless
To make sure formatting and linting happen automatically, I set up Visual Studio Code (VSCode) to handle it as I work.
Setting It Up in VSCode:
- Open Project: Open the project in **VSCode or GitHub Codespaces.
- Install Extensions: If prompted, I installed the **Python, **Black Formatter, and **Flake8 Linter extensions.
- Auto-Format on Save: Black now formats my code every time I save a file.
- Real-Time Linting: Flake8 catches issues as I type, which keeps errors from piling up.
Thanks to .vscode configuration files, any contributor who opens the project in VSCode has the same setup, which keeps everything consistent and easy to manage.
🛠 Automating with a Git Pre-Commit Hook
To make sure nothing slips through the cracks, I added a Git pre-commit hook. This hook automatically runs Black and Flake8 on any files that are about to be committed, ensuring all code is clean and properly formatted before it enters the main branch.
Here’s How I Set Up the Hook:
- Create the Hook File: In .git/hooks/pre-commit, I added the following script:
#!/bin/bash
black .
flake8 .
- Make It Executable:
chmod +x .git/hooks/pre-commit
With this in place, every time I commit, the hook checks for issues and prevents the commit if it finds any problems. No more accidental formatting errors in the main branch!
💥 Challenges Along the Way
Setting everything up wasn’t entirely smooth sailing! Here are some of the challenges I ran into and how I solved them:
- Ignoring Specific Files: Initially, Black formatted files in my virtual environment and output folders, which I didn’t want. Adding a .blackignore file solved this.
- Configuring Linter Rules: Flake8 was a bit strict out of the box, flagging a lot of minor issues. I customized the rules in .flake8 to ignore warnings that weren’t relevant to the project.
- Token Usage: I learned that tracking token usage required careful handling in the code, which I updated after receiving help, ensuring the usage was displayed correctly.
📚 Lessons Learned
Working through this setup was a great learning experience, and I took away some key insights:
- Automating Quality Checks: Tools like Black and Flake8 are invaluable for ensuring code quality, but automating them with hooks and editor integration takes it to the next level.
- Consistency Is Key: With Black, my code style is consistent across files and contributors. This saves time on code reviews and keeps everything readable.
- Catch Issues Early: Flake8 flags potential problems as I code, which helps avoid bigger issues down the road.
Final Thoughts
Setting up tools like Black and Flake8 in ReadCraft has made development more enjoyable and less error-prone. If you’re looking to boost code quality in your project, I highly recommend giving these tools a try. Here’s the commit with the full setup.
Happy coding! 🎉