Skip to main content

Multi-language TODO comment extractor written in Rust.

Project description

Rusty TODO MD — A Pre-Commit Hook for Managing TODOs

Rusty TODO MD is a pre-commit hook designed to help you manage and centralize all your code's TODO comments by automatically extracting them and synchronizing them into a single TODO.md file. With support for multiple languages—currently Python, Rust, JavaScript, and Go—Rusty TODO MD now organizes TODOs using a new sectioned format for enhanced readability and easier maintenance.


✨ Key Features

  1. Automatic TODO Collection
    By default, Rusty TODO MD scans your staged files (or all tracked files using the --all-files flag) for markers like TODO and FIXME, and updates your TODO.md with any new entries.

  2. Sectioned TODO.md Format
    The TODO.md file is now organized into sections, grouped first by marker (e.g., # TODO, # FIXME), then by file. Each marker section begins with a header (# <MARKER>), each file with a sub-header (## <file-path>), followed by a list of extracted TODO items.

  3. Multi-line TODO Support
    Handles multi-line and indented TODO comments, merging them into a single entry.

  4. Sync Mechanism

    • Automatically merges new TODO entries with existing ones, using an internal representation.
    • Removes entries when their corresponding TODOs are no longer present in the source code.
  5. Language-Aware Parsing
    Supports precise parsing for Python, Rust, JavaScript, and Go out-of-the-box, with plans for additional languages such as TypeScript, PHP, and Java.

  6. Seamless Pre-Commit Integration
    Easily integrate Rusty TODO MD into your workflow by adding it to your .pre-commit-config.yaml.


🚀 Objective

Scattered TODO comments can be hard to track and maintain. Rusty TODO MD centralizes these comments in a structured, sectioned TODO.md file—making it simpler to review outstanding tasks and keep your documentation in sync with your codebase.


⚙️ Installation & Setup

Option 1: PyPI Installation (Recommended)

Install directly from PyPI using pip:

pip install rusty_todo_md

Then you can use it directly:

rusty-todo-md --help

Option 2: Pre-Commit Hook Integration

With PyPI (Recommended - No Rust toolchain required)

Add the following to your .pre-commit-config.yaml:

repos:
  - repo: https://github.com/simone-viozzi/rusty-todo-md
    rev: v1.1.0  # Use the latest version
    hooks:
      - id: rusty-todo-md
        language: python
        additional_dependencies: ["rusty_todo_md==1.1.0"]

With Git Repository

Add the following snippet to your .pre-commit-config.yaml file at the root of your repository:

repos:
  - repo: https://github.com/simone-viozzi/rusty-todo-md
    rev: v1.1.0  # Use the latest version
    hooks:
      - id: rusty-todo-md

1. Install Pre-Commit

If you haven't already installed pre-commit:

pip install pre-commit

(Alternatively, use your preferred package manager.)

2. Configure Pre-Commit

Add the following snippet to your .pre-commit-config.yaml file at the root of your repository:

repos:
  - repo: https://github.com/simone-viozzi/rusty-todo-md
    rev: v0.1.8-alpha.11
    hooks:
      - id: rusty-todo-md

Replace rev with the desired tag or commit hash.

3. Install the Pre-Commit Hook

Run the following command from your repository root:

pre-commit install

Rusty TODO MD will now run on your staged files each time you commit.


🧩 CLI Usage (Optional)

You can also run Rusty TODO MD manually:

rusty-todo-md --all-files
  • --all-files: Scans all tracked files instead of just the staged ones.
  • --marker/-m: Specify one or more keywords to search for (e.g., TODO, FIXME, HACK). Can be used multiple times.

Example:

rusty-todo-md --markers TODO FIXME HACK

Or specify a custom location for your TODO file:

rusty-todo-md --todo-path docs/TODOS.md

📝 How It Works

  1. File Discovery

    • By default, scans the staged files in your Git index.
    • With the --all-files flag, scans all tracked files in the repository.
  2. Comment Extraction

    • Parses file comments (ignoring code or string literals) to extract markers like TODO and FIXME.
    • Supports multi-line and indented comment structures.
  3. Sectioned TODO.md Format

    • Organizes extracted TODOs into sections grouped by marker and file.
    • Each marker section starts with a header (# <MARKER>), each file with a sub-header (## <file-path>), followed by formatted entries:
      * [<file-path>:<line_number>](<file-path>#L<line_number>): TODO message
      
  4. Sync Mechanism

    • Reads the existing TODO.md using the new parser.
    • Merges new TODO entries with the existing ones using an internal representation.
    • Writes the updated, sectioned list back to TODO.md.

🔧 Configuration

  • Markers: The tool searches for TODO by default. You can customize markers (e.g., FIXME, HACK) using the --marker/-m CLI argument. Multiple markers are supported and can be specified multiple times.
  • Language Support: Rusty TODO MD provides built-in parsing for Python (.py), Rust (.rs), JavaScript (.js, .jsx), and Go (.go), with planned support for additional languages.

📊 Test Coverage

Rusty TODO MD maintains comprehensive test coverage to ensure reliability and code quality.

CI/CD Coverage

  • Automated Coverage: Every pull request automatically generates coverage reports
  • Coverage Reports: Available as downloadable artifacts from GitHub Actions
  • Format: Reports are generated in LCOV format for broad tool compatibility

VS Code Integration

For the best local development experience:

  1. Install the Coverage Gutters extension
  2. Run cargo tarpaulin --out Lcov --output-dir ./coverage
  3. Open your project in VS Code to see coverage highlights directly in your source files

📚 Example

Python Example

# TODO: Implement data validation
def process_data(data):
    """
    FIXME: Optimize this logic
        Possibly reduce nested loops
    """
    pass

This produces a section in TODO.md like:

# TODO
## path/to/your_file.py
* [path/to/your_file.py:2](path/to/your_file.py#L2): Implement data validation

# FIXME
## path/to/your_file.py
* [path/to/your_file.py:4](path/to/your_file.py#L4): Optimize this logic Possibly reduce nested loops

Rust Example

// TODO: Refactor main function
fn main() {
    /*
       FIXME: Add error handling
           Possibly a custom result type
    */
}

This produces a section in TODO.md like:

# TODO
## src/main.rs
* [src/main.rs:2](src/main.rs#L2): Refactor main function

# FIXME
## src/main.rs
* [src/main.rs:5](src/main.rs#L5): Add error handling Possibly a custom result type

JavaScript Example

// TODO: Refactor this into separate modules
function init() {
  /* FIXME: Handle edge cases 
     such as null responses */
  fetchData();
}

This produces a section in TODO.md like:

# TODO
## src/app.js
* [src/app.js:1](src/app.js#L1): Refactor this into separate modules

# FIXME
## src/app.js
* [src/app.js:4](src/app.js#L4): Handle edge cases such as null responses

Go Example

// TODO: Add proper logging
func main() {
    /* FIXME: Implement proper error handling
       across the entire application */
    fmt.Println("Hello, World!")
}

This produces a section in TODO.md like:

# TODO
## main.go
* [main.go:1](main.go#L1): Add proper logging

# FIXME
## main.go
* [main.go:3](main.go#L3): Implement proper error handling across the entire application

🤝 Contributing

Contributions are welcome!

  • Open an Issue for bug reports or feature requests.
  • Submit a Pull Request with enhancements, additional language support, or configuration options.

⚖️ License

This project is licensed under the MIT License. You are free to use, modify, and distribute the software as long as the original license is included.


❤️ Support

If you find Rusty TODO MD helpful, please consider giving it a ⭐ on GitHub to help others discover the project.


Happy coding, and let Rusty TODO MD handle your TODOs so you can focus on building amazing features!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rusty_todo_md-1.6.2.tar.gz (60.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rusty_todo_md-1.6.2-py3-none-win_amd64.whl (1.6 MB view details)

Uploaded Python 3Windows x86-64

rusty_todo_md-1.6.2-py3-none-win32.whl (1.4 MB view details)

Uploaded Python 3Windows x86

rusty_todo_md-1.6.2-py3-none-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

rusty_todo_md-1.6.2-py3-none-musllinux_1_2_i686.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

rusty_todo_md-1.6.2-py3-none-musllinux_1_2_armv7l.whl (1.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

rusty_todo_md-1.6.2-py3-none-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

rusty_todo_md-1.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

rusty_todo_md-1.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

rusty_todo_md-1.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

rusty_todo_md-1.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

rusty_todo_md-1.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

rusty_todo_md-1.6.2-py3-none-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

rusty_todo_md-1.6.2-py3-none-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file rusty_todo_md-1.6.2.tar.gz.

File metadata

  • Download URL: rusty_todo_md-1.6.2.tar.gz
  • Upload date:
  • Size: 60.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for rusty_todo_md-1.6.2.tar.gz
Algorithm Hash digest
SHA256 1481489ef20fd2ed4b2fb63dd6a5cd01f03b57cb576b5ab6b84696c4d057582b
MD5 4580db79ebe61e8fa8e884d2204058e2
BLAKE2b-256 cc1f361a0f70a801677207ccc97046c94f680dfa46f5e41ebf5a9ab1abdad539

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 a223221709d19f8d101beb0f713a79d79141655c0077d8bed61cea793a6a972f
MD5 49e9685008187d4db8d6e07d38308fae
BLAKE2b-256 29472df9cf510d2bf809b82eb3195fca7265f3e55311c4e4602fc6f6077fc927

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-win32.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-win32.whl
Algorithm Hash digest
SHA256 a98d9753f4b53742c087faee1bd8ec173f9a477df3c0d62d067776dfbfb13ae0
MD5 716afde4d0e1bc9b6babe52c16c917ce
BLAKE2b-256 adb50f810ea42c138c778c76669b227e8adb9f34f45725b3962315478ecb410a

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9c9cd80e50b8bece6e9cb67b5add9102fc16e0356992e575682c59aaa2cead9b
MD5 390bb8d39d28923b29bcad42ec895ec2
BLAKE2b-256 8d4b7eee2a2f8e79c69d816a977c369cd96402ce7d4a51ae9d8b5041d04fb288

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 c0ba548d8acdefb97e850ec0e22a5672ff1581e0c12e8aa39f17404ef66322fa
MD5 159dcc9eecfc85d9a88aa840451e55c9
BLAKE2b-256 add353b6ddb6d6eea4a816af856a6539df0f2df11a8b68da43218d82c0cfb0b0

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 c9525e4eaf5c517d6b2daff3e8fd6a0a3f286fc8b3719144743b58324f377a10
MD5 f4e7dfa94aef1af269402954deac05e5
BLAKE2b-256 e6cedc8425dbc5b849ba507c1cb8b0340e85474057a7d0c6e88a5aeb3a02238f

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 89175dd50089a7cf118331641121fa679b1755530d0df20ae3e255382d1a3da5
MD5 67521dd98d0143ba98f8b1f42a077e53
BLAKE2b-256 c6809aab7f14cdef4a1ad5b35327240516a3d877c026797870ddea630c8e7fdc

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2edba2a83e64ad77738a512bd810e02e021118d7f0116b2dfe7da9cc1da4d727
MD5 0a27e70419d70cb233f78baee2574ae0
BLAKE2b-256 bb882edad7222525b0eb68ed2e7bf6969383fd698d3270a8aa66efab1a5a3f4f

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 5ab495186fd8544ce62c51d1e92ca4f9070b97999dad3f6dc1c70758ad05bdf7
MD5 0a6d482f8425f8a6802c91704ead8eb1
BLAKE2b-256 2ceb57b7ceb1e0413edeb7b600cef922261f1b54ba149a166da7514179f7dc23

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4da1e151dc16255fbdbd942c7b20cfa902c6aeae2da25c3ef9b92215c66d547e
MD5 40333a6e0072831480738a280d1e8830
BLAKE2b-256 8a1913944e530e0bd4962e24850da046a2790daa7b18d0fc4f2c9ca974b8c3d1

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 4cfd14503aac11ab36de798d6104a5a98b311e2a61bd7d4ce89378914a79193e
MD5 3af79bf43a7140334efd61612508bf67
BLAKE2b-256 58d7e632be560a51f7978b61542f1a22df1e7c97c6532acba3dee1307e4d6ed9

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5d3e76cfdca13a36734b77f8a2019b5ecaece43ee992e52caf60f14a925a979a
MD5 2bad535305268ca6b5955667bd27b37c
BLAKE2b-256 6a924c81f8e9fe5cf4be1c6536f1d2efb93095f0fd228a02f979d77102ad3515

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9c34e4da7507adb1dfc7472f60116da307bd66e1d6f0dedfb3a76801f5ee12fa
MD5 e2f261a3069fa0e70aa32b95af769a2a
BLAKE2b-256 bf754352d61de234865b5694e536b2f270e89b63596ee0631b703e582736505e

See more details on using hashes here.

File details

Details for the file rusty_todo_md-1.6.2-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusty_todo_md-1.6.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d8b3768c2467b2e45c6e109fe93573df05350407e10d890c2dea2041b6cb673a
MD5 9f20d5c9c559f78e95f62e2324f3f232
BLAKE2b-256 fd18f6b406acf7eb5b69fb0123d329af87f0c2c326e86b2c9c0d353c51c29cfd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page