@Override
    public Reverse.Output run(RunContext runContext) throws Exception {
        URI from = new URI(runContext.render(this.from));
        String extension = FileUtils.getExtension(from);
        String separator = runContext.render(this.separator);
        Charset charset = Charsets.toCharset(runContext.render(this.charset));

        File tempFile = runContext.workingDir().createTempFile(extension).toFile();

        File originalFile = runContext.workingDir().createTempFile(extension).toFile();
        try (OutputStream outputStream = new FileOutputStream(originalFile)) {
            IOUtils.copyLarge(runContext.storage().getFile(from), outputStream);
        }

        ReversedLinesFileReader reversedLinesFileReader = ReversedLinesFileReader.builder()
            .setPath(originalFile.toPath())
            .setCharset(charset)
            .get();

        try (
            BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(tempFile));
        ) {
            String line;
            while ((line = reversedLinesFileReader.readLine()) != null) {
                output.write((line + separator).getBytes(charset));
            }
        }

        return Reverse.Output.builder()
            .uri(runContext.storage().putFile(tempFile))
            .build();
    }
@Test
    void run() throws Exception {
        RunContext runContext = runContextFactory.of();

        URI put = storageInterface.put(
            null,
            new URI("/file/storage/get.yml"),
            new ByteArrayInputStream("1\n2\n3\n".getBytes())
        );


        Reverse result = Reverse.builder()
            .from(put.toString())
            .build();

        Reverse.Output run = result.run(runContext);

        assertThat(run.getUri().getPath(), endsWith(".yml"));
        assertThat(CharStreams.toString(new InputStreamReader(storageInterface.get(null, run.getUri()))), is("3\n2\n1\n"));
    }