convert to dual outputs: pager and stdout #1388
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
regular output (mainly query results) goes to the pager. status output goes directly to stdout.
both implement a consistent interface for easy mocking in tests.
Description
Picking up where #1383 left off.
We agreed on the need to separate normal query result output from status output. The previous PR used stdout and stderr, but we decided instead to use the pager's stdin and pgcli's stdout as the two streams.
Further, because there's a need to maintain order in the output lines even across the two streams, this PR inverts control and takes a DI approach, pushing "output emitters" down into the PGCli object. The previously pure "format_output" function is now "emit_output" which takes the injected emitters. For tests, we mock out the emitters with an implementation that collects the output lines in order for later assertions.
Checklist
changelog.rst
.AUTHORS
file (or it's already there).pip install pre-commit && pre-commit install
), and ranblack
on my code.