Skip to content

mdm-code/duct

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

logo

Wrap a code formatter inside of a `stdin-to-stdout` filter-like data flow

The duct program allows to wrap code formatters inside of a stdin to stdout filter-like data flow. It wraps a code formatter, which accepts file names as commands arguments instead of reading from standard input data stream, inside of a standard Unix stdin to stdout filter-like data flow. Consult the package documentation or see Usage to see how it works.

Installation

Install the package to use the command-line duct to wrap code formatters inside of a stdin to stdout filter-like data flow.

go install github.com/mdm-code/duct/cmd/duct@latest

Although I don't really see the reason why one might want to do it, use the following command to add the package to an existing project.

go get github.com/mdm-code/duct

Usage

Type duct -h to get information and examples on how to use duct and get some ideas on how to use it in your workflow.

This very basic example show how to wrap black, a code formatter for Python, with duct to use it as if it was a regular Unix data filter. Here is a snippet:

duct black -l 79 <<EOF
from typing import (
	Protocol
)
class Sized(Protocol):
	def __len__(self) -> int: ...
def print_size(s: Sized) -> None: len(s)
class Queue:
	def __len__(self) -> int: return 10
q = Queue(); print_size(q)
EOF

The example uses heredoc to direct code to standard input of duct that is going to be formatter with black with the max line length set to 79 characters. The output is going to be written to stdout accordingly. This lets you use black in vim as if it was a regular filter command, which makes life much easier for a regular Python dev.

In case the wrapped command writes the formatted code output to stdout or stderr, duct has two flags -stdout and -stderr that attach them to the wrapped command instead of redirecting the whole R/W flow through a temporary file.

Development

Consult Makefile to see how to format, examine code with go vet, run unit test, run code linter with golint in order to get test coverage and check if the package builds all right.

Remember to install golint before you try to run tests and test the build:

go install golang.org/x/lint/golint@latest

License

Copyright (c) 2023 Michał Adamczyk.

This project is licensed under the MIT license. See LICENSE for more details.