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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

rusty_todo_md-1.6.1-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.1.tar.gz.

File metadata

  • Download URL: rusty_todo_md-1.6.1.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.1.tar.gz
Algorithm Hash digest
SHA256 5f9a4b76b14f1371b8e8765a248778a914aae04af219ecf803b2054f1a497e31
MD5 596dc769d8254c3e9fae7743bf970f6b
BLAKE2b-256 99ff5ae59f78918f032cf2fd42118db7bf52259ad6dc3c45a49e3eeec8225c5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 2b173f7eb57f23547187c634b64242e34f0effb7484e61a276525e0c06bd6e80
MD5 db16db349c30acbfb75e29fbbf73ab0a
BLAKE2b-256 0e3fb0199012597ed3ce60420c8e00d1eace56be216689fa925031bb02400e95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-win32.whl
Algorithm Hash digest
SHA256 32515b860198a6a2a862ca34b97ed7fad3d23fdf7a47bd3b96d7952706972e46
MD5 abe758f7186f5fb5aa6261280c4494cf
BLAKE2b-256 4cc565faadbe4eca7f69bd5dae2fcd70163bac1dca7f7ca3ec95abf159a4ede8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f137a5011c486818e14c981bb6865ab531352e8ee3b821a94233360f4fe763cc
MD5 b335e4c58de150a1cbcf19a14a15ad77
BLAKE2b-256 acb46c7973cab1ca661dee517261a5566bedec4b2ed808c76a10588afd187f06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 351171f7e96a08321a381a9992d06e59e9b76dc710797abb49f9c97b301cd732
MD5 e9c99729d53489e080603ea636860a3f
BLAKE2b-256 a408794da5c60d80c984b154ee4ddf6311bd48ac713b24044eb30a0d9ae5636d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 37b3d338c34149c42f22495b9a313d249f4f1b3fba3773655dfcbbd714e7dbd8
MD5 e39874932fa9a1d250a00b13b6cbf16a
BLAKE2b-256 b5e6ab903a26696c0c7d3dab48d59edb8bbd2e455fed184e294cbe94a67df7f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8999d60bd8e2e29105d3014754dd71f1c6b70e06a72fc8c3271ef5270671f0e7
MD5 f018c1f0192ee159a09b184cc429d440
BLAKE2b-256 2ce38e3da5a6d7761d1e387936e34ffb80f610affc381ba97562b0bb251d3f8b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7bd97d248c382de4d249d5d0b0441d8e291682e30eb5462fd93ba38b29c2fecb
MD5 b9a35dfb8dbc3c7d732eec4d6def4c7f
BLAKE2b-256 13e3f6f53149d1cbd862cebadcf0bf5b286a3b4f747cf3a7c625f5ccc62c5908

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 36700f51f16a0ac343fe46c92cc6176f86ee48b021550b909726a66d72e13fe2
MD5 5c5e751bdd79ba00f54d7dedd50c1c5e
BLAKE2b-256 dc61e560851940b5bdfe4f8077e8f683b3fecdb003b0747987ac1f6df9e704b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 cbf7435b295c6e8bef653724921f9943777c08a6710230d00c80e1cfb834f5af
MD5 41769107f1a40235943f54eca4ba4c04
BLAKE2b-256 f9c771ee25fd6913244e71b61b8c196f3a037e6f6a5a3010fa3cdb2b97bbf0c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b30f593508a19d358e491a2e4843b00d88da437e3b47f58527899e8a7dc6250a
MD5 937c7c917611c23c6e7b998c2b01e65d
BLAKE2b-256 b957204d4ab6bcb19a75f6682eabe2886a2e1e1c77f8d42eddc69c01ed13bd28

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 df3e5f7ccde431153076b8a3798e65c3d51b33d4a3fda215efc544e938a26c5c
MD5 ffc6cd38ebaf02f69740057772ad3060
BLAKE2b-256 9279c41b71bc44066479a383c9bd2cfe0cee16add21a7fc4c223230769755bb6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1d1918124eff913cb3796f5aed5844e36b993e2bcbb13563fe6d4af47fdcc0cf
MD5 d9607fe402200bb886d21d92e002b210
BLAKE2b-256 472239e493958b2eb2d79005431518a6b187e6af59102b508e2400a987b265b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.6.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b4653254e871347ace68474f634443b40046b11e85696f16b2bdf75656543465
MD5 b3f1178412c79201d752c1c0f26172b2
BLAKE2b-256 342ad72115aa31b81d37bba53a3d5f7dbe7ed200e2d068166cb7685d9c9458d4

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