From 3984a1b71fc4aeb57a101dce03b0ff0712a81207 Mon Sep 17 00:00:00 2001 From: "n.gnato" Date: Wed, 23 Apr 2025 19:21:34 +0300 Subject: [PATCH 1/3] WIP: new composition prepend / append --- README.md | 6 +++--- ...ension.php => AppendDefaultFileExtension.php} | 2 +- .../PathBuilder/AppendHostnameAsDirectory.php | 14 ++++++++++++++ .../{BasePath.php => PrependBasePath.php} | 3 +-- ...ectory.php => PrependHostnameAsDirectory.php} | 2 +- .../PathResolver/PathBuilderBasedResolver.php | 1 + .../PathBuilder/CompositeTest.php | 7 ++++--- .../PathBuilderBasedResolverTest.php | 16 +++++++++------- tests/_fixtures/example.com/bar.html | 4 ++++ 9 files changed, 38 insertions(+), 17 deletions(-) rename src/FreeElephants/StaticHttpClient/PathBuilder/{DefaultFileExtension.php => AppendDefaultFileExtension.php} (86%) create mode 100644 src/FreeElephants/StaticHttpClient/PathBuilder/AppendHostnameAsDirectory.php rename src/FreeElephants/StaticHttpClient/PathBuilder/{BasePath.php => PrependBasePath.php} (87%) rename src/FreeElephants/StaticHttpClient/PathBuilder/{HostnameAsDirectory.php => PrependHostnameAsDirectory.php} (79%) create mode 100644 tests/_fixtures/example.com/bar.html diff --git a/README.md b/README.md index 9066a93..947ddc7 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,10 @@ public function test() $responseFactory, new \FreeElephants\StaticHttpClient\PathResolver\PathBuilderBasedResolver( new \FreeElephants\StaticHttpClient\PathBuilder\Composite( - new \FreeElephants\StaticHttpClient\PathBuilder\BasePath(__DIR__), - new \FreeElephants\StaticHttpClient\PathBuilder\HostnameAsDirectory(), + new \FreeElephants\StaticHttpClient\PathBuilder\PrependBasePath(__DIR__), + new \FreeElephants\StaticHttpClient\PathBuilder\PrependHostnameAsDirectory(), new \FreeElephants\StaticHttpClient\PathBuilder\AppendRequestPath(), - new \FreeElephants\StaticHttpClient\PathBuilder\DefaultFileExtension('.json'), + new \FreeElephants\StaticHttpClient\PathBuilder\AppendDefaultFileExtension('.json'), ) ) ); diff --git a/src/FreeElephants/StaticHttpClient/PathBuilder/DefaultFileExtension.php b/src/FreeElephants/StaticHttpClient/PathBuilder/AppendDefaultFileExtension.php similarity index 86% rename from src/FreeElephants/StaticHttpClient/PathBuilder/DefaultFileExtension.php rename to src/FreeElephants/StaticHttpClient/PathBuilder/AppendDefaultFileExtension.php index 4b4c592..cb81c94 100644 --- a/src/FreeElephants/StaticHttpClient/PathBuilder/DefaultFileExtension.php +++ b/src/FreeElephants/StaticHttpClient/PathBuilder/AppendDefaultFileExtension.php @@ -4,7 +4,7 @@ use Psr\Http\Message\RequestInterface; -class DefaultFileExtension implements PathBuilderInterface +class AppendDefaultFileExtension implements PathBuilderInterface { private string $fileExtension; diff --git a/src/FreeElephants/StaticHttpClient/PathBuilder/AppendHostnameAsDirectory.php b/src/FreeElephants/StaticHttpClient/PathBuilder/AppendHostnameAsDirectory.php new file mode 100644 index 0000000..2bf5b1c --- /dev/null +++ b/src/FreeElephants/StaticHttpClient/PathBuilder/AppendHostnameAsDirectory.php @@ -0,0 +1,14 @@ +getUri()->getHost(); + } + +} diff --git a/src/FreeElephants/StaticHttpClient/PathBuilder/BasePath.php b/src/FreeElephants/StaticHttpClient/PathBuilder/PrependBasePath.php similarity index 87% rename from src/FreeElephants/StaticHttpClient/PathBuilder/BasePath.php rename to src/FreeElephants/StaticHttpClient/PathBuilder/PrependBasePath.php index 6f02637..c7f26c5 100644 --- a/src/FreeElephants/StaticHttpClient/PathBuilder/BasePath.php +++ b/src/FreeElephants/StaticHttpClient/PathBuilder/PrependBasePath.php @@ -4,13 +4,12 @@ use Psr\Http\Message\RequestInterface; -class BasePath implements PathBuilderInterface +class PrependBasePath implements PathBuilderInterface { private string $basePath; public function __construct(string $basePath) { - $this->basePath = $basePath; } diff --git a/src/FreeElephants/StaticHttpClient/PathBuilder/HostnameAsDirectory.php b/src/FreeElephants/StaticHttpClient/PathBuilder/PrependHostnameAsDirectory.php similarity index 79% rename from src/FreeElephants/StaticHttpClient/PathBuilder/HostnameAsDirectory.php rename to src/FreeElephants/StaticHttpClient/PathBuilder/PrependHostnameAsDirectory.php index fee3b87..5b3383a 100644 --- a/src/FreeElephants/StaticHttpClient/PathBuilder/HostnameAsDirectory.php +++ b/src/FreeElephants/StaticHttpClient/PathBuilder/PrependHostnameAsDirectory.php @@ -4,7 +4,7 @@ use Psr\Http\Message\RequestInterface; -class HostnameAsDirectory implements PathBuilderInterface +class PrependHostnameAsDirectory implements PathBuilderInterface { public function build(RequestInterface $request, string $path = ''): string { diff --git a/src/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolver.php b/src/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolver.php index fc92cce..b697748 100644 --- a/src/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolver.php +++ b/src/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolver.php @@ -19,6 +19,7 @@ public function resolve(RequestInterface $request): string { $filename = $this->pathBuilder->build($request); + var_dump($filename); if (file_exists($filename)) { return $filename; } diff --git a/tests/FreeElephants/StaticHttpClient/PathBuilder/CompositeTest.php b/tests/FreeElephants/StaticHttpClient/PathBuilder/CompositeTest.php index c9d027f..a48d5c8 100644 --- a/tests/FreeElephants/StaticHttpClient/PathBuilder/CompositeTest.php +++ b/tests/FreeElephants/StaticHttpClient/PathBuilder/CompositeTest.php @@ -11,13 +11,14 @@ class CompositeTest extends AbstractTestCase public function testBuild(): void { $composite = new Composite( + new PrependBasePath('/root'), + new AppendHostnameAsDirectory(), new AppendRequestPath(), - new DefaultFileExtension(), - new HostnameAsDirectory(), + new AppendDefaultFileExtension(), ); $path = $composite->build(new Request('GET', 'http://example.com/foo')); - $this->assertSame('example.com/foo.json', $path, 'Composite should build path from all builders'); + $this->assertSame('/root/example.com/foo.json', $path, 'Composite should build path from all builders'); } } diff --git a/tests/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolverTest.php b/tests/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolverTest.php index b99cd17..d0fee6a 100644 --- a/tests/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolverTest.php +++ b/tests/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolverTest.php @@ -4,10 +4,11 @@ use FreeElephants\StaticHttpClient\AbstractTestCase; use FreeElephants\StaticHttpClient\PathBuilder\AppendRequestPath; -use FreeElephants\StaticHttpClient\PathBuilder\BasePath; +use FreeElephants\StaticHttpClient\PathBuilder\PrependBasePath; use FreeElephants\StaticHttpClient\PathBuilder\Composite; -use FreeElephants\StaticHttpClient\PathBuilder\DefaultFileExtension; +use FreeElephants\StaticHttpClient\PathBuilder\AppendDefaultFileExtension; use FreeElephants\StaticHttpClient\PathBuilder\PathBuilderInterface; +use FreeElephants\StaticHttpClient\PathBuilder\PrependHostnameAsDirectory; use FreeElephants\StaticHttpClient\PathResolver\Exception\UnresolvablePathException; use Nyholm\Psr7\Request; use PHPUnit\Framework\TestCase; @@ -18,14 +19,15 @@ public function testResolve(): void { $pathBuilderBasedResolver = new PathBuilderBasedResolver( new Composite( - new BasePath(self::FIXTURE_PATH), + new PrependBasePath(self::FIXTURE_PATH), + new PrependHostnameAsDirectory(), new AppendRequestPath(), - new DefaultFileExtension() + new AppendDefaultFileExtension('.html') ) ); - $actual = $pathBuilderBasedResolver->resolve(new Request('GET', 'http://example.com/foo')); - $this->assertSame(self::FIXTURE_PATH . DIRECTORY_SEPARATOR . 'foo.json', $actual); + $actual = $pathBuilderBasedResolver->resolve(new Request('GET', 'http://example.com/bar')); + $this->assertSame(self::FIXTURE_PATH . '/example.com/bar.html', $actual); } public function testUnresolvedException(): void @@ -33,6 +35,6 @@ public function testUnresolvedException(): void $pathBuilderBasedResolver = new PathBuilderBasedResolver($this->createMock(PathBuilderInterface::class));; $this->expectException(UnresolvablePathException::class); - $pathBuilderBasedResolver->resolve(new Request('GET', 'http://example.com/foo')); + $pathBuilderBasedResolver->resolve(new Request('GET', 'http://example.com/bar')); } } diff --git a/tests/_fixtures/example.com/bar.html b/tests/_fixtures/example.com/bar.html new file mode 100644 index 0000000..11276bd --- /dev/null +++ b/tests/_fixtures/example.com/bar.html @@ -0,0 +1,4 @@ + + bar + + From 4e5eb51fa4cb6592ae29b4ba1d665ab8d71ffa1b Mon Sep 17 00:00:00 2001 From: "n.gnato" Date: Sat, 26 Apr 2025 00:05:56 +0300 Subject: [PATCH 2/3] Complete tests, handle DS --- .../StaticHttpClient/PathBuilder/PrependBasePath.php | 4 ++-- .../PathResolver/PathBuilderBasedResolver.php | 1 - .../StaticHttpClient/PathBuilder/CompositeTest.php | 4 ++-- .../PathResolver/PathBuilderBasedResolverTest.php | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/FreeElephants/StaticHttpClient/PathBuilder/PrependBasePath.php b/src/FreeElephants/StaticHttpClient/PathBuilder/PrependBasePath.php index c7f26c5..8ad6149 100644 --- a/src/FreeElephants/StaticHttpClient/PathBuilder/PrependBasePath.php +++ b/src/FreeElephants/StaticHttpClient/PathBuilder/PrependBasePath.php @@ -10,11 +10,11 @@ class PrependBasePath implements PathBuilderInterface public function __construct(string $basePath) { - $this->basePath = $basePath; + $this->basePath = rtrim($basePath, DIRECTORY_SEPARATOR); } public function build(RequestInterface $request, string $path = ''): string { - return $this->basePath . $path; + return $this->basePath . DIRECTORY_SEPARATOR . ltrim($path, DIRECTORY_SEPARATOR); } } diff --git a/src/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolver.php b/src/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolver.php index b697748..fc92cce 100644 --- a/src/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolver.php +++ b/src/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolver.php @@ -19,7 +19,6 @@ public function resolve(RequestInterface $request): string { $filename = $this->pathBuilder->build($request); - var_dump($filename); if (file_exists($filename)) { return $filename; } diff --git a/tests/FreeElephants/StaticHttpClient/PathBuilder/CompositeTest.php b/tests/FreeElephants/StaticHttpClient/PathBuilder/CompositeTest.php index a48d5c8..97b4471 100644 --- a/tests/FreeElephants/StaticHttpClient/PathBuilder/CompositeTest.php +++ b/tests/FreeElephants/StaticHttpClient/PathBuilder/CompositeTest.php @@ -11,9 +11,9 @@ class CompositeTest extends AbstractTestCase public function testBuild(): void { $composite = new Composite( - new PrependBasePath('/root'), - new AppendHostnameAsDirectory(), new AppendRequestPath(), + new PrependHostnameAsDirectory(), + new PrependBasePath('/root'), new AppendDefaultFileExtension(), ); diff --git a/tests/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolverTest.php b/tests/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolverTest.php index d0fee6a..0188d95 100644 --- a/tests/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolverTest.php +++ b/tests/FreeElephants/StaticHttpClient/PathResolver/PathBuilderBasedResolverTest.php @@ -19,9 +19,9 @@ public function testResolve(): void { $pathBuilderBasedResolver = new PathBuilderBasedResolver( new Composite( - new PrependBasePath(self::FIXTURE_PATH), - new PrependHostnameAsDirectory(), new AppendRequestPath(), + new PrependHostnameAsDirectory(), + new PrependBasePath(self::FIXTURE_PATH), new AppendDefaultFileExtension('.html') ) ); From 10c1f5b2e47ed6d4f8a50bdf2a380b5aa230fbb1 Mon Sep 17 00:00:00 2001 From: "n.gnato" Date: Sat, 26 Apr 2025 00:09:43 +0300 Subject: [PATCH 3/3] Annotate changes for 0.0.3 --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 679457d..fc0f61d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.3] - 2025-04-26 + +### Added +- Prepend / Append composition for handy path parts + ## [0.0.2] - 2025-04-22 ### Added @@ -16,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - StaticHttpClient, HostnameAwareResolver classes -[Unreleased]: https://github.com/FreeElephants/static-http-client/compare/0.0.2...HEAD +[Unreleased]: https://github.com/FreeElephants/static-http-client/compare/0.0.3...HEAD +[0.0.3]: https://github.com/FreeElephants/static-http-client/releases/tag/0.0.3 [0.0.2]: https://github.com/FreeElephants/static-http-client/releases/tag/0.0.2 [0.0.1]: https://github.com/FreeElephants/static-http-client/releases/tag/0.0.1