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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

rusty_todo_md-1.7.5-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.5.tar.gz.

File metadata

  • Download URL: rusty_todo_md-1.7.5.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.5.tar.gz
Algorithm Hash digest
SHA256 df342512187267d905a36077db526e34291da0c9ea6fea8737e94540d020e0ed
MD5 13e0b7857ba6337ec85cc4788b83d9fa
BLAKE2b-256 cf42967011e0419139a0d853ab14f025afb537aca7aef2d8c1900898ab8e18d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 1329df462b014d427df287e61a87dcf513bc91593d5ab8dd9348f3083681247b
MD5 f31dd1241764783a1f2ed74823a9d4c7
BLAKE2b-256 b2daa0ee43357e6c1ee87e209b494fa9e2ef3e4902512566617b0336a2c98351

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-win32.whl
Algorithm Hash digest
SHA256 047731c479013d5cf49ff0d5103e3c5e83bb48fcf59deac0c19299b520777c74
MD5 fa4434bb7a8773d52f5655df12865fd1
BLAKE2b-256 770f8c74216eec85ebd5ff3d9e2cf25ea512b39560dfecf63333e03d17386698

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 90c2fd6887cf3b75a1ef6fac310a838732796c3f4a348d9f5d10ab8b442d7879
MD5 4ba8159da7b8262fb79f779ac618494b
BLAKE2b-256 b8e5b250485ed4e383476252cea07052372b8120c336bdeb954bb3d0433cb5fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 f9c75c9465d67ec07845065e25152240be12c9ee5783b59dd3983dae181080b8
MD5 0707f3a7efe0055d0f96eb1a4c5e3ca5
BLAKE2b-256 090133d373121a03449a6631994e06c6cadce50db7db2a12617afb600a96b888

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 750760d2165915e09007127e8ae17e71514276ec7efa071e3409e1a9cf96f21c
MD5 332d68777240c38591397fa8c35555ef
BLAKE2b-256 4ad54619a2d42a787aea431937b500b8a482410d211ae382ab275e6b72d6b243

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 91e3ac681ee4c4b768a88d9f3df894ddc174adf3ad84917922915aca0779d255
MD5 fb0676853f73f932daae9e0df8daca82
BLAKE2b-256 29805c6940ebb67c4dfb2ca15169e8d5383e88ff9ffb179c1ceef27f71599455

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f554343e582a88eec2f9b4569affc88d557c8926ea9507ca12a1f6697d25d882
MD5 d2497e59532060e527cfbdbe28b71d7f
BLAKE2b-256 a86520e697822849c5cc486b1fffaf31aae5b027e9790e7997d7c86fbbbd2abb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 2d7ce37678dec1058dd3bea9560c23f71e8d5baddb4e68f00e6baba9f881037e
MD5 a05b4e452a44d8564e30a16ee0e53634
BLAKE2b-256 0f7da5356ff0e76387f7b79a4e67ffb59561b2f94abfaa09f9537e09c91a351c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a862579719570d887847e789a2c1c66c4cf3a47a70f59f2c1b6c8e85a01554f2
MD5 1eaadf1c96b79a1a35e0e44af2b75c69
BLAKE2b-256 c7f2a975b5835bcf657d70048f63b4246032b55563ac875c621fb5e982dea652

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 facf93223b5a21e5692bb5703dc74c81ec60595cb16eabe9c3f0eda87e381a8e
MD5 ea87bc1f6c2fe81a407daacdb13a2c94
BLAKE2b-256 43f6f805d48e5faa27f7793ffb2bd2a77e3fe6bf8f18d0cb641bdabba75944af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 aa915919672fec78a8aec872e7a6514691bbc8aef9e21f731061c1a4c778fa60
MD5 294ac2e11aea7dbc610c05a157a900f0
BLAKE2b-256 4368299d909a982e245f28255ea02f15e0f8b612c6dff57d659bd33d68754848

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 298e84423fa85668c93b5c42d257611e2b531f5e894a1985f3456f8b79b59d8d
MD5 f5e1658f3874cac7bada2055075217be
BLAKE2b-256 ddf948cc370944046b1737d8d1aeecfb0f1dfed2d6102ffcab645632fb369f33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rusty_todo_md-1.7.5-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 09592f1627518fb241183f9ae35325c2b2f9b98de6e319f341a544886e132a89
MD5 eacde95801629d276357222cf6146648
BLAKE2b-256 0174d1e4cd690a4ae267b53ebcab910ec30eb9c81e0bc20b8437115a78ab12fe

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