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.3.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.3-py3-none-win_amd64.whl (1.6 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

rusty_todo_md-1.6.3-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.3.tar.gz.

File metadata

  • Download URL: rusty_todo_md-1.6.3.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.3.tar.gz
Algorithm Hash digest
SHA256 7b895ce86bf347e00afa9457b6c94e0d69aba5aa6428ef1c8c579dfec056f351
MD5 549726f8fc13b8b8f63c5e41d361c983
BLAKE2b-256 ab2e1f9cc835ead8f8a81846d1b7599a1360dbd3014be139337b2835b76bd0bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e04401602ee68fc342cee28ca818dddc95472ae1e6bdc43cfcec72645a1b7bf8
MD5 49acf9f80d4467e51136fb9cd8d953a4
BLAKE2b-256 19b64f2ac96989231228c8b721bba9e6fac0e5c1d3eed6c5b349961191b934d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-win32.whl
Algorithm Hash digest
SHA256 7ebcc858af9e570db22ba29bcf907b498d1c382392045ba71368221380176f2e
MD5 0953c47d3574c903ce14c8c08792ea33
BLAKE2b-256 6bafa2f3052dd9ff40d8c9cd4593a8f058cd8528634615aeac5c3ba291915ba9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 adebad80bf3a8193adc12d2f885739eb9a11825547565f2aea2ec920faf413ba
MD5 3ea9b163f5cbadbb12160cc69cb1c21f
BLAKE2b-256 3f860dc439119291023c527df6f68b609c4c63426615435ea3f0ce70e45e2625

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 f767a30520c16bcbc2f451959b681819ff2623b7e5d5cdc1391e56d497a87cb3
MD5 80a00ef73ea57fc0789b40fbe59a7318
BLAKE2b-256 4c96e1345809ea0106f219f1c274941e7239fb73dbbb6a165dc053142c0a2354

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 08a2cdc89f354bcc909ad594d048c7b14344345f0d764e1ea9e03518bb6b975d
MD5 a5825969cf29c1beb0162310afc272c2
BLAKE2b-256 7f6ac5b248841354d91e984d7ae0009ee5d759510acc43c7bce43ff09da67f05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 319d6563ea85d6f7647353d5632a0dbeabfe672d2a3a20096ee8b5015681a6a6
MD5 2f9c95b483282b7e5292ef103ed480c3
BLAKE2b-256 e23d84c54ab61cebf8e1b040aca9acd8376d62faa5885b6211ac0de9bc421aa2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bdeabd432d376df7e0f6a852623b0e3a7a22102221c54e9a1ee82cd459f3579e
MD5 176335721f93978fc90bc914e9e666b2
BLAKE2b-256 f8ec718168fc44b19f27cce61be665ec255ea6a61f0c82adae4fb9225f234ba7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 1ab32fd2e6037908d4a7f89c99be5b17e19fd8ab346fb6baeb915aa0c73df3bf
MD5 345027b2d869387bbb9d3176fc4512ec
BLAKE2b-256 a28df242b0107d81fe2a79b8b0507a90e5e089c6093d3a28f5a81b7db593d6b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b4154340328573acbb51e9938c5f117eadec8ed5cb0eb92cfd5a611211b5ce52
MD5 af0b43d1ac0be8f0d728178a4ac94929
BLAKE2b-256 16c687b4e4e0bc22995b2c7b87aa13585df0d9ab3d572ade2ccf371e77c25159

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 ee929ecc9986c8779bb1ab1de65c6ddf82679f5c27852c6f3d977a99bc0406f7
MD5 56d90a55ece4eb692727f75cd27dfe8b
BLAKE2b-256 d0900eeed7bb36d49daeae8782de970892809d93dc3aae278c4c3d12cd5d50c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b760520415e120bc854fd5381abfc73b76fbe8dab196a2167d3d9a91f6c4d98d
MD5 5c492a37ead21639ba00963d7fafa39a
BLAKE2b-256 5114d7d1fbb9ebbd98e92b413943fdfd4be45f395042f677266739cef5a493ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f3c83dde83db319d75752aa385121f64532c15385082cc3724aa583d4ef5302a
MD5 f72170ab6e7a5c57eeea54eae830c0c7
BLAKE2b-256 4a75147cf5b32be7975eb16d0c8f1fe8eeb124241f1919650281ca6746c7710f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ba2f11c2c933abfc18ad04c8b669e19833fb44f899401d2c63d904d7f222ac12
MD5 c58180e4695a1064e7cdcce489ff0258
BLAKE2b-256 c289a0a8ed95214f6b7ac17ff1383fd0fe7cc8b4847a3b1d1ee8361c196f3402

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