From 22d1c46b423c24bc7566b249b19935b55c6ffd51 Mon Sep 17 00:00:00 2001 From: EXayer Date: Fri, 1 Mar 2024 02:43:33 +0200 Subject: [PATCH 1/5] Added ability to format duplicate keys --- src/Parser.php | 10 +++-- src/UniqueKey/DefaultFormatter.php | 14 +++++++ src/UniqueKey/Formatter.php | 16 +++++++ .../UniqueKeyHandler.php} | 28 ++++++------- src/VdfConverter.php | 37 +++++++++------- src/VdfConverterConfig.php | 42 +++++++++++++++++++ tests/UniqueKeyTest.php | 4 +- 7 files changed, 115 insertions(+), 36 deletions(-) create mode 100644 src/UniqueKey/DefaultFormatter.php create mode 100644 src/UniqueKey/Formatter.php rename src/{UniqueKey.php => UniqueKey/UniqueKeyHandler.php} (67%) create mode 100644 src/VdfConverterConfig.php diff --git a/src/Parser.php b/src/Parser.php index e5089e6..0aca95c 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -3,6 +3,7 @@ namespace EXayer\VdfConverter; use EXayer\VdfConverter\Exception\CouldNotParseException; +use EXayer\VdfConverter\UniqueKey\UniqueKeyHandler; use Traversable; class Parser implements \IteratorAggregate, PositionAwareInterface, LineColumnAwareInterface @@ -13,17 +14,18 @@ class Parser implements \IteratorAggregate, PositionAwareInterface, LineColumnAw private $lexer; /** - * @var UniqueKey + * @var UniqueKeyHandler */ private $uniqueKey; /** - * @param Traversable $lexer + * @param Traversable $lexer + * @param VdfConverterConfig $config */ - public function __construct(Traversable $lexer) + public function __construct(Traversable $lexer, VdfConverterConfig $config) { $this->lexer = $lexer; - $this->uniqueKey = new UniqueKey(); + $this->uniqueKey = new UniqueKeyHandler($config->getUniqueKeyFormatter()); } /** diff --git a/src/UniqueKey/DefaultFormatter.php b/src/UniqueKey/DefaultFormatter.php new file mode 100644 index 0000000..4e23b0a --- /dev/null +++ b/src/UniqueKey/DefaultFormatter.php @@ -0,0 +1,14 @@ +formatter = $formatter; + } + /** * @param int $level Buffer nesting level. * @param string $key @@ -30,7 +38,7 @@ public function get(int $level, string $key): string return $key; } - return $this->buildName($key, ++$this->storage[$level][$key]); + return $this->formatter->buildKeyName($key, ++$this->storage[$level][$key]); } /** @@ -42,14 +50,4 @@ public function clear(int $level) $this->storage[$level] = []; } } - - /** - * @param string $key - * @param int $index - * @return string - */ - private function buildName(string $key, int $index): string - { - return $key . self::DELIMITER . $index; - } } diff --git a/src/VdfConverter.php b/src/VdfConverter.php index 48d55c6..4d320e8 100644 --- a/src/VdfConverter.php +++ b/src/VdfConverter.php @@ -19,52 +19,59 @@ class VdfConverter implements \IteratorAggregate, PositionAwareInterface private $parser; /** - * @param iterable $bytesIterator + * @param iterable $bytesIterator + * @param VdfConverterConfig|null $config */ - public function __construct($bytesIterator) + public function __construct($bytesIterator, VdfConverterConfig $config = null) { $this->bytesIterator = $bytesIterator; - $this->parser = new Parser(new Lexer($this->bytesIterator)); + + $config = $config ?: new VdfConverterConfig(); + $this->parser = new Parser(new Lexer($this->bytesIterator), $config); } /** - * @param string $string + * @param string $string + * @param VdfConverterConfig|null $config * * @return self */ - public static function fromString(string $string): self + public static function fromString(string $string, VdfConverterConfig $config = null): self { - return new static(new StringChunks($string)); + return new static(new StringChunks($string), $config); } /** - * @param string $fileName + * @param string $fileName + * @param VdfConverterConfig|null $config * * @return self */ - public static function fromFile(string $fileName): self + public static function fromFile(string $fileName, VdfConverterConfig $config = null): self { - return new static(new FileChunks($fileName)); + return new static(new FileChunks($fileName), $config); } /** - * @param resource $stream + * @param resource $stream + * @param VdfConverterConfig|null $config * * @return self */ - public static function fromStream($stream): self + public static function fromStream($stream, VdfConverterConfig $config = null): self { - return new static(new StreamChunks($stream)); + return new static(new StreamChunks($stream), $config); } /** - * @param \Traversable|array $iterable + * @param \Traversable|array $iterable + * @param VdfConverterConfig|null $config * * @return self */ - public static function fromIterable($iterable): self + public static function fromIterable($iterable, VdfConverterConfig $config = null): self { - return new static($iterable); + return new static($iterable, $config); } /** diff --git a/src/VdfConverterConfig.php b/src/VdfConverterConfig.php new file mode 100644 index 0000000..d1379fe --- /dev/null +++ b/src/VdfConverterConfig.php @@ -0,0 +1,42 @@ +uniqueKeyFormatter = $formatterClassName; + + return $this; + } + + /** + * @return Formatter + */ + public function getUniqueKeyFormatter(): Formatter + { + return new $this->uniqueKeyFormatter; + } +} diff --git a/tests/UniqueKeyTest.php b/tests/UniqueKeyTest.php index 3824bf3..890553b 100644 --- a/tests/UniqueKeyTest.php +++ b/tests/UniqueKeyTest.php @@ -2,7 +2,7 @@ namespace EXayer\VdfConverter\Tests; -use EXayer\VdfConverter\UniqueKey; +use EXayer\VdfConverter\UniqueKeyHandler; use PHPUnit\Framework\TestCase; class UniqueKeyTest extends TestCase @@ -15,7 +15,7 @@ class UniqueKeyTest extends TestCase */ public function testStorage(array $initStorage, array $levelsToClear, array $expected) { - $uniqueKey = new UniqueKey(); + $uniqueKey = new UniqueKeyHandler(); foreach ($initStorage as $pairs) { foreach ($pairs as $level => $key) { From d496ec7dbf65ad6119c8fd28429ef6e5da84ad75 Mon Sep 17 00:00:00 2001 From: EXayer Date: Fri, 1 Mar 2024 03:14:49 +0200 Subject: [PATCH 2/5] Added 'Customizing key format' section to ReadMe --- README.md | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8724407..27d31a5 100644 --- a/README.md +++ b/README.md @@ -89,8 +89,7 @@ $result = iterator_to_array($planets); Some VDFs are known to contain duplicate keys. To keep the result structure the same as the VDF and since the parser is generator based (not keeping in memory pairs) -the duplicated key will be modified - the counter will be concatenated to the end (e.g. 'key__2'). - +the duplicated key will be modified - the counter will be concatenated to the end (e.g. `key__[2]`). ```php $vdf = '{ @@ -114,9 +113,9 @@ $result = iterator_to_array(VdfConverter::fromString($vdf)); // "mercury" => [ // "distance" => "58" // "velocity" => "35" -// "distance__2" => "92" +// "distance__[2]" => "92" // ] -// "mercury__2" => [ +// "mercury__[2]" => [ // "distance" => "108" // ] // "earth" => [ @@ -124,6 +123,35 @@ $result = iterator_to_array(VdfConverter::fromString($vdf)); // ] // ] ``` + +#### Customizing key format + +If you want to customize the formatting key process, you can create your own custom formatter. A formatter is any class that implements `EXayer\VdfConverter\UniqueKey\Formatter`. + +This is what that interface looks like. + +```php +namespace EXayer\VdfConverter\UniqueKey; + +interface Formatter +{ + public function buildKeyName(string $key, int $index): string; +} +``` + +After creating your formatter, you can specify its class name in the `uniqueKeyFormatter` method of the `EXayer\VdfConverter\VdfConverterConfig` object. The config can be passed as second argument to any `from` builder method. Your formatter will then be used by default for all duplicate key handling calls. + +You can also specify a signer for a specific webhook call: + +```php +$config = (new VdfConverterConfig()) + ->uniqueKeyFormatter(YourCustomFormatter::class); + +$iterator = VdfConverter::fromString($vdf, $config); +``` + +**Warning**: Do not create formatters that create a key like `__2`, as some VDFs may have keys in this format. + ## Testing ```bash From 61f759813debe481eaf488b88c05ac9d57c28f67 Mon Sep 17 00:00:00 2001 From: EXayer Date: Fri, 1 Mar 2024 04:09:47 +0200 Subject: [PATCH 3/5] Added unique key formatter tests --- README.md | 3 +- tests/ParserTest.php | 41 ++++++++++++------------ tests/UniqueKey/DefaultFormatterTest.php | 17 ++++++++++ tests/{ => UniqueKey}/UniqueKeyTest.php | 11 ++++--- tests/VdfConverterConfigTest.php | 16 +++++++++ 5 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 tests/UniqueKey/DefaultFormatterTest.php rename tests/{ => UniqueKey}/UniqueKeyTest.php (81%) create mode 100644 tests/VdfConverterConfigTest.php diff --git a/README.md b/README.md index 27d31a5..36461f2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ # VDF Converter ![Tests](https://github.com/exayer/vdf-converter/workflows/Tests/badge.svg) -[![Total Downloads](https://img.shields.io/packagist/dt/EXayer/vdf-converter)](https://packagist.org/packages/exayer/vdf-converter) ![Latest Stable Version](https://img.shields.io/packagist/v/exayer/vdf-converter) A memory efficient parser for the Valve Data Format (*.vdf) written in PHP. @@ -144,7 +143,7 @@ After creating your formatter, you can specify its class name in the `uniqueKeyF You can also specify a signer for a specific webhook call: ```php -$config = (new VdfConverterConfig()) +$config = VdfConverterConfig::create() ->uniqueKeyFormatter(YourCustomFormatter::class); $iterator = VdfConverter::fromString($vdf, $config); diff --git a/tests/ParserTest.php b/tests/ParserTest.php index b4db7be..6d8cc52 100644 --- a/tests/ParserTest.php +++ b/tests/ParserTest.php @@ -5,6 +5,7 @@ use EXayer\VdfConverter\Exception\CouldNotParseException; use EXayer\VdfConverter\Lexer; use EXayer\VdfConverter\Parser; +use EXayer\VdfConverter\VdfConverterConfig; use PHPUnit\Framework\TestCase; class ParserTest extends TestCase @@ -16,7 +17,7 @@ class ParserTest extends TestCase */ public function testSyntax($vdf, $expectedResult) { - $parser = new Parser(new Lexer(new \ArrayIterator([$vdf]))); + $parser = new Parser(new Lexer(new \ArrayIterator([$vdf])), new VdfConverterConfig()); $result = iterator_to_array($parser); $this->assertEquals($expectedResult, $result); @@ -87,13 +88,13 @@ public function syntaxDataProvider() [ 'a' => [ 'b' => 1, - 'x' => ['x' => 1, 'x__2' => 2], + 'x' => ['x' => 1, 'x__[2]' => 2], 'e' => [ - 'f' => ['x' => 1, '' => 1, '__2' => 2, 'x__2' => 2], - 'f__2' => [], + 'f' => ['x' => 1, '' => 1, '__[2]' => 2, 'x__[2]' => 2], + 'f__[2]' => [], ], - 'x__2' => [], - 'e__2' => [], + 'x__[2]' => [], + 'e__[2]' => [], ], ], ], @@ -103,14 +104,14 @@ public function syntaxDataProvider() [ 'a' => 1, - 'b' => ['c' => 1, 'c__2' => 2], - 'a__2' => [ - 'b' => ['c' => 1, 'c__2' => 2], - 'b__2' => [], + 'b' => ['c' => 1, 'c__[2]' => 2], + 'a__[2]' => [ + 'b' => ['c' => 1, 'c__[2]' => 2], + 'b__[2]' => [], ], - 'a__3' => [], + 'a__[3]' => [], 'c' => [], - 'c__2' => [], + 'c__[2]' => [], ], ], // all duplicates @@ -118,13 +119,13 @@ public function syntaxDataProvider() '{"x" "1" "x" {"x" "1" "x" "2"} "x" {"x" {"x" "1" "x" "2"} "x" {}} "x" {} "x" {}}', [ 'x' => 1, - 'x__2' => ['x' => 1, 'x__2' => 2], - 'x__3' => [ - 'x' => ['x' => 1, 'x__2' => 2], - 'x__2' => [], + 'x__[2]' => ['x' => 1, 'x__[2]' => 2], + 'x__[3]' => [ + 'x' => ['x' => 1, 'x__[2]' => 2], + 'x__[2]' => [], ], - 'x__4' => [], - 'x__5' => [], + 'x__[4]' => [], + 'x__[5]' => [], ], ], ]; @@ -138,7 +139,7 @@ public function testSyntaxError(string $brokenVdf) { $this->expectException(CouldNotParseException::class); - iterator_to_array(new Parser(new Lexer(new \ArrayIterator([$brokenVdf])))); + iterator_to_array(new Parser(new Lexer(new \ArrayIterator([$brokenVdf])), new VdfConverterConfig())); } public function syntaxErrorDataProvider() @@ -162,7 +163,7 @@ public function testUnexpectedEndError(string $vdf) { $this->expectExceptionMessage(CouldNotParseException::unexpectedEnding()->getMessage()); - iterator_to_array(new Parser(new Lexer(new \ArrayIterator([$vdf])))); + iterator_to_array(new Parser(new Lexer(new \ArrayIterator([$vdf])), new VdfConverterConfig())); } public function unexpectedEndExceptionDataProvider() diff --git a/tests/UniqueKey/DefaultFormatterTest.php b/tests/UniqueKey/DefaultFormatterTest.php new file mode 100644 index 0000000..98285a7 --- /dev/null +++ b/tests/UniqueKey/DefaultFormatterTest.php @@ -0,0 +1,17 @@ +buildKeyName('sample_key', 9); + + $this->assertEquals($formattedKey, 'sample_key__[9]'); + } +} \ No newline at end of file diff --git a/tests/UniqueKeyTest.php b/tests/UniqueKey/UniqueKeyTest.php similarity index 81% rename from tests/UniqueKeyTest.php rename to tests/UniqueKey/UniqueKeyTest.php index 890553b..188baa7 100644 --- a/tests/UniqueKeyTest.php +++ b/tests/UniqueKey/UniqueKeyTest.php @@ -1,8 +1,9 @@ $key) { @@ -44,7 +45,7 @@ public function storageDataProvider() [ [[1 => 'key'], [1 => 'key']], [], - [1, 'key', 'key__3'] + [1, 'key', 'key__[3]'] ], [ [[1 => 'key'], [1 => 'key'], [2 => 'key'], [3 => 'key']], @@ -54,7 +55,7 @@ public function storageDataProvider() [ [[1 => 'key'], [2 => 'key'], [3 => 'key']], [2, 3], - [1, 'key', 'key__2'] + [1, 'key', 'key__[2]'] ], ]; } diff --git a/tests/VdfConverterConfigTest.php b/tests/VdfConverterConfigTest.php new file mode 100644 index 0000000..78fb014 --- /dev/null +++ b/tests/VdfConverterConfigTest.php @@ -0,0 +1,16 @@ +uniqueKeyFormatter(DefaultFormatter::class); + + $this->assertEquals(new DefaultFormatter(), $config->getUniqueKeyFormatter()); + } +} \ No newline at end of file From c21bf54a0f9c1f63de35baba190d6690c228724d Mon Sep 17 00:00:00 2001 From: EXayer Date: Fri, 1 Mar 2024 04:14:34 +0200 Subject: [PATCH 4/5] Adapted logo for dark mode --- logo.png | Bin 2561 -> 2365 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/logo.png b/logo.png index 50b776292c94659f03f3d09d56157f503578a161..666aa594a7eeb32be2aac2ed4759b533040fc4b5 100644 GIT binary patch literal 2365 zcmZ`*e>BtUAK#BYvpz;sBcCE$x_sKgntO$~?T26a)ta9b*-D`jHz}8}jjj5M6lo$R zm2_R)=obw$VfwX_bT5|a*F;QpZ&Gr1&poH}{r>TN&U2pE`~7-e@AG<}=RD6j&rx=u zw-LAmL?94G>wP>p2m}()$7NWwe#Mndp4LMe+dtS-kL&(-bgr`2&wsgZ!MF5Z=Kt~E zWcom_`6m9R|8KIkapwZPz3qNZU=X6%V?Vux--cgKUp=H#N%0f9?KM(9Rdx3WkvKfe z4asM3$gfZI`*a}(fx!B%_h1C4{PB3;;ofs>f=E+<@bzU|GfRk0c8y&hGuxFBE^&FY zr>_29IaZdF!IM~J*RQL(W|XwX?AEohrqvFL8d)hX>8mvUoitq{b5b`oNjlXm0kpN( zKsG?tiQ^ud?iUBWlhkowPVXk)pmj7+0N|{K@^i<^ z!Rvj-=JO0fRgk*Z`_^DpeFh72pnD#0LT&>+iP> z47VXbGTIhRai;QxJvxED#2BZqO{CQee^3Yr;FX)I%$Js5n#6uyLG()fDfCVB1SL!xNlte`-XByJZ8o>)vIj6Uy4tkdu7(|*Md z)(eak(aw`QS4NmW)%3sT!CB9pp>Wc@wmSwXZ$_v-;_F*XvzMN@BCBP8l=Dh)O{lu+ zinA6NrIez(Jche(t1vss;BdtTE)Ws&0CuM27ii`wi7<={YIFCcNl^*MM*CXsC1yvf z2r0dGAB)n9)RMW#(R|z)R6;>0+`jIP_Umr-^x=Up2N76%T#CT$qQ!zUtw(XD_De5| zPVy!%vY$+2Y0qOEjg?YZ*Cer^XmMX^PhXUl<323_xaPA3jId$btCnP4(iV59Wr#qY zX{F^X$tu$~o8VLS{3E&Jt|K&VY6D}~^*2q2-jblA&~D8;iRTH%227;Dz&6Fq-Fzz% zG7E#ZZL@^w0VUsMl`uF@*V$m_pI5#RqSV1! zrLGX1k68&_dr*xZd-y$67EJ2wq(SQP5Ry}oQr8HsZtxdZjRBY9{;`#u1g8fAisqUg z*+a`TKQ0e@Hv6zZ&Z@{T7a^4OQYMgDS%R|7lA$7I$qf1HNQY2W<}bKB@Qdf~BVfA! zuXsX)`p<2E%xvVv<+i9oyI-jtkG;Zx4EIAkk&R85E9_%c(ICtq?-5FePvUB%<>1*Y z;Rh2}incYpt7nU#fX5KA{P$wjU@7huc&HhMr&pjU+Pd_==7M+zN^T8%@3g`<6Zq$H z(U06L5$a4_;cl!ap5S&;V7fnBl19c_Rg8hN$=S=Xps|t{JO{|)NKoT*D2@hj=tvQ@9n@(*#kbKDAAwbuLQqEGAIg48hpT-PdZ*39gG|8*9e z>fs)1E7|_z=NTk8HI+DUB+;d<;*kN|LCK0|NKRuKVBPm5;7_k&*)jG|t;^toJOSau zDftLC`Fe9rmD$?e7z_uWP*}{8USDw^BAcz$QnGTro$0+EK>Ch)4K`lf{%i2`@es@y zonO6*ivZ$wQ0EI{xWLPWP4n>Z1!ITSJGOr_v4gk~#+;H{cg$}w6hm|d z8*;L4e9tjl(IaI$XSg3*d!&Yx?G#Xz49zsZ-b^d@w<%CY{{u-0lY0)VFyIjfktCkT z(APe(C--Bf;?zjw&5Br?4!gG&oYN2Kmm~@G=-JAjKVXDu+jNNpK zpwe|Y)QOO(uLVq{k0!Wn!xXJJIZw#%4WcUy7dzJ*WwX|tCnD3rAB_I6p(5N)v|4;O z_w(<*Ph?%Pq$sDDuxQ*eWGx*Tgjys#+KaGV9VlElzM2#z_Rk znZj4pr`6n{4ss6RgE-AG=qYYs@0mt*sVzrk+`OijJTE33Yv93^|qreAGO}nb@FPY!%p+0 za-ll$lUH)#;d6^X)7M|>?7cH7u`ydy!Pw~`+Y9~&(V)RIOHdf)G?=P*zO?z` zbs58dxNF14qp1^9fxo$TEeB-0TMb!G!*=P9IOS5@oCMq)@zDg3X=u&?FBeo*Bh)pP zuuuB=_mAT3V=KbP`9gL6i$9V0IMsGg+Er**fA?KKUje)ph6HL3ntf7nsTdFKiUXX;>FC z!``s-zq`VXCBA{y!fZMt-iI0z6w>XRCmxSKEr;{Xu)L9 z@C1JgKR4|jhkirv18;uYx{%vnd{EnVr_oNR9;_tZzN0@sO{MqoW$vjTv=1wDX3$SF Wm*t(qZ`A5PB8c^#fgZI?uJCWvO$X5c literal 2561 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 From 9f106277a14c9fe219289c744258ccb53f75e491 Mon Sep 17 00:00:00 2001 From: EXayer Date: Fri, 1 Mar 2024 04:15:34 +0200 Subject: [PATCH 5/5] Added 8.3 php version to test workflow --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index caa3163..ace95c4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: true matrix: - php: [7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2] + php: [7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3] name: PHP ${{ matrix.php }}