From cc87eeec32e8612d679381e38ad3104895478974 Mon Sep 17 00:00:00 2001 From: Ciaran McNulty Date: Sun, 23 Jan 2022 20:45:27 +0000 Subject: [PATCH] Stream readers and writers for NdJson input --- .../php/src/Streams/NdJsonStreamReader.php | 21 +++++++ .../php/src/Streams/NdJsonStreamWriter.php | 20 +++++++ messages/php/src/Streams/StreamReader.php | 13 ++++ messages/php/src/Streams/StreamWriter.php | 13 ++++ .../php/src/Streams/WithFileHandleTrait.php | 24 ++++++++ messages/php/tests/AcceptanceTest.php | 59 +++++++++++++++++-- 6 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 messages/php/src/Streams/NdJsonStreamReader.php create mode 100644 messages/php/src/Streams/NdJsonStreamWriter.php create mode 100644 messages/php/src/Streams/StreamReader.php create mode 100644 messages/php/src/Streams/StreamWriter.php create mode 100644 messages/php/src/Streams/WithFileHandleTrait.php diff --git a/messages/php/src/Streams/NdJsonStreamReader.php b/messages/php/src/Streams/NdJsonStreamReader.php new file mode 100644 index 00000000000..ed3396da765 --- /dev/null +++ b/messages/php/src/Streams/NdJsonStreamReader.php @@ -0,0 +1,21 @@ + + */ + public function envelopes() : Generator + { + while (!feof($this->fileHandle) && ($line = fgets($this->fileHandle))) { + yield Envelope::fromJson($line); + } + } +} diff --git a/messages/php/src/Streams/NdJsonStreamWriter.php b/messages/php/src/Streams/NdJsonStreamWriter.php new file mode 100644 index 00000000000..2b447cb9ea9 --- /dev/null +++ b/messages/php/src/Streams/NdJsonStreamWriter.php @@ -0,0 +1,20 @@ + $envelopes + */ + public function writeEnvelopes(iterable $envelopes) : void + { + foreach($envelopes as $envelope) { + fputs($this->fileHandle, $envelope->asJson() . "\n"); + } + } +} diff --git a/messages/php/src/Streams/StreamReader.php b/messages/php/src/Streams/StreamReader.php new file mode 100644 index 00000000000..09744516774 --- /dev/null +++ b/messages/php/src/Streams/StreamReader.php @@ -0,0 +1,13 @@ + + */ + public function envelopes(): iterable; +} diff --git a/messages/php/src/Streams/StreamWriter.php b/messages/php/src/Streams/StreamWriter.php new file mode 100644 index 00000000000..606c74c6eda --- /dev/null +++ b/messages/php/src/Streams/StreamWriter.php @@ -0,0 +1,13 @@ + $envelopes + */ + public function writeEnvelopes(iterable $envelopes): void; +} diff --git a/messages/php/src/Streams/WithFileHandleTrait.php b/messages/php/src/Streams/WithFileHandleTrait.php new file mode 100644 index 00000000000..187821662f6 --- /dev/null +++ b/messages/php/src/Streams/WithFileHandleTrait.php @@ -0,0 +1,24 @@ +writeEnvelopes($reader->envelopes()); + + rewind($sourceHandle); + rewind($destHandle); + + while (!feof($sourceHandle)) { + $sourceLine = fgets($sourceHandle); + $destLine = fgets($destHandle); + + if (!$sourceLine && !$destLine) { + break; + } + + self::assertJsonStringEqualsJsonString($sourceLine, $destLine); + } + + // we exhausted source so dest should also be at end + self::assertTrue(feof($destHandle)); + } + /** - * @return Generator> + * @return Generator */ - public function provideJson() : Generator + public function provideJsonLines() : Generator { - $filePattern = __DIR__ . '/../../../compatibility-kit/javascript/features/**/*.ndjson'; - foreach (glob($filePattern) as $filename) { + foreach ($this->getSampleFiles() as $filename) { foreach(file($filename) ?: [] as $lineNumber => $line) { // key is provided for better error messages $key = realpath($filename) . ':' . $lineNumber; @@ -28,4 +58,23 @@ public function provideJson() : Generator } } } + + /** + * @return Generator + */ + public function provideNdJsonFilenames() : Generator + { + foreach($this->getSampleFiles() as $filename) + { + yield $filename => [$filename]; + } + } + + /** + * @return list + */ + private function getSampleFiles(): array + { + return glob(__DIR__ . '/../../../compatibility-kit/javascript/features/**/*.ndjson') ?: []; + } }