diff --git a/docs/filters.md b/docs/filters.md index ad874a62..0b1ff1c0 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -443,6 +443,32 @@ The above example will output the following Result was valid ``` +### ToKebabCase + +```php +new Membrane\Filter\String\ToKebabCase(); +``` + +Converts string into KebabCase (i.e. no whitespaces, uppercase for first letter of each word). + +```php +$string = "helloThere have_you heard-of OpenAPI?"; +$pascalCase = new Membrane\Filter\String\ToKebabCase(); + +$result = $pascalCase->filter($string); + +echo $result->value; +echo $result->isValid() ? 'is valid' : 'is invalid'; +``` + +The above example will output the following + +```text +hellothere-have-you-heard-of-openapi? +``` + +Note that _helloThere_ became _hellothere_. `ToKebabCase` does not split on capitals, otherwise _OpenAPI_ would become _open-a-p-i_ which is a less desirable result. + ### ToPascalCase ```php diff --git a/src/Filter/String/ToKebabCase.php b/src/Filter/String/ToKebabCase.php new file mode 100644 index 00000000..659bd53d --- /dev/null +++ b/src/Filter/String/ToKebabCase.php @@ -0,0 +1,40 @@ +__toString() + ); + } + + #[Test] + #[TestDox('__toPHP() returns a string of evaluable PHP')] + public function itCaststoPHP(): void + { + $sut = new ToKebabCase(); + + self::assertEquals($sut, eval('return ' . $sut->__toPHP() . ';')); + } + + #[Test] + #[TestDox('It will return an invalid Result if it filters values that are not strings')] + public function returnsInvalidResultForNonStringValues(): void + { + $value = 5; + $expected = Result::invalid($value, new MessageSet(null, new Message( + 'Expected string value, received %s', + [gettype($value)], + ))); + + self::assertEquals($expected, (new ToKebabCase())->filter($value)); + } + + #[Test] + #[TestDox('It filters strings to PascalCase')] + #[DataProvider('provideStringsToFilter')] + public function filtersStringsToKebabCase(string $value, Result $expected): void + { + self::assertEquals($expected, (new ToKebabCase())->filter($value)); + } + + public static function provideStringsToFilter(): array + { + return [ + '"Hello, World!"' => [ + '"Hello, World!"', + Result::noResult('hello-world'), + ], + 'camelCase' => [ + 'camelCase', + Result::noResult('camelcase'), + ], + 'kebab-case' => [ + 'kebab-case', + Result::noResult('kebab-case'), + ], + 'kebabber------case' => [ + 'kebabber------case', + Result::noResult('kebabber-case'), + ], + 'snake_case' => [ + 'snake_case', + Result::noResult('snake-case'), + ], + 'snakiest_____case' => [ + 'snakiest_____case', + Result::noResult('snakiest-case'), + ], + 'pets/{id}' => [ + 'pets/{id}', + Result::noResult('pets-id'), + ], + 'http://petstore.swagger.io/{version}/pets/{id}' => [ + 'http://petstore.swagger.io/{version}/pets/{id}', + Result::noResult('http-petstore-swagger-io-version-pets-id'), + ], + 'plain text' => [ + 'plain text', + Result::noResult('plain-text'), + ], + 'plain 1text' => [ + 'plain 1text', + Result::noResult('plain-1text'), + ], + 'plain 1 text' => [ + 'plain 1 text', + Result::noResult('plain-1-text'), + ], + 'sTuPiD-_-cAsE' => [ + 'sTuPiD-_-cAsE', + Result::noResult('stupid-case'), + ], + ]; + } + + +} diff --git a/tests/Filter/String/ToPascalCaseTest.php b/tests/Filter/String/ToPascalCaseTest.php index b6113164..6ee2a177 100644 --- a/tests/Filter/String/ToPascalCaseTest.php +++ b/tests/Filter/String/ToPascalCaseTest.php @@ -67,11 +67,11 @@ public static function provideStringsToFilter(): array Result::noResult('KebabCase'), ], 'snake_case to SnakeCase' => [ - 'snake-case', + 'snake_case', Result::noResult('SnakeCase'), ], 'snake_____case to SnakeCase' => [ - 'snake-case', + 'snake_____case', Result::noResult('SnakeCase'), ], 'plain text to PlainText' => [