Skip to content

Commit 1e0d218

Browse files
authored
Merge pull request #827 from hydephp/decouple-publications-package
Decouple publications package
2 parents 0d63dde + c4edeaa commit 1e0d218

30 files changed

+284
-215
lines changed

packages/framework/src/Foundation/PageCollection.php

-53
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@
1313
use Hyde\Pages\HtmlPage;
1414
use Hyde\Pages\MarkdownPage;
1515
use Hyde\Pages\MarkdownPost;
16-
use Hyde\Pages\VirtualPage;
17-
use Hyde\Publications\Models\PublicationListPage;
18-
use Hyde\Publications\Models\PublicationPage;
19-
use Hyde\Publications\Models\PublicationType;
20-
use Hyde\Publications\PublicationService;
2116
use Illuminate\Support\Collection;
2217

2318
/**
@@ -89,10 +84,6 @@ protected function runDiscovery(): self
8984
$this->discoverPagesFor(DocumentationPage::class);
9085
}
9186

92-
if (Features::hasPublicationPages()) {
93-
$this->discoverPublicationPages();
94-
}
95-
9687
foreach ($this->kernel->getRegisteredPageClasses() as $pageClass) {
9788
$this->discoverPagesFor($pageClass);
9889
}
@@ -127,48 +118,4 @@ protected function parsePagesFor(string $pageClass): Collection
127118

128119
return $collection;
129120
}
130-
131-
protected function discoverPublicationPages(): void
132-
{
133-
PublicationService::getPublicationTypes()->each(function (PublicationType $type): void {
134-
$this->discoverPublicationPagesForType($type);
135-
$this->generatePublicationListingPageForType($type);
136-
});
137-
}
138-
139-
protected function discoverPublicationPagesForType(PublicationType $type): void
140-
{
141-
PublicationService::getPublicationsForPubType($type)->each(function (PublicationPage $publication): void {
142-
$this->addPage($publication);
143-
});
144-
}
145-
146-
protected function generatePublicationListingPageForType(PublicationType $type): void
147-
{
148-
$page = new PublicationListPage($type);
149-
$this->put($page->getSourcePath(), $page);
150-
151-
if ($type->usesPagination()) {
152-
$this->generatePublicationPaginatedListingPagesForType($type);
153-
}
154-
}
155-
156-
/**
157-
* @deprecated This method will be removed before merging into master.
158-
*
159-
* @internal This method will be removed before merging into master.
160-
*/
161-
protected function generatePublicationPaginatedListingPagesForType(PublicationType $type): void
162-
{
163-
$paginator = $type->getPaginator();
164-
165-
foreach (range(1, $paginator->totalPages()) as $page) {
166-
$paginator->setCurrentPage($page);
167-
$listingPage = new VirtualPage("{$type->getDirectory()}/page-$page", [
168-
'publicationType' => $type, 'paginatorPage' => $page,
169-
'title' => $type->name.' - Page '.$page,
170-
], view: $type->listTemplate);
171-
$this->put($listingPage->getSourcePath(), $listingPage);
172-
}
173-
}
174121
}

packages/framework/src/Framework/Actions/SourceFileParser.php

-22
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
use Hyde\Pages\BladePage;
99
use Hyde\Pages\Concerns\BaseMarkdownPage;
1010
use Hyde\Pages\Concerns\HydePage;
11-
use Hyde\Publications\Models\PublicationPage;
12-
use Hyde\Publications\Models\PublicationType;
13-
use Illuminate\Support\Str;
1411

1512
/**
1613
* Parses a source file and returns a new page model instance for it.
@@ -46,32 +43,13 @@ protected function constructPage(string $pageClass): HydePage|BladePage|BaseMark
4643
return $this->parseBladePage();
4744
}
4845

49-
if ($pageClass === PublicationPage::class) {
50-
return $this->parsePublicationPage();
51-
}
52-
5346
if (is_subclass_of($pageClass, BaseMarkdownPage::class)) {
5447
return $this->parseMarkdownPage($pageClass);
5548
}
5649

5750
return new $pageClass($this->identifier);
5851
}
5952

60-
protected function parsePublicationPage(): PublicationPage
61-
{
62-
/** @var \Hyde\Pages\Concerns\BaseMarkdownPage $pageClass */
63-
$document = MarkdownFileParser::parse(
64-
PublicationPage::sourcePath($this->identifier)
65-
);
66-
67-
return new PublicationPage(
68-
identifier: $this->identifier,
69-
matter: $document->matter,
70-
markdown: $document->markdown,
71-
type: PublicationType::get(Str::before($this->identifier, '/'))
72-
);
73-
}
74-
7553
protected function parseBladePage(): BladePage
7654
{
7755
return new BladePage(

packages/framework/tests/Feature/HydeExtensionFeatureTest.php

+4
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ public function testBaseClassDiscoveryHandlers()
4949

5050
public function testCanRegisterNewExtension()
5151
{
52+
HydeKernel::setInstance(new HydeKernel());
53+
54+
$this->kernel = HydeKernel::getInstance();
5255
$this->kernel->registerExtension(HydeTestExtension::class);
56+
5357
$this->assertSame([HydeTestExtension::class], $this->kernel->getRegisteredExtensions());
5458
}
5559

packages/framework/tests/Feature/PageCollectionTest.php

-43
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
namespace Hyde\Framework\Testing\Feature;
66

7-
use function copy;
87
use Hyde\Foundation\HydeKernel;
98
use Hyde\Foundation\PageCollection;
109
use Hyde\Hyde;
@@ -13,8 +12,6 @@
1312
use Hyde\Pages\HtmlPage;
1413
use Hyde\Pages\MarkdownPage;
1514
use Hyde\Pages\MarkdownPost;
16-
use Hyde\Publications\Models\PublicationListPage;
17-
use Hyde\Publications\Models\PublicationPage;
1815
use Hyde\Testing\TestCase;
1916
use Illuminate\Support\Collection;
2017
use Illuminate\Support\Facades\File;
@@ -183,44 +180,4 @@ public function test_pages_with_custom_source_directories_are_discovered_properl
183180

184181
File::deleteDirectory(Hyde::path('.source'));
185182
}
186-
187-
public function test_publication_pages_are_discovered()
188-
{
189-
mkdir(Hyde::path('publication'));
190-
$this->createPublication();
191-
192-
$collection = PageCollection::boot(Hyde::getInstance())->getPages();
193-
$this->assertCount(4, $collection); // Default pages + publication index + publication page
194-
$this->assertInstanceOf(PublicationPage::class, $collection->get('publication/foo.md'));
195-
196-
File::deleteDirectory(Hyde::path('publication'));
197-
}
198-
199-
public function test_listing_pages_for_publications_are_discovered()
200-
{
201-
mkdir(Hyde::path('publication'));
202-
$this->createPublication();
203-
204-
$this->assertInstanceOf(
205-
PublicationListPage::class,
206-
PageCollection::boot(Hyde::getInstance())->getPage('publication/index')
207-
);
208-
209-
File::deleteDirectory(Hyde::path('publication'));
210-
}
211-
212-
protected function createPublication(): void
213-
{
214-
copy(Hyde::path('tests/fixtures/test-publication-schema.json'), Hyde::path('publication/schema.json'));
215-
file_put_contents(Hyde::path('publication/foo.md'),
216-
'---
217-
__canonical: canonical
218-
__createdAt: 2022-11-16 11:32:52
219-
foo: bar
220-
---
221-
222-
Hello World!
223-
'
224-
);
225-
}
226183
}

packages/framework/tests/Feature/PaginatorTest.php

+16
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,22 @@ public function testGetPageLinksWithBaseRoute()
273273
);
274274
}
275275

276+
public function testFirstItemNumberOnPage()
277+
{
278+
$paginator = $this->makePaginator();
279+
$this->assertSame(1, $paginator->firstItemNumberOnPage());
280+
$this->assertSame(11, $paginator->setCurrentPage(2)->firstItemNumberOnPage());
281+
$this->assertSame(21, $paginator->setCurrentPage(3)->firstItemNumberOnPage());
282+
$this->assertSame(31, $paginator->setCurrentPage(4)->firstItemNumberOnPage());
283+
$this->assertSame(41, $paginator->setCurrentPage(5)->firstItemNumberOnPage());
284+
285+
$paginator = $this->makePaginator(1, 100, 25);
286+
$this->assertSame(1, $paginator->firstItemNumberOnPage());
287+
$this->assertSame(26, $paginator->setCurrentPage(2)->firstItemNumberOnPage());
288+
$this->assertSame(51, $paginator->setCurrentPage(3)->firstItemNumberOnPage());
289+
$this->assertSame(76, $paginator->setCurrentPage(4)->firstItemNumberOnPage());
290+
}
291+
276292
protected function makePaginator(int $start = 1, int $end = 50, int $pageSize = 10): Paginator
277293
{
278294
return new Paginator(range($start, $end), $pageSize);

packages/framework/tests/Feature/SourceFileParserTest.php

-21
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
namespace Hyde\Framework\Testing\Feature;
66

7-
use Hyde\Facades\Filesystem;
87
use Hyde\Framework\Actions\SourceFileParser;
9-
use Hyde\Hyde;
108
use Hyde\Pages\BladePage;
119
use Hyde\Pages\DocumentationPage;
1210
use Hyde\Pages\HtmlPage;
1311
use Hyde\Pages\MarkdownPage;
1412
use Hyde\Pages\MarkdownPost;
15-
use Hyde\Publications\Models\PublicationPage;
1613
use Hyde\Testing\TestCase;
1714

1815
/**
@@ -77,24 +74,6 @@ public function test_html_page_parser()
7774
$this->assertEquals('<h1>Foo Bar</h1>', $page->contents());
7875
}
7976

80-
public function test_publication_parser()
81-
{
82-
mkdir(Hyde::path('test-publication'));
83-
copy(Hyde::path('tests/fixtures/test-publication-schema.json'), Hyde::path('test-publication/schema.json'));
84-
copy(Hyde::path('tests/fixtures/test-publication.md'), Hyde::path('test-publication/foo.md'));
85-
86-
$parser = new SourceFileParser(PublicationPage::class, 'test-publication/foo');
87-
$page = $parser->get();
88-
$this->assertInstanceOf(PublicationPage::class, $page);
89-
$this->assertEquals('test-publication/foo', $page->identifier);
90-
$this->assertEquals('## Write something awesome.', $page->markdown);
91-
$this->assertEquals('My Title', $page->title);
92-
$this->assertEquals('My Title', $page->matter->get('title'));
93-
$this->assertTrue($page->matter->has('__createdAt'));
94-
95-
Filesystem::deleteDirectory('test-publication');
96-
}
97-
9877
public function test_parsed_page_is_run_through_dynamic_constructor()
9978
{
10079
$this->markdown('_pages/foo.md', '# Foo Bar', ['title' => 'Foo Bar Baz']);

packages/publications/src/Actions/SeedsPublicationFiles.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ protected function getDateTimeValue(): string
7777
));
7878
}
7979

80-
protected function getTextValue($lines): string
80+
protected function getTextValue(int $lines): string
8181
{
8282
$value = '';
8383

@@ -97,7 +97,7 @@ protected function generateFieldData(PublicationFieldDefinition $field): string|
9797
'float' => ((mt_rand() / mt_getrandmax()) * (200000)) + -100000,
9898
'image' => 'https://picsum.photos/id/'.rand(1, 1000).'/400/400',
9999
'integer' => rand(-100000, 100000),
100-
'string' => substr($this->fakeSentence(10), 0, rand(0, 255)),
100+
'string' => substr($this->fakeSentence(10), 0, rand(1, 255)),
101101
'tag' => $this->getTags($field->tagGroup),
102102
'text' => $this->getTextValue(rand(3, 20)),
103103
'url' => $this->fakeUrl(),
@@ -208,7 +208,7 @@ private function randomMarkdownLines(int $count): string
208208
{
209209
$lines = [];
210210
for ($i = 0; $i < $count; $i++) {
211-
$lines[] = $this->fakeSentence(rand(0, 15));
211+
$lines[] = $this->fakeSentence(rand(1, 15));
212212
}
213213

214214
return implode("\n", $lines);

packages/publications/src/ValidatesPublicationField.php packages/publications/src/Actions/ValidatesPublicationField.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
declare(strict_types=1);
44

5-
namespace Hyde\Publications;
5+
namespace Hyde\Publications\Actions;
66

77
use function array_merge;
88
use function collect;
99
use Hyde\Publications\Models\PublicationFieldDefinition;
1010
use Hyde\Publications\Models\PublicationType;
11+
use Hyde\Publications\PublicationFieldTypes;
12+
use Hyde\Publications\PublicationService;
1113
use Illuminate\Contracts\Validation\Validator;
1214
use function validator;
1315

packages/publications/src/Commands/MakePublicationCommand.php

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use Closure;
88
use Hyde\Console\Commands\Helpers\InputStreamHandler;
9-
use Hyde\Console\Concerns\ValidatingCommand;
109
use Hyde\Publications\Actions\CreatesNewPublicationPage;
1110
use Hyde\Publications\Models\PublicationFieldDefinition;
1211
use Hyde\Publications\Models\PublicationFieldValue;

packages/publications/src/Commands/MakePublicationTagCommand.php

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace Hyde\Publications\Commands;
66

77
use Hyde\Console\Commands\Helpers\InputStreamHandler;
8-
use Hyde\Console\Concerns\ValidatingCommand;
98
use Hyde\Framework\Services\DiscoveryService;
109
use Hyde\Hyde;
1110
use Hyde\Publications\Models\PublicationTags;

packages/publications/src/Commands/MakePublicationTypeCommand.php

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use function array_keys;
88
use function count;
9-
use Hyde\Console\Concerns\ValidatingCommand;
109
use Hyde\Hyde;
1110
use Hyde\Publications\Actions\CreatesNewPublicationType;
1211
use Hyde\Publications\Models\PublicationFieldDefinition;

packages/publications/src/Commands/SeedPublicationCommand.php

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
namespace Hyde\Publications\Commands;
66

7-
use Hyde\Console\Concerns\ValidatingCommand;
87
use Hyde\Publications\Actions\SeedsPublicationFiles;
98
use Hyde\Publications\Models\PublicationType;
109
use Hyde\Publications\PublicationService;

packages/publications/src/Commands/ValidatePublicationsCommand.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66

77
use function count;
88
use Exception;
9-
use Hyde\Console\Concerns\ValidatingCommand;
9+
use Hyde\Publications\Actions\ValidatesPublicationField;
1010
use Hyde\Publications\Models\PublicationFieldDefinition;
1111
use Hyde\Publications\PublicationService;
12-
use Hyde\Publications\ValidatesPublicationField;
1312
use InvalidArgumentException;
1413
use LaravelZero\Framework\Commands\Command;
1514
use function str_repeat;

packages/framework/src/Console/Concerns/ValidatingCommand.php packages/publications/src/Commands/ValidatingCommand.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace Hyde\Console\Concerns;
5+
namespace Hyde\Publications\Commands;
66

77
use function __;
88
use function array_merge;

packages/publications/src/Models/PublicationPage.php

+22
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
namespace Hyde\Publications\Models;
66

7+
use Hyde\Framework\Actions\MarkdownFileParser;
8+
use Hyde\Framework\Concerns\ValidatesExistence;
79
use Hyde\Markdown\Models\FrontMatter;
810
use Hyde\Markdown\Models\Markdown;
911
use Hyde\Pages\Concerns;
1012
use Hyde\Pages\Contracts\DynamicPage;
1113
use Hyde\Publications\Actions\PublicationPageCompiler;
14+
use Illuminate\Support\Str;
1215
use function str_starts_with;
1316

1417
/**
@@ -19,6 +22,8 @@
1922
*/
2023
class PublicationPage extends Concerns\BaseMarkdownPage implements DynamicPage
2124
{
25+
use ValidatesExistence;
26+
2227
public PublicationType $type;
2328

2429
public static string $sourceDirectory = '';
@@ -42,6 +47,23 @@ public function compile(): string
4247
return $this->renderComponent();
4348
}
4449

50+
public static function parse(string $identifier): self
51+
{
52+
static::validateExistence(static::class, $identifier);
53+
54+
/** @var \Hyde\Pages\Concerns\BaseMarkdownPage $pageClass */
55+
$document = MarkdownFileParser::parse(
56+
PublicationPage::sourcePath($identifier)
57+
);
58+
59+
return new PublicationPage(
60+
identifier: $identifier,
61+
matter: $document->matter,
62+
markdown: $document->markdown,
63+
type: PublicationType::get(Str::before($identifier, '/'))
64+
);
65+
}
66+
4567
protected function renderComponent(): string
4668
{
4769
return PublicationPageCompiler::call($this);

0 commit comments

Comments
 (0)