Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More control over in/out formats #357

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open

Conversation

squaremo
Copy link
Member

@squaremo squaremo commented May 26, 2020

  • forcing the output format for jk generate

This adds a flag jk generate --format, which will force the output
to either YAML or JSON.

If printing to stdout, this means all values are printed as whichever
foramt, with streams being inlined as before.

If writing to files, the file extension when present will be
changed. Values with a stream (or multidoc) format -- YAMLStream,
JSONStream -- will still be written as streams.

  • force the output format for transform
  • give a format for input from stdin

Using an argument of - now instructs jk transform to read values from stdin (as well as any files supplied as arguments).

The new flag --stdin-format tells it what format to expect (it defaults to 'yaml').
The possible values are json meaning expect JSON values, and yaml meaning
expect a YAML stream.

some-process | jk transform --stdin-format=json  -m transform/module -

Reading from stdin implies --stdout as well, since the alternative is to make up a filename to write it to. I'm not sure of the ergonomics of that choice.

@squaremo squaremo marked this pull request as draft May 26, 2020 08:56
@squaremo squaremo force-pushed the stdin-stdout-format branch 2 times, most recently from e3529b4 to f1c6402 Compare June 4, 2020 08:56
@squaremo squaremo marked this pull request as ready for review June 4, 2020 18:03
@squaremo squaremo requested a review from dlespiau June 4, 2020 18:03
This adds a flag `jk generate --format`, which will force the output
to either YAML or JSON.

If printing to stdout, this means all values are printed as whichever
foramt, with streams being inlined as before.

If writing to files, the file extension when present will be
changed. Values with a stream (or multidoc) format -- YAMLStream,
JSONStream -- will still be written as streams.
.. and refactor. You can now

    jk transform --format=json -c 'x => update(x)' foo.yaml

and it will write a JSON file out (or print JSON if you use --stdout).
This makes the tests for `--format` more specific, by giving each
values to be output different content that can be recognised in the
expected value.
The new flag --stdin-format instructs `jk transform` to read from
stdin (as well as any files that are given as arguments). The possible
values are `json` meaning expect JSON values, and `yaml` meaning
expect a YAML stream.

An alternative would be the conventional `-` denoting stdin; however,
you would still need to provide a format. Defaulting to YAML would
read a JSON value equally well, but (crucially) not multiple JSON
values.
Instead of taking --stdin-format to imply reading from stdin, use the
convention of supplying `-` as an argument to denote reading from
stdin, and just use the flag to alter how it's read.

This will line up better with expectations; and, since --stdin-format
can have a default (of "yaml"), invocations can be concise:

    jk transform ./script.js -

.. rather than

    jk transform ./script.js --stdin-format=yaml

Note that _no_ arguments does not imply reading from stdin. I did not
want something that accidentally supplies no filenames to block, since
that would make automation using `jk transform` brittle.
@squaremo squaremo force-pushed the stdin-stdout-format branch from f1c6402 to 117f5ef Compare January 10, 2021 11:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant