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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

rusty_todo_md-1.7.0-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.0.tar.gz.

File metadata

  • Download URL: rusty_todo_md-1.7.0.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.0.tar.gz
Algorithm Hash digest
SHA256 64cf6ba56144faa87aa1038293306515d80987252c47705d73c456977e2291ec
MD5 c16d0b2410e5cc941754c3568913db6a
BLAKE2b-256 24f451496d16189df907e705b1932630e718701ccfd3b1770d40c297ec1eb7b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 2c636f28050e77e37bbc079d7e6f1c34c4061278721d70d8f0abedcce8ac6903
MD5 189e161008273147c61cb763d7996477
BLAKE2b-256 7338ee3a18e40f3aa38a8a6cbb49f5565bda2c2083cf2f008ef97f88c41d23fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 e12f2c78911b4bfc9ab95ab326549885790d65a8cc414d338bd4726d3f5df0ee
MD5 84b169afd066ba69fa6d929a2359911b
BLAKE2b-256 8a6883fdcc279e2432e55350f1d9c6baac6f3c32319a28cefb506067ef75f4dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bab31cf51bd1b74e76a59eab3048ac98f581bd085fc35c3b7d409c272d14f370
MD5 593c512095f126171f6730739ae32c72
BLAKE2b-256 a861cbaa4597f85c7ed38a44a2eb18954e0bebce93d7bc211486766eeac9d077

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a135e012390f86eab606e3c9154d071d2e96dd1c23a044ba8f9496ca29562d10
MD5 67a182ca275441b304fd5733f77c4799
BLAKE2b-256 936e430ad8eedfa3dc5b4d4a8783c5978c57807d14dceef8166e97c6a6aeb412

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 c1dcad314831ff2b2c98e0569559b3d668d65a3b07468f04b65070291d063330
MD5 204c7df30322b6e0893532cde78c8efc
BLAKE2b-256 a958f7bff460fdfd1b1950a45e18e194c6e2e2401f8fa43fb757da0787379953

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 31cfd679c7fac86b986e5123ca1b053df50267ccb86a036d327d89ad760f965a
MD5 8f02b531900cbf754f086fa021ef323d
BLAKE2b-256 790485fb7835992845dcb48d5062d474c192343b4e0aeba54e3bee74ba73b5d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8df6345f153101ac30afb9c81c377aefa6da620dccb1b0dc813698384b89b7a9
MD5 0bd785d4a12d3cf60f7847e6b3ebbb70
BLAKE2b-256 ea8a5a135d7c326e9337435534e7db835e978d128c77e35356143a92817168be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 f174ac70d7b9ada59de9e2de25223ecc506374d8d00b6df55a21b6a3a7e66c88
MD5 afaab39a7dc42985c95c590dab2e5ada
BLAKE2b-256 15ee832ff4d5d325e08c9381ef4749c33566d61cf74c29ae25aeafd036f4f798

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 0a3f7e99e2b2cd008ffcc4bd3b7eb1e012c99d6ecae92ec48a6f872bd4708cbd
MD5 74c9c6fbc872e33ef9c1e9da051fbd87
BLAKE2b-256 62d044989bb3c589f6048ac6005b73580c609f0cbaafbea383b5cd92a4ecc869

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 3cadddd9a11dd10af7e2a35934b6ae0654c6ba12fadddc18eec48213cda2ee38
MD5 f454f19fe83dc66a0fd76a2921f79866
BLAKE2b-256 ae55e097a729868f2f52b3384b68d56573c8af7ca1b600693120f49ac3e85a74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 de0a05be0ec82ef9109f68d15c45b452f235745ecfe603e179e0a677865cf4a6
MD5 9378de4542345b6cdd44091c872c354a
BLAKE2b-256 28bef05ee5433a049629e8cd3ff05fd81c465526f3c9a2b082885accf3715367

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a53e59c1af780efddbef1b65865f0b845bf71debd64f8f95f2fc9dff83addbec
MD5 7ce71793193ef0eb0373a67eab952a81
BLAKE2b-256 f4f4c80fd19597f893065fce7b246bffcd31db44ef523d3b2861e0eead6d27ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9f54a9fe3b870aa6cd94fa48dd6687f0e9e4eb81c4aac2d86bfb2a8bc46a074e
MD5 2b36d4c6f5281cb7ee1364458e9e8f9f
BLAKE2b-256 5c07738361854cf9397ec8da1df8523479b0ac07425a38f8caf139022118ce51

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