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.7.2.tar.gz (60.9 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.7.2-py3-none-win_amd64.whl (1.6 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

rusty_todo_md-1.7.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.7.2-py3-none-musllinux_1_2_i686.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

rusty_todo_md-1.7.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.7.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.7.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.7.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.7.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.7.2-py3-none-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

rusty_todo_md-1.7.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.7.2.tar.gz.

File metadata

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

File hashes

Hashes for rusty_todo_md-1.7.2.tar.gz
Algorithm Hash digest
SHA256 de65e67aa2b67ccc96fc43f4069b7374f38efdb304839e53cf8d35df4a0b62f2
MD5 31b9b0b16d94c6d1c3ab1a5d49546e5f
BLAKE2b-256 020fe5e5525f380de16b34dc4fef86fae2c810cf052001ffba5907f22f14a9fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 17b8677dcf1ba9693e13ed44e3d50f8a15f1d7ab742c6cb19ee827f187f0b45c
MD5 183b4bb38e125120acaffb86eef28562
BLAKE2b-256 e0f5a6ccfa505b4716f501d1171fc275c3f1707874b638d543ca4ac7cae0c049

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-win32.whl
Algorithm Hash digest
SHA256 340e7b1aa6b8343767a02ae41b894af6f9a0e044e9cc41d3f206a729a474b8b9
MD5 bb22e7c396948c52077c03072b53c88f
BLAKE2b-256 be94789dea52f79901833d7c8c20142dde197b46d12ea1699c08848479f4d9cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ca3744cb4df6b5ff3d54240b59da9a7a217e0272e799dab2484dd89c43e99e1d
MD5 5eb3293b51c1211692b2d0a882bb4027
BLAKE2b-256 66beb15d097a5c74e74be97631f89dbe0108a4c22ac63d04aacd5b4171ab4191

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 317da6a727b6fa5a43a126a8a5ae8a33820a9b322870b1d0ac422df12a8c8cfb
MD5 8d88530c400ea6e2ede80946a0091142
BLAKE2b-256 e5e753fc543659e01b2d738fc1761b010863cd4da761754dc5cf1b3baee226a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 3029bda992c4165deeadfa55b5905d69d94f587463db1382a868d3e69746999b
MD5 72bdc5612a7ee942c147b6da9d9ec127
BLAKE2b-256 0d80bdf88226fcd4054eeee7ffa3d3f4b45462430e60658e53072f8b4617f4c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 99fd652a65ce6960467b018ab6e0b7a52f2bae0936ef152e7918c5dfc6ec0f37
MD5 ed548fad45a726772a58f4f50b5f4121
BLAKE2b-256 68a71800e05f226a3ca54255d2a6f43f6afeee201e2ca15f43860cdaebc6bf6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 307a06e8017df2e37eecc4b92765de927efc271684961f093b9dc247fa86d361
MD5 511dbcaf185016c0c06946e272746192
BLAKE2b-256 39f5d3595e7ef9ce9f70939bbeead5b2fd042a5edacb4d01beeaed26ba118fb9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 4a27a3127bb25ee42b48dc242ef1b7f33b3ee244c8bab002062f74b8866dadea
MD5 b4073ebbb7cd4eed283ce737ce286bf6
BLAKE2b-256 825e08c815e57698d1900e077323e86319a26bf224c458f383164766bb8c7102

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 43e6068eb8441fd8bec902d67c33cec030c6f77fcbc77499320736fae367dd55
MD5 5723c771cc078538a000c1984e4c85a4
BLAKE2b-256 e34f583be1a2569027f0104cb61b1187193e33f3c7cc0e54315b1133624b523d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 db009b3b38b53c8dd60d2fe812f6d409ef800c10889174f0a9179b721b5f0f37
MD5 54116d68deef12427762141fe97ec05a
BLAKE2b-256 0dc5304c517f019ca23ce75a15e56cd4be52fc66e128cf750d38dd2df69e4a7d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6bdb9fd71a9f1afe6512a962c5afb6cdb38933d494e7b0c49be323e8069e22ba
MD5 a2cb217ee8ba369444a2b6af3a9e4a81
BLAKE2b-256 81f703a4b6a38f130c48db95070d827ed3100d0970e729be1817d64763650736

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8c353551a2d0b09f1e6c2d9e3ab8c0fef06f0390e3ddf49dd983dabf93d2c7a6
MD5 cb206eb565905dbc37cbdf3968fbdb97
BLAKE2b-256 1c0411452347421e8492ec561a95445734ec82b78b2e7420045140a4e9e6b1c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3691a53c3e35b5c1e292c8d330db04aa02bf583dcc0d852b9bb40e1ef31a12f7
MD5 912db474381fc8bf11357c40bad01e4a
BLAKE2b-256 bead466a415afffdb2b21642dcad63ec1edd759377e91b6a545393834c4fd1e0

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