diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 5142d4217ce..3fe78d1c853 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -42,7 +42,6 @@ If you however have written custom code that explicitly references the old names - for soon-to-be removed features. ### Removed -- Removed MetadataItemContract.php (use new abstract class BaseMetadataElement) - Removed single usage trait AsksToRebuildSite.php (inlined into HydePublishHomepageCommand.php) - Removed interface ActionContract.php @@ -68,4 +67,5 @@ The internal metadata handling has been refactored to make it more flexible and - The MetadataBag class's namespace has been changed from `Hyde\Framework\Models\Metadata\MetadataBag` to `Hyde\Framework\Modules\Metadata\MetadataBag;` - All metadata models have been moved to the new namespace `Hyde\Framework\Modules\Metadata\Models` -- All metadata models have been renamed, changing the suffix `Item` to `Model` +- All metadata models have been renamed, changing the suffix `Item` to `Element` +- Renamed MetadataItemContract.php to MetadataElementContract.php in the new namespace `Hyde\Framework\Modules\Metadata` diff --git a/packages/framework/src/Actions/StaticPageBuilder.php b/packages/framework/src/Actions/StaticPageBuilder.php index 9c4d264a5d4..0a25685ec2a 100644 --- a/packages/framework/src/Actions/StaticPageBuilder.php +++ b/packages/framework/src/Actions/StaticPageBuilder.php @@ -37,8 +37,7 @@ public function __invoke(): string { Hyde::shareViewData($this->page); - $this->needsDirectory(Hyde::sitePath()); - $this->needsDirectory(dirname(Hyde::sitePath($this->page->getOutputPath()))); + $this->needsParentDirectory(Hyde::sitePath($this->page->getOutputPath())); return $this->save($this->page->compile()); } diff --git a/packages/framework/src/Concerns/InteractsWithDirectories.php b/packages/framework/src/Concerns/InteractsWithDirectories.php index c5e1cb43208..364feb94a38 100644 --- a/packages/framework/src/Concerns/InteractsWithDirectories.php +++ b/packages/framework/src/Concerns/InteractsWithDirectories.php @@ -30,4 +30,16 @@ public static function needsDirectories(array $directories): void static::needsDirectory($directory); } } + + /** + * Ensure the supplied file's parent directory exists by creating it if it does not. + * + * @param string $file + * @param int $levels + * @return void + */ + public static function needsParentDirectory(string $file, int $levels = 1): void + { + static::needsDirectory(dirname($file, $levels)); + } } diff --git a/packages/framework/src/Modules/Metadata/MetadataBag.php b/packages/framework/src/Modules/Metadata/MetadataBag.php index 47204b0ebc2..85a1268ef13 100644 --- a/packages/framework/src/Modules/Metadata/MetadataBag.php +++ b/packages/framework/src/Modules/Metadata/MetadataBag.php @@ -5,7 +5,6 @@ use Hyde\Framework\Concerns\HydePage; use Hyde\Framework\Helpers\Meta; use Hyde\Framework\Models\Pages\MarkdownPost; -use Hyde\Framework\Modules\Metadata\Models\BaseMetadataElement; use Illuminate\Contracts\Support\Htmlable; /** @@ -50,7 +49,7 @@ public function get(): array ); } - public function add(BaseMetadataElement|string $item): static + public function add(MetadataElementContract|string $item): static { if ($item instanceof Models\LinkElement) { $this->links[$item->uniqueKey()] = $item; diff --git a/packages/framework/src/Modules/Metadata/MetadataElementContract.php b/packages/framework/src/Modules/Metadata/MetadataElementContract.php new file mode 100644 index 00000000000..220a5f40325 --- /dev/null +++ b/packages/framework/src/Modules/Metadata/MetadataElementContract.php @@ -0,0 +1,10 @@ +validateBasicHtml(file_get_contents(Hyde::path('_site/docs/foo/foo.html'))); unlink(Hyde::path('_site/docs/foo/foo.html')); } + + public function test_site_directory_can_be_customized() + { + Site::$outputPath = 'foo'; + + new StaticPageBuilder(MarkdownPage::make('foo'), true); + + $this->assertFileExists(Hyde::path('foo/foo.html')); + $this->validateBasicHtml(file_get_contents(Hyde::path('foo/foo.html'))); + + File::deleteDirectory(Hyde::path('foo')); + } + + public function test_site_directory_can_be_customized_with_nested_pages() + { + Site::$outputPath = 'foo'; + + new StaticPageBuilder(MarkdownPost::make('foo'), true); + + $this->assertFileExists(Hyde::path('foo/posts/foo.html')); + $this->validateBasicHtml(file_get_contents(Hyde::path('foo/posts/foo.html'))); + + File::deleteDirectory(Hyde::path('foo')); + } } diff --git a/packages/framework/tests/Unit/InteractsWithDirectoriesConcernTest.php b/packages/framework/tests/Unit/InteractsWithDirectoriesConcernTest.php index b1f199cff1e..cd4588317f1 100644 --- a/packages/framework/tests/Unit/InteractsWithDirectoriesConcernTest.php +++ b/packages/framework/tests/Unit/InteractsWithDirectoriesConcernTest.php @@ -72,4 +72,10 @@ public function test_needs_directories_creates_multiple_directories() File::deleteDirectory(Hyde::path('bar')); } + + public function test_needs_parent_directory_creates_directory_for_the_parent_file() + { + $this->needsParentDirectory(Hyde::path('foo/bar/baz.txt')); + $this->assertDirectoryExists(Hyde::path('foo/bar')); + } }