diff --git a/composer.json b/composer.json index 7ff83e3..e0a38fd 100644 --- a/composer.json +++ b/composer.json @@ -11,12 +11,15 @@ ], "minimum-stability": "stable", "require": { - "php": "^7.3 | ~8.0.0" + "php": "^7.4 | ~8.0.0", + "psr/container": "^1.0" }, "require-dev": { "codeception/codeception": "^4.1", "php-coveralls/php-coveralls": "^v2.2.0", - "codeception/module-asserts": "^1.2" + "codeception/module-asserts": "^1.2", + "squizlabs/php_codesniffer": "^3.6", + "doctrine/coding-standard": "^9.0" }, "autoload": { "psr-4": { @@ -27,6 +30,12 @@ "psr-4": { "Selami\\Resources\\" : "tests/resources/src/" } + }, + "scripts": { + + "cs-check": "vendor/bin/phpcs --standard=Doctrine", + "cs-fix": "vendor/bin/phpcbf --standard=Doctrine" + } } diff --git a/src/BaseUrlExtractor.php b/src/BaseUrlExtractor.php index 3cbb706..32c6a2c 100644 --- a/src/BaseUrlExtractor.php +++ b/src/BaseUrlExtractor.php @@ -1,40 +1,45 @@ isEquals === false) { return $this; } + if ($this->checkIfValuesAreAnObjectAndEqual($leftHandedValue, $rightHandedValue)) { return $this; } + if ($this->checkForSameType($leftHandedValue, $rightHandedValue)) { return $this; } + return $this; } - private function checkForSameType($leftHandedValue, $rightHandedValue) :bool + private function checkForSameType($leftHandedValue, $rightHandedValue): bool { if ($leftHandedValue !== $rightHandedValue) { $this->isEquals = false; + return false; } + return true; } - private function checkIfValuesAreAnObjectAndEqual($leftHandedValue, $rightHandedValue) : bool + private function checkIfValuesAreAnObjectAndEqual($leftHandedValue, $rightHandedValue): bool { if (! $this->checkIfValuesAreAnObject($leftHandedValue, $rightHandedValue)) { return false; } - if (get_class($leftHandedValue) !== get_class($rightHandedValue)) { + + if ($leftHandedValue::class !== $rightHandedValue::class) { $this->isEquals = false; + return false; } + if (! $this->compareObjectProperties($leftHandedValue, $rightHandedValue)) { $this->isEquals = false; + return false; } + return true; } - private function checkIfValuesAreAnObject($leftHandedValue, $rightHandedValue) : bool + + private function checkIfValuesAreAnObject($leftHandedValue, $rightHandedValue): bool { - return (is_object($leftHandedValue) && is_object($rightHandedValue)); + return is_object($leftHandedValue) && is_object($rightHandedValue); } - private function compareObjectProperties($leftHandedObject, $rightHandedObject) : bool + private function compareObjectProperties($leftHandedObject, $rightHandedObject): bool { - $reflectionOfLeftHandedObject = new ReflectionClass($leftHandedObject); - $propertiesOfLeftHandedObject = $this->getPropertiesAsAnArray($leftHandedObject, $reflectionOfLeftHandedObject); + $reflectionOfLeftHandedObject = new ReflectionClass($leftHandedObject); + $propertiesOfLeftHandedObject = $this->getPropertiesAsAnArray($leftHandedObject, $reflectionOfLeftHandedObject); $reflectionOfRightHandedObject = new ReflectionClass($rightHandedObject); $propertiesOfRightHandedObject = $this->getPropertiesAsAnArray( $rightHandedObject, $reflectionOfRightHandedObject ); + return $this->checkValuesRecursively($propertiesOfRightHandedObject, $propertiesOfLeftHandedObject); } private function checkValuesRecursively( array $propertiesOfLeftHandedObject, array $propertiesOfRightHandedObject - ) : bool { + ): bool { $innerEqualsBuilder = self::create(); foreach ($propertiesOfLeftHandedObject as $propertyName => $propertyValue) { $innerEqualsBuilder = $innerEqualsBuilder->append( @@ -87,22 +99,25 @@ private function checkValuesRecursively( $propertiesOfRightHandedObject[$propertyName] ); } + return $innerEqualsBuilder->isEquals(); } - private function getPropertiesAsAnArray($sourceObject, $object) :array + private function getPropertiesAsAnArray($sourceObject, $object): array { $propertyList = []; foreach ($object->getProperties() as $property) { if ($property->isProtected() || $property->isPrivate()) { $property->setAccessible(true); } + $propertyList[$property->name] = $property->getValue($sourceObject); } + return $propertyList; } - public function isEquals() : bool + public function isEquals(): bool { return $this->isEquals; } diff --git a/src/Exception/ClassOrMethodCouldNotBeFound.php b/src/Exception/ClassOrMethodCouldNotBeFound.php index 161c6d8..69c099b 100644 --- a/src/Exception/ClassOrMethodCouldNotBeFound.php +++ b/src/Exception/ClassOrMethodCouldNotBeFound.php @@ -1,9 +1,11 @@ container = $container; + } + + public function fromContainer(string $className): callable + { + if (! $this->container->has($className)) { + throw new StageDoesNotExistException('DIC does not have requested stage service:' . $className); + } + + return $this->container->get($className); + } + + public function pipe(callable $stage): PipelineInterface + { + $this->stages[] = $stage; + + return $this; + } + + public function process($payload) + { + foreach ($this->stages as $stage) { + $payload = $stage($payload); + } + + return $payload; + } +} diff --git a/src/Pipeline/PipelineFactory.php b/src/Pipeline/PipelineFactory.php new file mode 100644 index 0000000..cfc768d --- /dev/null +++ b/src/Pipeline/PipelineFactory.php @@ -0,0 +1,15 @@ +getParameters(); + assert(is_array($parameters)); $parameterHints = []; foreach ($parameters as $param) { - $parameter = self::getParamType($param); + $parameter = self::getParamType($param); $parameterHints[$parameter['name']] = $parameter['type']; } + return $parameterHints; } - private static function checkClassName(string $className) : void + private static function checkClassName(string $className): void { if (! class_exists($className)) { - throw new InvalidArgumentException( + throw new ClassOrMethodCouldNotBeFound( sprintf('%s class does not exist!', $className) ); } } - private static function checkMethodName(string $className, string $methodName) : void + private static function checkMethodName(string $className, string $methodName): void { if (! method_exists($className, $methodName)) { - throw new InvalidArgumentException( + throw new ClassOrMethodCouldNotBeFound( sprintf('%s does not have method named %s!', $className, $methodName) ); } } - /** - * @param ReflectionParameter $parameter - * @return array - * @throws ClassOrMethodCouldNotBeFound - */ - private static function getParamType(ReflectionParameter $parameter) :array + private static function getParamType(ReflectionParameter $parameter): array { $type = $parameter->getType(); if ($type->isBuiltin()) { return ['name' => $parameter->name, 'type' => $type->getName()]; } + try { - return ['name' => $parameter->name, 'type' => $parameter->getClass()->name]; + self::checkClassName($type->getName()); + + return ['name' => $parameter->name, 'type' => $type->getName()]; } catch (ReflectionException $e) { throw new ClassOrMethodCouldNotBeFound($e->getMessage()); } diff --git a/src/Semver.php b/src/Semver.php index 6ac5ab1..b7d588e 100644 --- a/src/Semver.php +++ b/src/Semver.php @@ -1,14 +1,16 @@ major = $major; - $this->minor = $minor; - $this->patch = $patch; + $this->major = $major; + $this->minor = $minor; + $this->patch = $patch; $this->preRelease = $preRelase; } - public static function createFromString(string $version) : self + public static function createFromString(string $version): self { $preRelease = null; - if (!preg_match(self::$semverPattern, $version, $match)) { + if (! preg_match(self::$semverPattern, $version, $match)) { throw new InvalidSemverPatternException( sprintf('%s is not valid semver compatible version name', $version) ); } - [,$major, $minor, $patch, $preRelease] = $match; + + [, $major, $minor, $patch, $preRelease] = $match; if ($preRelease === '') { $preRelease = null; } + return new self((int) $major, (int) $minor, (int) $patch, $preRelease); } - public function getCurrent() : string + public function getCurrent(): string { return $this->major . '.' . $this->minor . '.' @@ -49,16 +53,17 @@ public function getCurrent() : string . $this->preRelease; } - public function getNextPatchRelease() : string + public function getNextPatchRelease(): string { $patch = $this->patch; if ($this->preRelease === null) { $patch++; } + return $this->major . '.' . $this->minor . '.' . $patch; } - public function getNextMinorRelease() : string + public function getNextMinorRelease(): string { $minor = $this->minor; $patch = $this->patch; @@ -67,10 +72,11 @@ public function getNextMinorRelease() : string $patch = 0; } + return $this->major . '.' . $minor . '.' . $patch; } - public function getNextMajorRelease() : string + public function getNextMajorRelease(): string { $major = $this->major; $minor = $this->minor; @@ -80,6 +86,7 @@ public function getNextMajorRelease() : string $minor = 0; $patch = 0; } + return $major . '.' . $minor . '.' . $patch; } } diff --git a/tests/_support/Helper/Unit.php b/tests/_support/Helper/Unit.php index 6064d37..c762ac5 100644 --- a/tests/_support/Helper/Unit.php +++ b/tests/_support/Helper/Unit.php @@ -1,10 +1,14 @@ assertEquals($expected, $baseUrl); } - public function serverRequestDataProvider() { return [ [ json_decode('{"REQUEST_URI":"\/test\/level-1\/level-2","SCRIPT_FILENAME":"\/mnt\/public\/site1\/test\/index.php","HTTP_HOST":"127.0.0.1:8080","SCRIPT_NAME":"\/test\/index.php","PHP_SELF":"\/test\/index.php\/level-1\/level-2","ORIG_SCRIPT_NAME":""}', true), - 'http://127.0.0.1:8080/test' + 'http://127.0.0.1:8080/test', ], [ json_decode('{"REQUEST_URI":"\/tr\/basvuru\/bilgiler\/3","SCRIPT_FILENAME":"\/mnt\/public\/site1\/index.php","HTTP_HOST":"127.0.0.1:8080","SCRIPT_NAME":"\/index.php","PHP_SELF":"\/index.php\/tr\/basvuru\/bilgiler\/3","ORIG_SCRIPT_NAME":""}', true), - 'http://127.0.0.1:8080' + 'http://127.0.0.1:8080', ], [ json_decode('{"REQUEST_URI":"\/","SCRIPT_FILENAME":"\/mnt\/public\/site1\/index.php","HTTP_HOST":"127.0.0.1:8080","SCRIPT_NAME":"\/index.php","PHP_SELF":"\/index.php","ORIG_SCRIPT_NAME":""}', true), - 'http://127.0.0.1:8080' + 'http://127.0.0.1:8080', ], [ json_decode('{"REQUEST_URI":"\/tr","SCRIPT_FILENAME":"\/mnt\/public\/site1\/index.php","HTTP_HOST":"127.0.0.1:8080","SCRIPT_NAME":"\/index.php","PHP_SELF":"\/index.php\/tr","ORIG_SCRIPT_NAME":""}', true), - 'http://127.0.0.1:8080' + 'http://127.0.0.1:8080', ], [ json_decode('{"REQUEST_URI":"\/index.php","SCRIPT_FILENAME":"\/mnt\/public\/site1\/index.php","HTTP_HOST":"127.0.0.1:8080","SCRIPT_NAME":"\/index.php","PHP_SELF":"\/index.php","ORIG_SCRIPT_NAME":""}', true), - 'http://127.0.0.1:8080' + 'http://127.0.0.1:8080', ], [ json_decode('{"REQUEST_URI":"\/test\/index.php","SCRIPT_FILENAME":"\/mnt\/public\/site1\/test\/index.php","HTTP_HOST":"127.0.0.1:8080","SCRIPT_NAME":"\/test\/index.php","PHP_SELF":"\/test\/index.php","ORIG_SCRIPT_NAME":""}', true), - 'http://127.0.0.1:8080/test' + 'http://127.0.0.1:8080/test', ], ]; } diff --git a/tests/unit/CaseConverterTest.php b/tests/unit/CaseConverterTest.php index b282c25..ecd3c2c 100644 --- a/tests/unit/CaseConverterTest.php +++ b/tests/unit/CaseConverterTest.php @@ -1,93 +1,87 @@ assertEquals($expected, $result); } - public function pascalCaseDataProvider() : array + public function pascalCaseDataProvider(): array { return [ ['Kedibey ve Mirmir', 'KedibeyVeMirmir'], ['KEDIBEY VE MIRMIR', 'KedibeyVeMirmir'], ['kedibey ve mirmir', 'KedibeyVeMirmir'], - ['kedibey_ve_mirmir', 'KedibeyVeMirmir'] + ['kedibey_ve_mirmir', 'KedibeyVeMirmir'], ]; } - /** * @test * @dataProvider camelCaseDataProvider - * * @var string $source * @var string $expected */ - public function shouldConvertStringToCamelCaseSuccessfully(string $source, string $expected) : void + public function shouldConvertStringToCamelCaseSuccessfully(string $source, string $expected): void { $result = CaseConverter::toCamelCase($source); $this->assertEquals($expected, $result); } - public function camelCaseDataProvider() : array + public function camelCaseDataProvider(): array { return [ ['Kedibey ve Mirmir', 'kedibeyVeMirmir'], ['KEDIBEY VE MIRMIR', 'kedibeyVeMirmir'], ['kedibey ve mirmir', 'kedibeyVeMirmir'], - ['kedibey_ve_mirmir', 'kedibeyVeMirmir'] + ['kedibey_ve_mirmir', 'kedibeyVeMirmir'], ]; } - /** * @test * @dataProvider snakeCaseDataProvider - * * @var string $source * @var string $expected */ - public function shouldConvertStringToSnakeCaseSuccessfully(string $source, string $expected) : void + public function shouldConvertStringToSnakeCaseSuccessfully(string $source, string $expected): void { $result = CaseConverter::toSnakeCase($source); $this->assertEquals($expected, $result); } - public function snakeCaseDataProvider() : array + public function snakeCaseDataProvider(): array { return [ ['Kedibey ve Mirmir', 'kedibey_ve_mirmir'], ['kedibey ve mirmir', 'kedibey_ve_mirmir'], - ['KedibeyVeMirmir', 'kedibey_ve_mirmir'] + ['KedibeyVeMirmir', 'kedibey_ve_mirmir'], ]; } } diff --git a/tests/unit/EqualsBuilderTest.php b/tests/unit/EqualsBuilderTest.php index fa9b07e..89f53c3 100644 --- a/tests/unit/EqualsBuilderTest.php +++ b/tests/unit/EqualsBuilderTest.php @@ -1,31 +1,30 @@ append(1, 1) @@ -34,15 +33,16 @@ public function shouldReturnTrueForEqualValues() : void ->isEquals(); $this->assertTrue($result); } + /** - * @test - * @dataProvider returnFalseDataProvider * @param array $firstValues * @param array $secondValues * @param array $thirdValues * + * @test + * @dataProvider returnFalseDataProvider */ - public function shouldReturnFalseForEqualValues(array $firstValues, array $secondValues, array $thirdValues) : void + public function shouldReturnFalseForEqualValues(array $firstValues, array $secondValues, array $thirdValues): void { $result = EqualsBuilder::create() ->append($firstValues[0], $firstValues[1]) @@ -58,7 +58,7 @@ public function returnFalseDataProvider() [[1, 2], ['str', 'str'], [0.1, 0,1]], [[2, 2], ['str', 'string'], [0.1, 0,1]], [[2, 2], ['str', 'str'], [ new TestValueObject(2, 'Kedibey'), new TestValueObject(2, 'Mırmır')]], - [[2, 2], ['str', 'str'], [ new TestValueObject(2, 'Kedibey'), new \stdClass()]], + [[2, 2], ['str', 'str'], [ new TestValueObject(2, 'Kedibey'), new stdClass()]], ]; } } diff --git a/tests/unit/ResolverTest.php b/tests/unit/ResolverTest.php index 4139ba5..d30e06b 100644 --- a/tests/unit/ResolverTest.php +++ b/tests/unit/ResolverTest.php @@ -1,24 +1,25 @@ assertEquals($expected, $returned); } - public function typeHintDataProvider() : array + public function typeHintDataProvider(): array { return [ [TypeHintedClass::class, '__construct', ['test' => Test::class, 'unit' => Unit::class]], - [TypeHintedClass::class, 'method', ['config'=>'array', 'unit' => Unit::class]] + [TypeHintedClass::class, 'method', ['config' => 'array', 'unit' => Unit::class]], ]; } /** * @test */ - public function getTypeHintClassesShouldThrowExceptionForNonExistingClass() : void + public function getTypeHintClassesShouldThrowExceptionForNonExistingClass(): void { - $this->expectException(\InvalidArgumentException::class); - + $this->expectException(ClassOrMethodCouldNotBeFound::class); Selami\Stdlib\Resolver::getParameterHints('NonExistingClass', '__construct'); } /** * @test */ - public function getTypeHintClassesShouldThrowExceptionForNonExistingMethod() : void + public function getTypeHintClassesShouldThrowExceptionForNonExistingMethod(): void { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(ClassOrMethodCouldNotBeFound::class); Selami\Stdlib\Resolver::getParameterHints(TypeHintedClass::class, 'nonExistingMethod'); } + /** * @test */ - public function getTypeHintClassesShouldThrowExceptionForNonExistingClassHint() : void + public function getTypeHintClassesShouldThrowExceptionForNonExistingClassHint(): void { - $this->expectException(\InvalidArgumentException::class); - - Selami\Stdlib\Resolver::getParameterHints(TypeHintedClass::class, 'method2'); + $this->expectException(ClassOrMethodCouldNotBeFound::class); + $result = Selami\Stdlib\Resolver::getParameterHints(TypeHintedClass::class, 'method2'); } } diff --git a/tests/unit/SemverTest.php b/tests/unit/SemverTest.php index 81461b5..8afb74c 100644 --- a/tests/unit/SemverTest.php +++ b/tests/unit/SemverTest.php @@ -1,71 +1,73 @@ assertEquals($version, $semver->getCurrent()); } /** * @test */ - public function shouldReturnNextPatchVersionSuccessfully() : void + public function shouldReturnNextPatchVersionSuccessfully(): void { $version = '2.0.6'; - $semver = Semver::createFromString($version); + $semver = Semver::createFromString($version); $this->assertEquals('2.0.7', $semver->getNextPatchRelease()); } /** * @test */ - public function shouldReturnNextMinorVersionSuccessfully() : void + public function shouldReturnNextMinorVersionSuccessfully(): void { $version = '2.0.6'; - $semver = Semver::createFromString($version); + $semver = Semver::createFromString($version); $this->assertEquals('2.1.0', $semver->getNextMinorRelease()); } /** * @test */ - public function shouldReturnNextMajorVersionSuccessfully() : void + public function shouldReturnNextMajorVersionSuccessfully(): void { $version = '2.0.6'; - $semver = Semver::createFromString($version); + $semver = Semver::createFromString($version); $this->assertEquals('3.0.0', $semver->getNextMajorRelease()); } /** * @test */ - public function shouldReturnNextVersionsWithPreReleaseSuccessfully() : void + public function shouldReturnNextVersionsWithPreReleaseSuccessfully(): void { $version = '2.0.6-alpha.1'; - $semver = Semver::createFromString($version); + $semver = Semver::createFromString($version); $this->assertEquals('2.0.6-alpha.1', $semver->getCurrent()); $this->assertEquals('2.0.6', $semver->getNextMajorRelease()); $this->assertEquals('2.0.6', $semver->getNextMinorRelease()); @@ -75,11 +77,11 @@ public function shouldReturnNextVersionsWithPreReleaseSuccessfully() : void /** * @test */ - public function shouldFailForInvalidVersion() : void + public function shouldFailForInvalidVersion(): void { $this->expectException(InvalidSemverPatternException::class); $version = '2.0.a'; - $semver = Semver::createFromString($version); + $semver = Semver::createFromString($version); $this->assertEquals('3.0.6', $semver->getNextMajorRelease()); } }