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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

rusty_todo_md-1.7.4-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.4.tar.gz.

File metadata

  • Download URL: rusty_todo_md-1.7.4.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.4.tar.gz
Algorithm Hash digest
SHA256 00c6a2800efdc1472000784fc26bc26855cae933fc4c58ae0441c4f7831adeff
MD5 0b38f97d70b4195df5f34a3d96867ffe
BLAKE2b-256 5fa04cf837aaaf307052ab4ef28ade5837de5b62c52a62fc5e081033102cdd0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 11a637847a1637e155497b2cd4fa84eca2b664244e046a6cb03facd7fdf36cc8
MD5 a69a6c5a8072e551f951e39da4a98317
BLAKE2b-256 9a3f3292b0860aef953b5f0f9593cc05ce8684fd33e30df05b10a7f6feec6972

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-win32.whl
Algorithm Hash digest
SHA256 9b477ee0104cbe02f09eca0c502345ff40929b617ada871f73c94f4ab7af6495
MD5 f49b351967bfc759dc0a7abee694835c
BLAKE2b-256 891dc0069bcad7f19ec5a85f987cadf29d9f539d006f9d4d5f88d331f6333536

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e39d3c08b8f8448209894464d2f8607763feaeebe3ff49143103e2b7a36caec2
MD5 99c1ec65509c4e30eb93a375a939c459
BLAKE2b-256 2ef5b67c800fe896d09d5a68434ea7812650d98d9bfbaf5c479b063031d737a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 5062594b2c820e67f28e9d735f0794448f920bd214829dc4a930cc6486536d4a
MD5 ed23e93a0ab9d04957004c7c76d6e096
BLAKE2b-256 125f63259acf00b9d32e8d9fea318344135ff825129a39dd2d2167d3b8bd3a37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 68c8381b51ac43ce3798a1a3c21e2ffaf9123f5eb67b86bbd7ea0cf1f4f9341c
MD5 1bf71694ed1f72e3d0423027736420fd
BLAKE2b-256 6243d28f8352a4cac43877eb4c7267d5abb463009c6e144ef1153d3fd037c31b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f14f0549841819b03bae19d649bfae563f994f36b53821c15c22f48f032c7860
MD5 fc5afb5bb1de9006708d94645c6d3d65
BLAKE2b-256 c52751890dd7013343796dab4fa77a961d16c6f28bf820328c23d68f51c00ae3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 03caacfb1989b71c0494c897b76f61f2ea42dc3ed8cb3e3b7ab0c34b06626099
MD5 8c92f25b401d35a7b4d2af3fc2c14bbf
BLAKE2b-256 3c9db2d323d923b4edadd54047e65b572612a4a8efa81c3bbde5c1ad758ca1e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 3c28657ce5d9ddfbc65dbd287e282b2d30082078e48afb5c6936f9f31a0412fe
MD5 e2a748475e255bd3618724a3fbc1154d
BLAKE2b-256 03543f4ab270766c02b361a691837fc0d418956c9392bb2df1bf3e863e99f209

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4e0b3e2aa814c9c583aacb3677a13ba3a3339703a3bdb70377b01f90ea00c65b
MD5 39a2c8c9785ce6cc26371894c32cf26e
BLAKE2b-256 b1cf46381abfc70a92a210c92d7483a9687e3f5c810528291ca8c7259a974a79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 153ff0d9cf89722e43e9e3fda771a21e2eebf0691f114ec02e9d39270c313c75
MD5 ebc3716f41e9d77e1e2ee0cd1565f63b
BLAKE2b-256 d80a347cb1602890459c688e479e9a2d9b9cbec74f707e0537491f43970149ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3f0718efeccf9800bad29b9e5be15beb72db1fe24cc78dbe3edc71ccc58ac77f
MD5 acadbb4888b1cebb6ad993533d81fbb5
BLAKE2b-256 4e62a10c8923437d7f66c1ad6fbc6f37c0873ce60ed954e84b0e4fdb9f8c01c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3177489a137d2d8bbd3f3b4554241db07840ad1ebbeacd9cfdccf1a1eb46e936
MD5 ebfab68ce7bfee55424ecb84c1599206
BLAKE2b-256 c355248d065d4f222b2cb46456f29f86e14ee97cd8cb41974410ecf21b4c4a07

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.4-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3d3cd1af38ebe47c2c7c32feb39b87842f650008e748604850bdce5fb08fb7e6
MD5 1182d430be5fc30ff38beeedf6a23e8e
BLAKE2b-256 bd264c1009643e41d4a1c5fbacc0af4f8ce5e60982dbc14c629e0208aa4e0629

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