diff --git a/.github/workflows/duster-lint.yml b/.github/workflows/duster-lint.yml new file mode 100644 index 00000000..305e4928 --- /dev/null +++ b/.github/workflows/duster-lint.yml @@ -0,0 +1,17 @@ +name: Duster Lint + +on: + push: + branches: [ main ] + pull_request: + +jobs: + duster: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: "Duster Lint" + uses: tighten/duster-action@v2 + with: + args: lint diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml deleted file mode 100644 index 85e56884..00000000 --- a/.github/workflows/format.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Format -on: - pull_request: - paths: ['**.php'] -jobs: - php-cs-fixer: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: ${{ github.event.pull_request.head.ref }} - - uses: shivammathur/setup-php@v2 - with: - php-version: 8.1 - - uses: ramsey/composer-install@v2 - - name: Run PHP-CS-Fixer - id: format - # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings - run: | - delimiter=$RANDOM - echo "summary<<${delimiter}" >> $GITHUB_OUTPUT - composer format >> $GITHUB_OUTPUT - echo $delimiter >> $GITHUB_OUTPUT - - name: Check for fixed files - run: echo "changed=$(git diff --quiet && echo false || echo true)" >> $GITHUB_ENV - - name: Commit changes - if: ${{ env.changed == 'true' }} - run: | - git config --global user.name github-actions - git config --global user.email github-actions[bot]@users.noreply.github.com - # awk trims leading and trailing whitespace from each line, sed removes the last two lines - git commit -a -m "Format" -m "$(echo '${{ steps.format.outputs.summary }})' | awk '{$1=$1};1' | sed '$d' | sed '$d')" - git push diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php deleted file mode 100644 index 00a6f028..00000000 --- a/.php-cs-fixer.php +++ /dev/null @@ -1,50 +0,0 @@ -setFinder(PhpCsFixer\Finder::create()->in(__DIR__)->exclude('tests/snapshots')) - ->setRiskyAllowed(true) - ->setRules([ - '@PSR2' => true, - '@Symfony' => true, - 'align_multiline_comment' => [ - 'comment_type' => 'all_multiline', - ], - 'binary_operator_spaces' => [ - 'operators' => [ - '|' => 'single_space', // Doesn't apply to union types - ], - ], - 'blank_line_after_namespace' => true, - 'blank_line_after_opening_tag' => true, - 'blank_line_before_statement' => [ - 'statements' => ['return', 'throw'], - ], - 'concat_space' => [ - 'spacing' => 'one', - ], - 'get_class_to_class_keyword' => true, - 'global_namespace_import' => [ - 'import_classes' => true, - ], - 'new_with_braces' => false, - 'no_empty_comment' => false, - 'no_useless_else' => true, - 'not_operator_with_successor_space' => true, - 'php_unit_method_casing' => false, - 'phpdoc_annotation_without_dot' => false, - 'phpdoc_to_comment' => [ - 'ignored_tags' => ['var'], - ], - 'phpdoc_separation' => [ - 'groups' => [ - ['test', 'group', 'dataProvider', 'doesNotPerformAssertions'], - ], - ], - 'phpdoc_var_annotation_correct_order' => true, - 'single_line_empty_body' => true, - 'trailing_comma_in_multiline' => [ - 'after_heredoc' => true, - 'elements' => ['arrays', 'arguments', 'parameters'], - ], - 'yoda_style' => false, - ]); diff --git a/composer.json b/composer.json index db94fc35..0451f07d 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,13 @@ { "name": "tightenco/jigsaw", "description": "Simple static sites with Laravel's Blade.", - "keywords": ["blade", "laravel", "static", "site", "generator"], + "keywords": [ + "blade", + "laravel", + "static", + "site", + "generator" + ], "license": "MIT", "authors": [ { @@ -39,9 +45,9 @@ "vlucas/phpdotenv": "^5.3.1" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.17", "mockery/mockery": "^1.4", - "phpunit/phpunit": "^9.3.3" + "phpunit/phpunit": "^9.3.3", + "tightenco/duster": "^2.5" }, "autoload": { "psr-4": { @@ -60,7 +66,7 @@ "jigsaw" ], "scripts": { - "format" : "php-cs-fixer fix --verbose" + "format": "./vendor/bin/duster fix" }, "config": { "sort-packages": true, diff --git a/duster.json b/duster.json new file mode 100644 index 00000000..9fe054eb --- /dev/null +++ b/duster.json @@ -0,0 +1,3 @@ +{ + "exclude": ["tests/snapshots", "src/**/helpers.php"] +} diff --git a/src/Bootstrap/HandleExceptions.php b/src/Bootstrap/HandleExceptions.php index c266710a..77c179d8 100644 --- a/src/Bootstrap/HandleExceptions.php +++ b/src/Bootstrap/HandleExceptions.php @@ -43,11 +43,11 @@ public function bootstrap(Container $app): void /** * Report PHP deprecations, or convert PHP errors to ErrorException instances. * - * @param int $level - * @param string $message - * @param string $file - * @param int $line - * @param array $context + * @param int $level + * @param string $message + * @param string $file + * @param int $line + * @param array $context * * @throws ErrorException */ diff --git a/src/Collection/Collection.php b/src/Collection/Collection.php index 1668ef8a..3f844aad 100644 --- a/src/Collection/Collection.php +++ b/src/Collection/Collection.php @@ -14,7 +14,7 @@ class Collection extends BaseCollection public static function withSettings(IterableObject $settings, $name) { - $collection = new static(); + $collection = new static; $collection->settings = $settings; $collection->name = $name; diff --git a/src/Collection/CollectionItem.php b/src/Collection/CollectionItem.php index 15924e7a..a84efdba 100644 --- a/src/Collection/CollectionItem.php +++ b/src/Collection/CollectionItem.php @@ -58,13 +58,13 @@ public function getContent() $this->_content; } - public function __toString() + protected function missingHelperError($functionName) { - return (string) $this->getContent(); + return 'No function named "' . $functionName . '" for the collection "' . $this->_meta->collectionName . '" was found in the file "config.php".'; } - protected function missingHelperError($functionName) + public function __toString() { - return 'No function named "' . $functionName . '" for the collection "' . $this->_meta->collectionName . '" was found in the file "config.php".'; + return (string) $this->getContent(); } } diff --git a/src/CollectionItemHandlers/BladeCollectionItemHandler.php b/src/CollectionItemHandlers/BladeCollectionItemHandler.php index 27a51604..7d271247 100644 --- a/src/CollectionItemHandlers/BladeCollectionItemHandler.php +++ b/src/CollectionItemHandlers/BladeCollectionItemHandler.php @@ -34,6 +34,6 @@ public function getItemVariables($file) public function getItemContent($file) { - return; + } } diff --git a/src/Console/BuildCommand.php b/src/Console/BuildCommand.php index b55bcd32..8f19018e 100644 --- a/src/Console/BuildCommand.php +++ b/src/Console/BuildCommand.php @@ -44,7 +44,7 @@ protected function fire() $cacheExists = $this->app[TemporaryFilesystem::class]->hasTempDirectory(); if ($this->input->getOption('pretty') === 'true' && $this->app->config->get('pretty') !== false) { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); } if ($this->input->getOption('quiet')) { diff --git a/src/Console/ConsoleOutput.php b/src/Console/ConsoleOutput.php index 66053b37..7a14d31b 100644 --- a/src/Console/ConsoleOutput.php +++ b/src/Console/ConsoleOutput.php @@ -16,37 +16,6 @@ public function setup($verbosity) $this->setupProgressBars(); } - protected function setupSections() - { - $this->sections = collect([ - 'footer' => $this->section(), - 'intro' => $this->section(), - 'message' => $this->section(), - 'progress' => $this->section(), - 'header' => $this->section(), - ])->map(function ($section) { - return $this->section(); - }); - - $this->sections['header']->writeln(''); - $this->sections['footer']->writeln(''); - } - - protected function setupProgressBars() - { - $this->progressBars = [ - 'collections' => $this->getProgressBar('Loading collections...'), - 'build' => $this->getProgressBar('Building files from source...'), - ]; - } - - protected function getProgressBar($message = null) - { - return $this->isVerbose() ? - new ProgressBar($this, $message, $this->sections['progress']) : - new NullProgressBar($this, $message, $this->sections['progress']); - } - public function progressBar($name) { return $this->progressBars[$name]; @@ -123,4 +92,35 @@ public function writeConclusion() return $this; } + + protected function setupSections() + { + $this->sections = collect([ + 'footer' => $this->section(), + 'intro' => $this->section(), + 'message' => $this->section(), + 'progress' => $this->section(), + 'header' => $this->section(), + ])->map(function ($section) { + return $this->section(); + }); + + $this->sections['header']->writeln(''); + $this->sections['footer']->writeln(''); + } + + protected function setupProgressBars() + { + $this->progressBars = [ + 'collections' => $this->getProgressBar('Loading collections...'), + 'build' => $this->getProgressBar('Building files from source...'), + ]; + } + + protected function getProgressBar($message = null) + { + return $this->isVerbose() ? + new ProgressBar($this, $message, $this->sections['progress']) : + new NullProgressBar($this, $message, $this->sections['progress']); + } } diff --git a/src/Container.php b/src/Container.php index 77b46d87..f157edd6 100644 --- a/src/Container.php +++ b/src/Container.php @@ -139,7 +139,7 @@ private function boot(): void $this->fireAppCallbacks($this->bootedCallbacks); } - /** @param callable[] $callbacks */ + /** @param callable[] $callbacks */ private function fireAppCallbacks(array &$callbacks): void { $index = 0; @@ -147,7 +147,7 @@ private function fireAppCallbacks(array &$callbacks): void while ($index < count($callbacks)) { $callbacks[$index]($this); - ++$index; + $index++; } } diff --git a/src/Events/EventBus.php b/src/Events/EventBus.php index dac7f627..34a633db 100644 --- a/src/Events/EventBus.php +++ b/src/Events/EventBus.php @@ -28,21 +28,21 @@ public function __construct() $this->afterBuild = collect(); } - public function __call($event, $arguments) - { - if (isset($this->{$event})) { - $this->{$event} = $this->{$event}->merge(Arr::wrap($arguments[0])); - } - } - public function fire($event, Jigsaw $jigsaw) { $this->{$event}->each(function ($task) use ($jigsaw) { if (is_callable($task)) { $task($jigsaw); } else { - (new $task())->handle($jigsaw); + (new $task)->handle($jigsaw); } }); } + + public function __call($event, $arguments) + { + if (isset($this->{$event})) { + $this->{$event} = $this->{$event}->merge(Arr::wrap($arguments[0])); + } + } } diff --git a/src/Exceptions/Handler.php b/src/Exceptions/Handler.php index 94ebb5a0..957748a5 100644 --- a/src/Exceptions/Handler.php +++ b/src/Exceptions/Handler.php @@ -40,7 +40,7 @@ public function render($request, Throwable $e): void } /** - * @param \Symfony\Component\Console\Output\OutputInterface $output + * @param \Symfony\Component\Console\Output\OutputInterface $output */ public function renderForConsole($output, Throwable $e): void { @@ -88,7 +88,7 @@ public function renderForConsole($output, Throwable $e): void $handler->handle(); } - public function map(Closure|string $from, Closure|string|null $to = null): static + public function map(Closure|string $from, Closure|string $to = null): static { if (is_string($to)) { $to = fn ($exception) => new $to('', 0, $exception); diff --git a/src/File/TemporaryFilesystem.php b/src/File/TemporaryFilesystem.php index 293129e5..9a1f33e6 100644 --- a/src/File/TemporaryFilesystem.php +++ b/src/File/TemporaryFilesystem.php @@ -13,7 +13,7 @@ class TemporaryFilesystem public function __construct($tempPath, $filesystem = null) { $this->tempPath = $tempPath; - $this->filesystem = $filesystem ?: new Filesystem(); + $this->filesystem = $filesystem ?: new Filesystem; } public function buildTempPath($filename, $extension) diff --git a/src/Handlers/CollectionItemHandler.php b/src/Handlers/CollectionItemHandler.php index 5dc38b93..78625ce8 100644 --- a/src/Handlers/CollectionItemHandler.php +++ b/src/Handlers/CollectionItemHandler.php @@ -24,23 +24,6 @@ public function shouldHandle($file) && ! Str::startsWith($file->getFilename(), ['.', '_']); } - private function isInCollectionDirectory($file) - { - $base = $file->topLevelDirectory(); - - return Str::startsWith($base, '_') && $this->hasCollectionNamed($this->getCollectionName($file)); - } - - private function hasCollectionNamed($candidate) - { - return Arr::get($this->config, 'collections.' . $candidate) !== null; - } - - private function getCollectionName($file) - { - return substr($file->topLevelDirectory(), 1); - } - public function handle($file, $pageData) { $handler = $this->handlers->first(function ($handler) use ($file) { @@ -70,4 +53,21 @@ public function handle($file, $pageData) ) : null; })->filter()->values(); } + + private function isInCollectionDirectory($file) + { + $base = $file->topLevelDirectory(); + + return Str::startsWith($base, '_') && $this->hasCollectionNamed($this->getCollectionName($file)); + } + + private function hasCollectionNamed($candidate) + { + return Arr::get($this->config, 'collections.' . $candidate) !== null; + } + + private function getCollectionName($file) + { + return substr($file->topLevelDirectory(), 1); + } } diff --git a/src/IterableObject.php b/src/IterableObject.php index 36f5d546..fb9ca28e 100644 --- a/src/IterableObject.php +++ b/src/IterableObject.php @@ -10,15 +10,6 @@ class IterableObject extends BaseCollection implements ArrayAccess { - public function __get($key) - { - if (! array_key_exists($key, $this->items) && in_array($key, static::$proxies)) { - return new HigherOrderCollectionProxy($this, $key); - } - - return $this->get($key); - } - public function except($keys) { return is_null($keys) ? $this : parent::except($keys); @@ -65,7 +56,7 @@ public function offsetGet($key): mixed if (! isset($this->items[$key])) { $prefix = $this->_source ? 'Error in ' . $this->_source . ': ' : 'Error: '; - throw new Exception($prefix . "The key '$key' does not exist."); + throw new Exception($prefix . "The key '{$key}' does not exist."); } return $this->getElement($key); @@ -91,4 +82,13 @@ protected function isArrayable($element) { return is_array($element) || $element instanceof BaseCollection; } + + public function __get($key) + { + if (! array_key_exists($key, $this->items) && in_array($key, static::$proxies)) { + return new HigherOrderCollectionProxy($this, $key); + } + + return $this->get($key); + } } diff --git a/src/Jigsaw.php b/src/Jigsaw.php index 9b38c7c8..bdfb1c89 100644 --- a/src/Jigsaw.php +++ b/src/Jigsaw.php @@ -12,16 +12,25 @@ class Jigsaw { use Macroable; + protected static $commands = []; + public $app; + protected $env; + protected $pageInfo; + protected $outputPaths; + protected $siteData; + protected $dataLoader; + protected $remoteItemLoader; + protected $siteBuilder; + protected $verbose; - protected static $commands = []; public function __construct( Container $app, @@ -35,19 +44,6 @@ public function __construct( $this->siteBuilder = $siteBuilder; } - public function build($env, $useCache = false) - { - $this->env = $env; - $this->siteData = $this->dataLoader->loadSiteData($this->app->config); - - return $this->fireEvent('beforeBuild') - ->buildCollections() - ->fireEvent('afterCollections') - ->buildSite($useCache) - ->fireEvent('afterBuild') - ->cleanup(); - } - public static function registerCommand($command) { self::$commands[] = $command; @@ -60,41 +56,17 @@ public static function addUserCommands($app, $container) } } - protected function buildCollections() - { - $this->remoteItemLoader->write($this->siteData->collections, $this->getSourcePath()); - $collectionData = $this->dataLoader->loadCollectionData($this->siteData, $this->getSourcePath()); - $this->siteData = $this->siteData->addCollectionData($collectionData); - - return $this; - } - - protected function buildSite($useCache) - { - $this->pageInfo = $this->siteBuilder - ->setUseCache($useCache) - ->build( - $this->getSourcePath(), - $this->getDestinationPath(), - $this->siteData, - ); - $this->outputPaths = $this->pageInfo->keys(); - - return $this; - } - - protected function cleanup() - { - $this->remoteItemLoader->cleanup(); - - return $this; - } - - protected function fireEvent($event) + public function build($env, $useCache = false) { - $this->app->events->fire($event, $this); + $this->env = $env; + $this->siteData = $this->dataLoader->loadSiteData($this->app->config); - return $this; + return $this->fireEvent('beforeBuild') + ->buildCollections() + ->fireEvent('afterCollections') + ->buildSite($useCache) + ->fireEvent('afterBuild') + ->cleanup(); } public function getSiteData() @@ -196,4 +168,41 @@ public function writeOutputFile($fileName, $contents) { return $this->getFilesystem()->putWithDirectories($this->getDestinationPath() . '/' . $fileName, $contents); } + + protected function buildCollections() + { + $this->remoteItemLoader->write($this->siteData->collections, $this->getSourcePath()); + $collectionData = $this->dataLoader->loadCollectionData($this->siteData, $this->getSourcePath()); + $this->siteData = $this->siteData->addCollectionData($collectionData); + + return $this; + } + + protected function buildSite($useCache) + { + $this->pageInfo = $this->siteBuilder + ->setUseCache($useCache) + ->build( + $this->getSourcePath(), + $this->getDestinationPath(), + $this->siteData, + ); + $this->outputPaths = $this->pageInfo->keys(); + + return $this; + } + + protected function cleanup() + { + $this->remoteItemLoader->cleanup(); + + return $this; + } + + protected function fireEvent($event) + { + $this->app->events->fire($event, $this); + + return $this; + } } diff --git a/src/Loaders/CollectionRemoteItemLoader.php b/src/Loaders/CollectionRemoteItemLoader.php index 77b8b0ce..0f3f73b6 100644 --- a/src/Loaders/CollectionRemoteItemLoader.php +++ b/src/Loaders/CollectionRemoteItemLoader.php @@ -29,15 +29,6 @@ public function write($collections, $source) }); } - private function createTempDirectory($source, $collectionName) - { - $tempDirectory = $source . '/_' . $collectionName . '/_tmp'; - $this->prepareDirectory($tempDirectory, true); - $this->tempDirectories[] = $tempDirectory; - - return $tempDirectory; - } - public function cleanup() { collect($this->tempDirectories)->each(function ($path) { @@ -49,6 +40,15 @@ public function cleanup() }); } + private function createTempDirectory($source, $collectionName) + { + $tempDirectory = $source . '/_' . $collectionName . '/_tmp'; + $this->prepareDirectory($tempDirectory, true); + $this->tempDirectories[] = $tempDirectory; + + return $tempDirectory; + } + private function getItems($collection) { if (! $collection->items) { diff --git a/src/PageVariable.php b/src/PageVariable.php index 4f814eb6..3149b83d 100644 --- a/src/PageVariable.php +++ b/src/PageVariable.php @@ -12,23 +12,6 @@ public function addVariables(array $variables) $this->items = collect($this->items)->merge($this->makeIterable($variables))->all(); } - public function __call($method, $args) - { - $helper = $this->get($method); - - if (! $helper && Str::startsWith($method, 'get')) { - return $this->_meta->get(Str::camel(substr($method, 3)), function () use ($method) { - throw new Exception($this->missingHelperError($method)); - }); - } - - if (is_callable($helper)) { - return $helper->__invoke($this, ...$args); - } - - throw new Exception($this->missingHelperError($method)); - } - public function getPath($key = null) { if (($key || $this->_meta->extending) && $this->_meta->path instanceof IterableObject) { @@ -61,4 +44,21 @@ protected function missingHelperError($functionName) { return 'No function named "' . $functionName . '" was found in the file "config.php".'; } + + public function __call($method, $args) + { + $helper = $this->get($method); + + if (! $helper && Str::startsWith($method, 'get')) { + return $this->_meta->get(Str::camel(substr($method, 3)), function () use ($method) { + throw new Exception($this->missingHelperError($method)); + }); + } + + if (is_callable($helper)) { + return $helper->__invoke($this, ...$args); + } + + throw new Exception($this->missingHelperError($method)); + } } diff --git a/src/Parsers/FrontMatterParser.php b/src/Parsers/FrontMatterParser.php index 137cf2e2..5c8eb291 100644 --- a/src/Parsers/FrontMatterParser.php +++ b/src/Parsers/FrontMatterParser.php @@ -7,10 +7,12 @@ class FrontMatterParser { - private $parser; public $frontMatter = []; + public $content; + private $parser; + public function __construct(Parser $parser) { $this->parser = $parser; @@ -78,6 +80,6 @@ public function extractContent($content) private function addExtendsToBladeContent($extends, $bladeContent) { - return "@extends('$extends')\n" . $bladeContent; + return "@extends('{$extends}')\n" . $bladeContent; } } diff --git a/src/Parsers/MarkdownParser.php b/src/Parsers/MarkdownParser.php index 2ed05ea7..e8257ae2 100644 --- a/src/Parsers/MarkdownParser.php +++ b/src/Parsers/MarkdownParser.php @@ -13,6 +13,11 @@ public function __construct(MarkdownParserContract $parser = null) $this->parser = $parser ?? new JigsawMarkdownParser; } + public function parse($markdown) + { + return $this->parser->parse($markdown); + } + public function __get($property) { return $this->parser->$property; @@ -22,9 +27,4 @@ public function __set($property, $value) { $this->parser->$property = $value; } - - public function parse($markdown) - { - return $this->parser->parse($markdown); - } } diff --git a/src/PathResolvers/CollectionPathResolver.php b/src/PathResolvers/CollectionPathResolver.php index 07874fd9..838c8a45 100644 --- a/src/PathResolvers/CollectionPathResolver.php +++ b/src/PathResolvers/CollectionPathResolver.php @@ -16,155 +16,11 @@ public function __construct($outputPathResolver, $viewRenderer) $this->view = $viewRenderer; } - public function link($path, $data, bool $transliterate = true) - { - return collect($data->extends)->map(function ($bladeViewPath, $templateKey) use ($path, $data, $transliterate) { - return $this->cleanOutputPath( - $this->getPath($path, $data, $this->getExtension($bladeViewPath), $templateKey), - $transliterate, - ); - }); - } - - public function getExtension($bladeViewPath) - { - $extension = $this->view->getExtension($bladeViewPath); - - return collect(['php', 'html'])->contains($extension) ? '' : '.' . $extension; - } - - private function getPath($path, $data, $extension, $templateKey = null) - { - $templateKeySuffix = $templateKey ? '/' . $templateKey : ''; - - if ($templateKey && $path instanceof IterableObject) { - $path = $path->get($templateKey); - $templateKeySuffix = ''; - - if (! $path) { - return; - } - } - - if (is_callable($path)) { - $link = $this->cleanInputPath($path->__invoke($data)); - - return $link ? $this->resolve($link . $templateKeySuffix . $extension) : ''; - } - - if (is_string($path) && $path) { - $link = $this->parseShorthand($this->cleanInputPath($path), $data); - - return $link ? $this->resolve($link . $templateKeySuffix . $extension) : ''; - } - - return $this->getDefaultPath($data, $templateKey) . $templateKeySuffix . $extension; - } - - private function getDefaultPath($data) - { - return $this->slug($data->getCollectionName()) . '/' . $this->slug($data->getFilename()); - } - - private function parseShorthand($path, $data) - { - preg_match_all('/\{(.*?)\}/', $path, $bracketedParameters); - - if (count($bracketedParameters[0]) == 0) { - return $path . '/' . $this->slug($data->getFilename()); - } - - $bracketedParametersReplaced = - collect($bracketedParameters[0])->map(function ($param) use ($data) { - return ['token' => $param, 'value' => $this->getParameterValue($param, $data)]; - })->reduce(function ($carry, $param) { - return str_replace($param['token'], $param['value'], $carry); - }, $path); - - return $bracketedParametersReplaced; - } - - private function getParameterValue($param, $data) - { - list($param, $dateFormat) = explode('|', trim($param, '{}') . '|'); - $slugSeparator = ctype_alpha($param[0]) ? null : $param[0]; - - if ($slugSeparator) { - $param = ltrim($param, $param[0]); - } - - $value = Arr::get($data, $param, $data->_meta->get($param)); - - if (! $value) { - return ''; - } - - $value = $dateFormat ? $this->formatDate($value, $dateFormat) : $value; - - return $slugSeparator ? $this->slug($value, $slugSeparator) : $value; - } - - private function formatDate($date, $format) - { - if (is_string($date)) { - return strtotime($date) ? date($format, strtotime($date)) : ''; - } - - return date($format, $date); - } - - private function cleanInputPath($path) - { - return $this->ensureSlashAtBeginningOnly($path); - } - - private function cleanOutputPath($path, bool $transliterate) - { - // Remove double slashes - $path = preg_replace('/\/\/+/', '/', $path); - - if ($transliterate) { - $path = $this->ascii($path); - } - - return $this->ensureSlashAtBeginningOnly($path); - } - - private function ensureSlashAtBeginningOnly($path) - { - return '/' . trimPath($path); - } - - private function resolve($path) - { - return $this->outputPathResolver->link(dirname($path), basename($path), 'html'); - } - - /** - * This is identical to Laravel's built-in `str_slug()` helper, - * except it preserves `.` characters. - */ - private function slug($string, $separator = '-') - { - // Convert all dashes/underscores into separator - $flip = $separator == '-' ? '_' : '-'; - $string = preg_replace('![' . preg_quote($flip) . ']+!u', $separator, $string); - - // Remove all characters that are not the separator, letters, numbers, whitespace, or dot - $string = preg_replace('![^' . preg_quote($separator) . '\pL\pN\s\.]+!u', '', mb_strtolower($string)); - - // Replace all separator characters and whitespace by a single separator - $string = preg_replace('![' . preg_quote($separator) . '\s]+!u', $separator, $string); - - return trim($string, $separator); - } - /** * Transliterate a UTF-8 value to ASCII. * - * @param string $value - * @param string $language - * + * @param string $value + * @param string $language * @return string */ private static function ascii($value, $language = 'en') @@ -323,8 +179,7 @@ private static function charsArray() * * @see https://github.com/danielstjules/Stringy/blob/3.1.0/LICENSE.txt * - * @param string $language - * + * @param string $language * @return array|null */ private static function languageSpecificCharsArray($language) @@ -346,4 +201,147 @@ private static function languageSpecificCharsArray($language) return $languageSpecific[$language] ?? null; } + + public function link($path, $data, bool $transliterate = true) + { + return collect($data->extends)->map(function ($bladeViewPath, $templateKey) use ($path, $data, $transliterate) { + return $this->cleanOutputPath( + $this->getPath($path, $data, $this->getExtension($bladeViewPath), $templateKey), + $transliterate, + ); + }); + } + + public function getExtension($bladeViewPath) + { + $extension = $this->view->getExtension($bladeViewPath); + + return collect(['php', 'html'])->contains($extension) ? '' : '.' . $extension; + } + + private function getPath($path, $data, $extension, $templateKey = null) + { + $templateKeySuffix = $templateKey ? '/' . $templateKey : ''; + + if ($templateKey && $path instanceof IterableObject) { + $path = $path->get($templateKey); + $templateKeySuffix = ''; + + if (! $path) { + return; + } + } + + if (is_callable($path)) { + $link = $this->cleanInputPath($path->__invoke($data)); + + return $link ? $this->resolve($link . $templateKeySuffix . $extension) : ''; + } + + if (is_string($path) && $path) { + $link = $this->parseShorthand($this->cleanInputPath($path), $data); + + return $link ? $this->resolve($link . $templateKeySuffix . $extension) : ''; + } + + return $this->getDefaultPath($data, $templateKey) . $templateKeySuffix . $extension; + } + + private function getDefaultPath($data) + { + return $this->slug($data->getCollectionName()) . '/' . $this->slug($data->getFilename()); + } + + private function parseShorthand($path, $data) + { + preg_match_all('/\{(.*?)\}/', $path, $bracketedParameters); + + if (count($bracketedParameters[0]) == 0) { + return $path . '/' . $this->slug($data->getFilename()); + } + + $bracketedParametersReplaced = + collect($bracketedParameters[0])->map(function ($param) use ($data) { + return ['token' => $param, 'value' => $this->getParameterValue($param, $data)]; + })->reduce(function ($carry, $param) { + return str_replace($param['token'], $param['value'], $carry); + }, $path); + + return $bracketedParametersReplaced; + } + + private function getParameterValue($param, $data) + { + [$param, $dateFormat] = explode('|', trim($param, '{}') . '|'); + $slugSeparator = ctype_alpha($param[0]) ? null : $param[0]; + + if ($slugSeparator) { + $param = ltrim($param, $param[0]); + } + + $value = Arr::get($data, $param, $data->_meta->get($param)); + + if (! $value) { + return ''; + } + + $value = $dateFormat ? $this->formatDate($value, $dateFormat) : $value; + + return $slugSeparator ? $this->slug($value, $slugSeparator) : $value; + } + + private function formatDate($date, $format) + { + if (is_string($date)) { + return strtotime($date) ? date($format, strtotime($date)) : ''; + } + + return date($format, $date); + } + + private function cleanInputPath($path) + { + return $this->ensureSlashAtBeginningOnly($path); + } + + private function cleanOutputPath($path, bool $transliterate) + { + // Remove double slashes + $path = preg_replace('/\/\/+/', '/', $path); + + if ($transliterate) { + $path = $this->ascii($path); + } + + return $this->ensureSlashAtBeginningOnly($path); + } + + private function ensureSlashAtBeginningOnly($path) + { + return '/' . trimPath($path); + } + + private function resolve($path) + { + return $this->outputPathResolver->link(dirname($path), basename($path), 'html'); + } + + /** + * This is identical to Laravel's built-in `str_slug()` helper, + * except it preserves `.` characters. + */ + private function slug($string, $separator = '-') + { + // Convert all dashes/underscores into separator + $flip = $separator == '-' ? '_' : '-'; + $string = preg_replace('![' . preg_quote($flip) . ']+!u', $separator, $string); + + // Remove all characters that are not the separator, letters, numbers, whitespace, or dot + $string = preg_replace('![^' . preg_quote($separator) . '\pL\pN\s\.]+!u', '', mb_strtolower($string)); + + // Replace all separator characters and whitespace by a single separator + $string = preg_replace('![' . preg_quote($separator) . '\s]+!u', $separator, $string); + + return trim($string, $separator); + } } diff --git a/src/Scaffold/CustomInstaller.php b/src/Scaffold/CustomInstaller.php index 7b5f9438..1f1c30be 100644 --- a/src/Scaffold/CustomInstaller.php +++ b/src/Scaffold/CustomInstaller.php @@ -5,6 +5,7 @@ class CustomInstaller { public $ignore = ['init.php']; + protected $from; protected $builder; protected $console; diff --git a/src/Scaffold/DefaultInstaller.php b/src/Scaffold/DefaultInstaller.php index 82054fd5..15ac653e 100644 --- a/src/Scaffold/DefaultInstaller.php +++ b/src/Scaffold/DefaultInstaller.php @@ -17,9 +17,13 @@ class DefaultInstaller 'npm install', 'npm run dev', ]; + protected $commands; + protected $delete; + protected $ignore; + protected $builder; public function install(ScaffoldBuilder $builder, $settings = []) diff --git a/src/Scaffold/InstallerCommandException.php b/src/Scaffold/InstallerCommandException.php index 939fb109..11e342e9 100644 --- a/src/Scaffold/InstallerCommandException.php +++ b/src/Scaffold/InstallerCommandException.php @@ -4,4 +4,6 @@ use Exception; -class InstallerCommandException extends Exception {} +class InstallerCommandException extends Exception +{ +} diff --git a/src/Scaffold/PresetPackage.php b/src/Scaffold/PresetPackage.php index 6381df2a..355e7ca8 100644 --- a/src/Scaffold/PresetPackage.php +++ b/src/Scaffold/PresetPackage.php @@ -22,6 +22,7 @@ class PresetPackage public $preset; public $suffix; public $vendor; + protected $builder; protected $customInstaller; protected $defaultInstaller; @@ -33,7 +34,7 @@ public function __construct(DefaultInstaller $default, CustomInstaller $custom, $this->defaultInstaller = $default; $this->customInstaller = $custom; $this->process = $process; - $this->files = new Filesystem(); + $this->files = new Filesystem; } public function init($preset, PresetScaffoldBuilder $builder) diff --git a/src/Scaffold/PresetScaffoldBuilder.php b/src/Scaffold/PresetScaffoldBuilder.php index c4acca31..3254dc5d 100644 --- a/src/Scaffold/PresetScaffoldBuilder.php +++ b/src/Scaffold/PresetScaffoldBuilder.php @@ -8,6 +8,7 @@ class PresetScaffoldBuilder extends ScaffoldBuilder { public $package; + protected $files; protected $process; protected $question; diff --git a/src/Scaffold/ScaffoldBuilder.php b/src/Scaffold/ScaffoldBuilder.php index e8e8312a..8fe9ef3b 100644 --- a/src/Scaffold/ScaffoldBuilder.php +++ b/src/Scaffold/ScaffoldBuilder.php @@ -13,6 +13,7 @@ abstract class ScaffoldBuilder ]; public $base; + protected $console; protected $files; protected $process; diff --git a/src/SiteData.php b/src/SiteData.php index b099948c..b8b8eb8c 100644 --- a/src/SiteData.php +++ b/src/SiteData.php @@ -8,7 +8,7 @@ class SiteData extends IterableObject { public static function build(Collection $config) { - $siteData = new static(); + $siteData = new static; $siteData->putIterable('collections', $config->get('collections')); $siteData->putIterable('page', $config); diff --git a/src/Support/ServiceProvider.php b/src/Support/ServiceProvider.php index 16052f78..8e809b77 100644 --- a/src/Support/ServiceProvider.php +++ b/src/Support/ServiceProvider.php @@ -8,7 +8,8 @@ abstract class ServiceProvider { public function __construct( protected Container $app, - ) {} + ) { + } public function register(): void { diff --git a/src/Support/helpers.php b/src/Support/helpers.php index c655bb66..06ac9164 100644 --- a/src/Support/helpers.php +++ b/src/Support/helpers.php @@ -133,7 +133,7 @@ function url(string $path): string function dd(...$args) { foreach ($args as $x) { - (new VarDumper())->dump($x); + (new VarDumper)->dump($x); } exit(1); diff --git a/src/View/BladeCompiler.php b/src/View/BladeCompiler.php index 54a970a1..8bc77470 100644 --- a/src/View/BladeCompiler.php +++ b/src/View/BladeCompiler.php @@ -9,8 +9,7 @@ class BladeCompiler extends BaseBladeCompiler /** * Compile the component tags. * - * @param string $value - * + * @param string $value * @return string */ protected function compileComponentTags($value) diff --git a/tests/BladeComponentTest.php b/tests/BladeComponentTest.php index 619f10c3..fa337c0e 100644 --- a/tests/BladeComponentTest.php +++ b/tests/BladeComponentTest.php @@ -21,18 +21,20 @@ public function can_include_blade_component_with_at_syntax() ]), '_components' => [ 'alert.blade.php' => implode("\n", [ - '
', - '

This is the component

', - '

Named title slot: {{ $title }}

', - '{{ $slot }}', - '
', + '
', + '

This is the component

', + '

Named title slot: {{ $title }}

', + '{{ $slot }}', + '
', ]), ], ]); $this->buildSite($files, []); - $this->assertOutputFile('build/page.html', <<assertOutputFile( + 'build/page.html', + <<<'HTML'

This is the component

Named title slot: Title test

@@ -155,6 +157,7 @@ class_alias('Tests\\AlertComponent', 'Components\\ClassComponent'); } } +// phpcs:disable PSR1.Classes.ClassDeclaration,Squiz.Classes.ClassFileName class AlertComponent extends Component { public $type; diff --git a/tests/CollectionItemTest.php b/tests/CollectionItemTest.php index 696f149f..46e6c1da 100644 --- a/tests/CollectionItemTest.php +++ b/tests/CollectionItemTest.php @@ -38,7 +38,8 @@ public function collection_item_contents_are_returned_when_item_is_referenced_as */ public function collection_item_can_be_filtered() { - $config = collect(['collections' => [ + $config = collect([ + 'collections' => [ 'collection' => [ 'path' => 'collection/{filename}', 'filter' => function ($item) { @@ -85,7 +86,8 @@ public function collection_item_can_be_filtered() */ public function collection_item_can_be_mapped() { - $config = collect(['collections' => [ + $config = collect([ + 'collections' => [ 'collection' => [ 'path' => 'collection/{filename}', 'map' => function ($item) { @@ -266,6 +268,7 @@ public function collection_item_page_metadata_contains_modified_time() } } +// phpcs:disable PSR1.Classes.ClassDeclaration,Squiz.Classes.ClassFileName class MappedItem extends CollectionItem { public function doubleNumber() diff --git a/tests/CommonMarkTest.php b/tests/CommonMarkTest.php index 1b9ce2de..c59f4a70 100644 --- a/tests/CommonMarkTest.php +++ b/tests/CommonMarkTest.php @@ -46,7 +46,7 @@ public function configure_commonmark_parser() /** @test */ public function replace_commonmark_extensions() { - $files = $this->withContent(<<withContent(<<<'MD' # Fruits {.class} Apple @@ -74,10 +74,11 @@ public function override_parser_with_custom_class() $files = $this->withContent('### Heading {.class}'); $this->app->bind(MarkdownParserContract::class, function () { - return new class implements MarkdownParserContract { + return new class implements MarkdownParserContract + { public function parse(string $text) { - return <<createSource([]); $command = $this->app->make(CustomCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $console = new CommandTester($command); $console->execute([]); @@ -24,6 +24,7 @@ public function custom_command_with_no_arguments() } } +// phpcs:disable PSR1.Classes.ClassDeclaration,Squiz.Classes.ClassFileName class CustomCommand extends Command { protected function fire() diff --git a/tests/CustomScaffoldInstallerTest.php b/tests/CustomScaffoldInstallerTest.php index f6a94828..d62bd9a8 100644 --- a/tests/CustomScaffoldInstallerTest.php +++ b/tests/CustomScaffoldInstallerTest.php @@ -18,12 +18,12 @@ class CustomScaffoldInstallerTest extends TestCase public function custom_installer_installs_basic_scaffold_files() { $this->createSource([]); - $builder = new PresetScaffoldBuilder(new Filesystem(), Mockery::mock(PresetPackage::class), new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, Mockery::mock(PresetPackage::class), new ProcessRunner); $builder->setBase($this->tmp); $this->assertCount(0, app('files')->filesAndDirectories($this->tmp)); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup(); $this->assertFileExists($this->tmpPath('source')); @@ -38,10 +38,10 @@ public function custom_installer_installs_basic_scaffold_files() public function installer_deletes_single_base_file_specified_in_delete_array() { $this->createSource([]); - $builder = new PresetScaffoldBuilder(new Filesystem(), Mockery::mock(PresetPackage::class), new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, Mockery::mock(PresetPackage::class), new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->delete('config.php'); @@ -55,10 +55,10 @@ public function installer_deletes_single_base_file_specified_in_delete_array() public function installer_deletes_multiple_base_files_specified_in_delete_array() { $this->createSource([]); - $builder = new PresetScaffoldBuilder(new Filesystem(), Mockery::mock(PresetPackage::class), new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, Mockery::mock(PresetPackage::class), new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->delete([ 'config.php', @@ -76,10 +76,10 @@ public function installer_deletes_multiple_base_files_specified_in_delete_array( public function installer_deletes_base_directories_specified_in_delete_array() { $this->createSource([]); - $builder = new PresetScaffoldBuilder(new Filesystem(), Mockery::mock(PresetPackage::class), new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, Mockery::mock(PresetPackage::class), new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->delete([ 'source', @@ -104,10 +104,10 @@ public function installer_copies_all_preset_files_if_copy_has_no_parameter() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->copy(); @@ -132,10 +132,10 @@ public function installer_copies_individual_preset_file_if_copy_parameter_is_str ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->copy('preset-file.php'); @@ -160,10 +160,10 @@ public function installer_copies_multiple_preset_files_if_copy_parameter_is_arra ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->copy([ 'preset-file.php', @@ -189,10 +189,10 @@ public function installer_can_copy_files_using_a_wildcard() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->copy([ 'preset-file-*.php', @@ -219,10 +219,10 @@ public function installer_can_call_copy_multiple_times() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->copy('.dotfile') ->copy('source'); @@ -252,10 +252,10 @@ public function installer_copies_from_specified_directory_to_root_if_from_is_spe ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->from('themes/directory-2') ->copy(); @@ -280,10 +280,10 @@ public function installer_can_ignore_preset_files_when_copying() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->ignore('.dotfile') ->copy(); @@ -309,10 +309,10 @@ public function installer_can_call_ignore_multiple_times() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->ignore('.dotfile') ->ignore('preset-file.php') @@ -342,10 +342,10 @@ public function original_composer_json_is_not_deleted() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->delete('composer.json'); @@ -379,10 +379,10 @@ public function original_composer_json_is_merged_with_new_composer_json_after_co ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->copy(); @@ -428,10 +428,10 @@ public function composer_json_files_are_merged_when_copying_multiple_times() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->copy() ->from('theme') @@ -462,10 +462,10 @@ public function empty_composer_json_is_created_if_it_was_not_present_before_pres ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new CustomInstaller())->install($builder) + (new CustomInstaller)->install($builder) ->setup() ->copy(); @@ -479,6 +479,7 @@ public function empty_composer_json_is_created_if_it_was_not_present_before_pres /** * @test + * * @doesNotPerformAssertions */ public function installer_can_ask_for_user_input() @@ -486,7 +487,7 @@ public function installer_can_ask_for_user_input() $console = Mockery::spy(ConsoleSession::class); $builder = Mockery::spy(PresetScaffoldBuilder::class); - (new CustomInstaller())->setConsole($console) + (new CustomInstaller)->setConsole($console) ->install($builder) ->setup() ->ask('What is your name?'); @@ -497,6 +498,7 @@ public function installer_can_ask_for_user_input() /** * @test + * * @doesNotPerformAssertions */ public function installer_can_ask_for_user_input_with_choices() @@ -504,7 +506,7 @@ public function installer_can_ask_for_user_input_with_choices() $console = Mockery::spy(ConsoleSession::class); $builder = Mockery::spy(PresetScaffoldBuilder::class); - (new CustomInstaller())->setConsole($console) + (new CustomInstaller)->setConsole($console) ->install($builder) ->setup() ->ask( @@ -524,6 +526,7 @@ public function installer_can_ask_for_user_input_with_choices() /** * @test + * * @doesNotPerformAssertions */ public function installer_can_ask_for_user_confirmation() @@ -531,7 +534,7 @@ public function installer_can_ask_for_user_confirmation() $console = Mockery::spy(ConsoleSession::class); $builder = Mockery::spy(PresetScaffoldBuilder::class); - (new CustomInstaller())->setConsole($console) + (new CustomInstaller)->setConsole($console) ->install($builder) ->setup() ->confirm('Continue?'); @@ -542,6 +545,7 @@ public function installer_can_ask_for_user_confirmation() /** * @test + * * @doesNotPerformAssertions */ public function installer_runs_specified_commands_from_init() @@ -549,7 +553,7 @@ public function installer_runs_specified_commands_from_init() $package = Mockery::mock(PresetPackage::class); $builder = Mockery::spy(PresetScaffoldBuilder::class); - (new CustomInstaller())->setConsole(null) + (new CustomInstaller)->setConsole(null) ->install($builder) ->setup() ->run('yarn'); diff --git a/tests/DefaultScaffoldInstallerTest.php b/tests/DefaultScaffoldInstallerTest.php index 17ed5ace..e7628b47 100644 --- a/tests/DefaultScaffoldInstallerTest.php +++ b/tests/DefaultScaffoldInstallerTest.php @@ -18,12 +18,12 @@ class DefaultScaffoldInstallerTest extends TestCase public function installer_installs_basic_scaffold_files() { $this->createSource([]); - $builder = new PresetScaffoldBuilder(new Filesystem(), Mockery::mock(PresetPackage::class), new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, Mockery::mock(PresetPackage::class), new ProcessRunner); $builder->setBase($this->tmp); $this->assertCount(0, app('files')->filesAndDirectories($this->tmp)); - (new DefaultInstaller())->install($builder, ['commands' => []]); + (new DefaultInstaller)->install($builder, ['commands' => []]); $this->assertFileExists($this->tmpPath('source')); $this->assertFileExists($this->tmpPath('package.json')); @@ -37,10 +37,10 @@ public function installer_installs_basic_scaffold_files() public function installer_deletes_single_base_file_specified_in_delete_array() { $this->createSource([]); - $builder = new PresetScaffoldBuilder(new Filesystem(), Mockery::mock(PresetPackage::class), new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, Mockery::mock(PresetPackage::class), new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, [ + (new DefaultInstaller)->install($builder, [ 'delete' => 'config.php', 'commands' => [], ]); @@ -55,10 +55,10 @@ public function installer_deletes_single_base_file_specified_in_delete_array() public function installer_deletes_multiple_base_files_specified_in_delete_array() { $this->createSource([]); - $builder = new PresetScaffoldBuilder(new Filesystem(), Mockery::mock(PresetPackage::class), new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, Mockery::mock(PresetPackage::class), new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, [ + (new DefaultInstaller)->install($builder, [ 'delete' => ['config.php', 'package.json'], 'commands' => [], ]); @@ -74,10 +74,10 @@ public function installer_deletes_multiple_base_files_specified_in_delete_array( public function installer_deletes_base_directories_specified_in_delete_array() { $this->createSource([]); - $builder = new PresetScaffoldBuilder(new Filesystem(), Mockery::mock(PresetPackage::class), new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, Mockery::mock(PresetPackage::class), new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, [ + (new DefaultInstaller)->install($builder, [ 'delete' => ['source'], 'commands' => [], ]); @@ -108,10 +108,10 @@ public function installer_copies_all_preset_files() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => []]); + (new DefaultInstaller)->install($builder, ['commands' => []]); $this->assertFileExists($this->tmpPath('.dotfile')); $this->assertFileExists($this->tmpPath('preset-file.php')); @@ -132,10 +132,10 @@ public function installer_preserves_base_files_when_copying_preset_files() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => []]); + (new DefaultInstaller)->install($builder, ['commands' => []]); $this->assertFileExists($this->tmpPath('config.php')); } @@ -152,10 +152,10 @@ public function installer_overwrites_base_files_of_same_name_when_copying_preset ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => []]); + (new DefaultInstaller)->install($builder, ['commands' => []]); $this->assertOutputFile('config.php', 'new config file from preset'); } @@ -179,10 +179,10 @@ public function installer_can_ignore_files_and_directories_from_preset_when_copy ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, [ + (new DefaultInstaller)->install($builder, [ 'ignore' => [ 'ignore-this.php', 'ignore-directory', @@ -215,10 +215,10 @@ public function installer_can_ignore_files_and_directories_from_preset_using_wil ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, [ + (new DefaultInstaller)->install($builder, [ 'ignore' => [ 'ignore*', ], @@ -243,10 +243,10 @@ public function installer_ignores_node_modules_directory_from_preset_when_copyin ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => []]); + (new DefaultInstaller)->install($builder, ['commands' => []]); $this->assertFileMissing($this->tmpPath('node_modules')); } @@ -263,10 +263,10 @@ public function installer_ignores_vendor_directory_from_preset_when_copying() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => []]); + (new DefaultInstaller)->install($builder, ['commands' => []]); $this->assertFileMissing($this->tmpPath('vendor')); } @@ -283,10 +283,10 @@ public function installer_ignores_init_file_from_preset_when_copying() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => []]); + (new DefaultInstaller)->install($builder, ['commands' => []]); $this->assertFileMissing($this->tmpPath('init.php')); } @@ -304,10 +304,10 @@ public function installer_ignores_build_directories_from_preset_when_copying() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => []]); + (new DefaultInstaller)->install($builder, ['commands' => []]); $this->assertFileMissing($this->tmpPath('build_local')); $this->assertFileMissing($this->tmpPath('build_production')); @@ -315,6 +315,7 @@ public function installer_ignores_build_directories_from_preset_when_copying() /** * @test + * * @doesNotPerformAssertions */ public function installer_runs_default_commands_if_none_are_specified_in_init() @@ -326,7 +327,7 @@ public function installer_runs_default_commands_if_none_are_specified_in_init() $builder->shouldReceive('copyPresetFiles')->andReturn($builder); $builder->shouldReceive('mergeComposerDotJson')->andReturn($builder); - $installer = new DefaultInstaller(); + $installer = new DefaultInstaller; $installer->install($builder); $builder->shouldHaveReceived('runCommands')->with($installer::DEFAULT_COMMANDS); @@ -334,6 +335,7 @@ public function installer_runs_default_commands_if_none_are_specified_in_init() /** * @test + * * @doesNotPerformAssertions */ public function installer_runs_no_commands_if_empty_array_is_specified_in_init() @@ -345,7 +347,7 @@ public function installer_runs_no_commands_if_empty_array_is_specified_in_init() $builder->shouldReceive('copyPresetFiles')->andReturn($builder); $builder->shouldReceive('mergeComposerDotJson')->andReturn($builder); - $installer = new DefaultInstaller(); + $installer = new DefaultInstaller; $installer->install($builder, ['commands' => []]); $builder->shouldHaveReceived('runCommands')->with([]); @@ -353,6 +355,7 @@ public function installer_runs_no_commands_if_empty_array_is_specified_in_init() /** * @test + * * @doesNotPerformAssertions */ public function installer_runs_specified_commands_from_init() @@ -364,7 +367,7 @@ public function installer_runs_specified_commands_from_init() $builder->shouldReceive('copyPresetFiles')->andReturn($builder); $builder->shouldReceive('mergeComposerDotJson')->andReturn($builder); - $installer = new DefaultInstaller(); + $installer = new DefaultInstaller; $installer->install($builder, ['commands' => ['yarn']]); $builder->shouldHaveReceived('runCommands')->with(['yarn']); @@ -389,10 +392,10 @@ public function composer_json_is_restored_if_deleted_after_preset_is_installed() ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => [], 'delete' => 'composer.json']); + (new DefaultInstaller)->install($builder, ['commands' => [], 'delete' => 'composer.json']); $this->assertFileExists($this->tmpPath('composer.json')); $this->assertEquals($old_composer, json_decode(file_get_contents($this->tmpPath('composer.json')), true)); @@ -423,10 +426,10 @@ public function original_composer_json_is_merged_with_composer_json_installed_by ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => [], 'delete' => 'composer.json']); + (new DefaultInstaller)->install($builder, ['commands' => [], 'delete' => 'composer.json']); $new_composer = json_decode(file_get_contents($this->tmpPath('composer.json')), true); @@ -460,10 +463,10 @@ public function version_constraints_from_original_composer_json_take_precedence_ ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => [], 'delete' => 'composer.json']); + (new DefaultInstaller)->install($builder, ['commands' => [], 'delete' => 'composer.json']); $new_composer = json_decode(file_get_contents($this->tmpPath('composer.json')), true); @@ -484,10 +487,10 @@ public function empty_composer_json_is_created_if_it_was_not_present_before_pres ]); $package = Mockery::mock(PresetPackage::class); $package->path = $this->tmp . '/package'; - $builder = new PresetScaffoldBuilder(new Filesystem(), $package, new ProcessRunner()); + $builder = new PresetScaffoldBuilder(new Filesystem, $package, new ProcessRunner); $builder->setBase($this->tmp); - (new DefaultInstaller())->install($builder, ['commands' => [], 'delete' => 'composer.json']); + (new DefaultInstaller)->install($builder, ['commands' => [], 'delete' => 'composer.json']); $this->assertEquals( [ diff --git a/tests/DotInFileNameTest.php b/tests/DotInFileNameTest.php index 038c4f12..3c80c173 100644 --- a/tests/DotInFileNameTest.php +++ b/tests/DotInFileNameTest.php @@ -62,7 +62,7 @@ public function blade_files_with_dot_in_filename_are_processed() */ public function dot_in_filename_is_preserved_for_collection_item_with_default_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('collection-item-with.dot'); $outputPath = $pathResolver->link(null, $pageVariable); @@ -75,7 +75,7 @@ public function dot_in_filename_is_preserved_for_collection_item_with_default_pa */ public function dot_in_filename_is_preserved_for_collection_item_with_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('collection-item-with.dot'); $outputPath = $pathResolver->link('{filename}', $pageVariable); @@ -88,7 +88,7 @@ public function dot_in_filename_is_preserved_for_collection_item_with_shorthand_ */ public function dot_in_filename_is_preserved_for_collection_item_with_slugified_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('collection-item-with.dot'); $outputPath = $pathResolver->link('{_filename}', $pageVariable); @@ -98,7 +98,7 @@ public function dot_in_filename_is_preserved_for_collection_item_with_slugified_ protected function getPageDataDummy() { - return PageData::withPageMetaData(new IterableObject(), []); + return PageData::withPageMetaData(new IterableObject, []); } protected function getPageVariableDummy($filename) diff --git a/tests/EventsTest.php b/tests/EventsTest.php index cbdaf94a..056a451e 100644 --- a/tests/EventsTest.php +++ b/tests/EventsTest.php @@ -55,7 +55,8 @@ public function multiple_event_listeners_are_fired_in_the_order_they_were_define /** @test */ public function it_can_handle_invokable_listeners() { - $this->app['events']->beforeBuild(new class { + $this->app['events']->beforeBuild(new class + { private $object; public function __construct() @@ -554,6 +555,7 @@ public function user_can_write_a_new_output_file_in_a_new_directory_in_after_bui } } +// phpcs:disable PSR1.Classes.ClassDeclaration,Squiz.Classes.ClassFileName class TestListener { public function handle($jigsaw) diff --git a/tests/FilePathTest.php b/tests/FilePathTest.php index 1b867d73..a8e2485b 100644 --- a/tests/FilePathTest.php +++ b/tests/FilePathTest.php @@ -9,9 +9,12 @@ class FilePathTest extends TestCase { - public function test_accented_character_in_filename_is_replaced_with_unaccented_character_when_using_default_path_config() + /** + * @test + */ + public function accented_character_in_filename_is_replaced_with_unaccented_character_when_using_default_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('Fútbol solidario'); $outputPath = $pathResolver->link(null, $pageVariable); @@ -19,9 +22,12 @@ public function test_accented_character_in_filename_is_replaced_with_unaccented_ $this->assertEquals('/futbol-solidario', $outputPath[0]); } - public function test_accented_character_in_filename_is_replaced_with_unaccented_character_when_using_shorthand_path_config() + /** + * @test + */ + public function accented_character_in_filename_is_replaced_with_unaccented_character_when_using_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('Fútbol solidario'); $outputPath = $pathResolver->link('{filename}', $pageVariable); @@ -29,9 +35,12 @@ public function test_accented_character_in_filename_is_replaced_with_unaccented_ $this->assertEquals('/Futbol solidario', $outputPath[0]); } - public function test_accented_character_in_filename_is_replaced_with_unaccented_character_when_using_slugified_shorthand_path_config() + /** + * @test + */ + public function accented_character_in_filename_is_replaced_with_unaccented_character_when_using_slugified_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('Fútbol solidario'); $outputPath = $pathResolver->link('{_filename}', $pageVariable); @@ -39,9 +48,12 @@ public function test_accented_character_in_filename_is_replaced_with_unaccented_ $this->assertEquals('/futbol_solidario', $outputPath[0]); } - public function test_invalid_characters_in_filename_are_removed_when_using_default_path_config() + /** + * @test + */ + public function invalid_characters_in_filename_are_removed_when_using_default_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('Has® Invalid™ Characters'); $outputPath = $pathResolver->link(null, $pageVariable); @@ -49,9 +61,12 @@ public function test_invalid_characters_in_filename_are_removed_when_using_defau $this->assertEquals('/has-invalid-characters', $outputPath[0]); } - public function test_leading_periods_are_not_removed() + /** + * @test + */ + public function leading_periods_are_not_removed() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('.well-known'); $outputPath = $pathResolver->link(null, $pageVariable); @@ -59,9 +74,12 @@ public function test_leading_periods_are_not_removed() $this->assertEquals('/.well-known', $outputPath[0]); } - public function test_invalid_characters_in_filename_are_removed_when_using_shorthand_path_config() + /** + * @test + */ + public function invalid_characters_in_filename_are_removed_when_using_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('Has® Invalid™ Characters'); $outputPath = $pathResolver->link('{filename}', $pageVariable); @@ -69,9 +87,12 @@ public function test_invalid_characters_in_filename_are_removed_when_using_short $this->assertEquals('/Has Invalid Characters', $outputPath[0]); } - public function test_invalid_characters_in_filename_are_removed_when_using_slugified_shorthand_path_config() + /** + * @test + */ + public function invalid_characters_in_filename_are_removed_when_using_slugified_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('Has® Invalid™ Characters'); $outputPath = $pathResolver->link('{_filename}', $pageVariable); @@ -80,9 +101,12 @@ public function test_invalid_characters_in_filename_are_removed_when_using_slugi } // @todo make this consisten in v2 - public function test_some_international_characters_in_filename_are_allowed_when_using_default_path_config() + /** + * @test + */ + public function some_international_characters_in_filename_are_allowed_when_using_default_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('테스트-파일-이름'); $outputPath = $pathResolver->link(null, $pageVariable); @@ -91,9 +115,12 @@ public function test_some_international_characters_in_filename_are_allowed_when_ } // @todo make this consisten in v2 - public function test_some_international_characters_in_filename_are_allowed_when_using_shorthand_path_config() + /** + * @test + */ + public function some_international_characters_in_filename_are_allowed_when_using_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('테스트-파일-이름'); $outputPath = $pathResolver->link('{filename}', $pageVariable); @@ -102,9 +129,12 @@ public function test_some_international_characters_in_filename_are_allowed_when_ } // @todo make this consisten in v2 - public function test_some_international_characters_in_filename_are_allowed_when_using_slugified_shorthand_path_config() + /** + * @test + */ + public function some_international_characters_in_filename_are_allowed_when_using_slugified_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('테스트-파일-이름'); $outputPath = $pathResolver->link('{_filename}', $pageVariable); @@ -113,9 +143,12 @@ public function test_some_international_characters_in_filename_are_allowed_when_ } // @todo make this consisten in v2 - public function test_some_international_characters_in_filename_are_not_allowed_when_using_default_path_config() + /** + * @test + */ + public function some_international_characters_in_filename_are_not_allowed_when_using_default_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('اختبار-مسار-الملف'); $outputPath = $pathResolver->link(null, $pageVariable); @@ -124,9 +157,12 @@ public function test_some_international_characters_in_filename_are_not_allowed_w } // @todo make this consisten in v2 - public function test_some_international_characters_in_filename_are_not_allowed_when_using_shorthand_path_config() + /** + * @test + */ + public function some_international_characters_in_filename_are_not_allowed_when_using_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('اختبار-مسار-الملف'); $outputPath = $pathResolver->link('{filename}', $pageVariable); @@ -135,9 +171,12 @@ public function test_some_international_characters_in_filename_are_not_allowed_w } // @todo make this consisten in v2 - public function test_some_international_characters_in_filename_are_not_allowed_when_using_slugified_shorthand_path_config() + /** + * @test + */ + public function some_international_characters_in_filename_are_not_allowed_when_using_slugified_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('اختبار-مسار-الملف'); $outputPath = $pathResolver->link('{_filename}', $pageVariable); @@ -145,9 +184,12 @@ public function test_some_international_characters_in_filename_are_not_allowed_w $this->assertEquals('/akhtbar_msar_almlf', $outputPath[0]); } - public function test_disable_transliteration_when_using_default_path_config() + /** + * @test + */ + public function disable_transliteration_when_using_default_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('اختبار-مسار-الملف'); $outputPath = $pathResolver->link(null, $pageVariable, false); @@ -155,9 +197,12 @@ public function test_disable_transliteration_when_using_default_path_config() $this->assertEquals('/اختبار-مسار-الملف', $outputPath[0]); } - public function test_disable_transliteration_when_using_shorthand_path_config() + /** + * @test + */ + public function disable_transliteration_when_using_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('اختبار-مسار-الملف'); $outputPath = $pathResolver->link('{filename}', $pageVariable, false); @@ -165,9 +210,12 @@ public function test_disable_transliteration_when_using_shorthand_path_config() $this->assertEquals('/اختبار-مسار-الملف', $outputPath[0]); } - public function test_disable_transliteration_when_using_slugified_shorthand_path_config() + /** + * @test + */ + public function disable_transliteration_when_using_slugified_shorthand_path_config() { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); $pathResolver = $this->app->make(CollectionPathResolver::class); $pageVariable = $this->getPageVariableDummy('اختبار-مسار-الملف'); $outputPath = $pathResolver->link('{_filename}', $pageVariable, false); diff --git a/tests/FilesystemTest.php b/tests/FilesystemTest.php index 8d96d8f4..d8935a2d 100644 --- a/tests/FilesystemTest.php +++ b/tests/FilesystemTest.php @@ -48,7 +48,7 @@ public function DS_Store_is_always_ignored_when_retrieving_all_files_and_directo $files = collect( $this->app->make(Filesystem::class) - ->filesAndDirectories($this->tmp), + ->filesAndDirectories($this->tmp), )->map(function ($file) { return $file->getRelativePathName(); }); @@ -259,7 +259,7 @@ protected function getFilesMatching($match) return collect( $this->app->make(Filesystem::class) - ->filesAndDirectories($this->tmp, $match), + ->filesAndDirectories($this->tmp, $match), )->map(function ($file) { return $file->getRelativePathName(); }); @@ -271,7 +271,7 @@ protected function getFilesExcept($ignore) return collect( $this->app->make(Filesystem::class) - ->filesAndDirectories($this->tmp, null, $ignore), + ->filesAndDirectories($this->tmp, null, $ignore), )->map(function ($file) { return $file->getRelativePathName(); }); diff --git a/tests/InitCommandTest.php b/tests/InitCommandTest.php index 88cb16c9..cb6e09d1 100644 --- a/tests/InitCommandTest.php +++ b/tests/InitCommandTest.php @@ -25,7 +25,7 @@ public function init_command_with_no_arguments_uses_basic_scaffold_for_site() $this->createSource([]); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); @@ -49,7 +49,7 @@ public function init_command_with_argument_uses_preset_scaffold_for_site() $this->createSource([]); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); @@ -66,7 +66,7 @@ public function init_command_with_argument_uses_preset_scaffold_for_site() public function init_command_displays_error_if_preset_name_is_invalid() { $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $console = new CommandTester($command); $console->execute(['preset' => 'invalid']); @@ -80,7 +80,7 @@ public function init_command_displays_warning_if_source_directory_exists() { $this->createSource(['source' => []]); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); @@ -97,7 +97,7 @@ public function init_command_displays_warning_if_config_dot_php_exists() { $this->createSource(['config.php' => '']); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); @@ -121,7 +121,7 @@ public function will_not_build_scaffold_if_site_already_initialized_and_user_cho $this->createSource(['config.php' => '']); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); @@ -147,7 +147,7 @@ public function will_archive_existing_site_if_user_chooses_archive_option() $this->createSource(['config.php' => '']); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); @@ -172,7 +172,7 @@ public function will_build_scaffold_if_site_already_initialized_and_user_chooses $this->createSource(['config.php' => '']); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); @@ -197,7 +197,7 @@ public function will_delete_existing_site_if_user_chooses_delete_option() $this->createSource(['config.php' => '']); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); @@ -222,7 +222,7 @@ public function will_build_scaffold_if_site_already_initialized_and_user_chooses $this->createSource(['config.php' => '']); $command = $this->app->make(InitCommand::class); - $command->setApplication(new Application()); + $command->setApplication(new Application); $command->setBase($this->tmp); $console = new CommandTester($command); diff --git a/tests/IterableObjectTest.php b/tests/IterableObjectTest.php index 093020aa..48cd1b7d 100644 --- a/tests/IterableObjectTest.php +++ b/tests/IterableObjectTest.php @@ -176,4 +176,8 @@ public function intermediate_items_that_extend_IterableObject_are_not_changed_wh } } -class ExtendsIterableObject extends IterableObject {} +// phpcs:disable PSR1.Classes.ClassDeclaration,Squiz.Classes.ClassFileName +class ExtendsIterableObject extends IterableObject +{ +} +// phpcs:enable diff --git a/tests/JigsawMacroTest.php b/tests/JigsawMacroTest.php index 2443a8c8..23433bd4 100644 --- a/tests/JigsawMacroTest.php +++ b/tests/JigsawMacroTest.php @@ -29,6 +29,7 @@ public function jigsaw_mixin_function_calls_successfully() } } +// phpcs:disable PSR1.Classes.ClassDeclaration,Squiz.Classes.ClassFileName class JigsawMixinTestClass { public function getNameMixin() diff --git a/tests/PageDataBindingTest.php b/tests/PageDataBindingTest.php index 3e37fafe..aacd11b5 100644 --- a/tests/PageDataBindingTest.php +++ b/tests/PageDataBindingTest.php @@ -35,6 +35,7 @@ class_alias('Tests\TestPageHeaderComponent', 'Components\PageHeader'); } } +// phpcs:disable PSR1.Classes.ClassDeclaration,Squiz.Classes.ClassFileName class TestPageHeaderComponent extends Component { public $page; diff --git a/tests/PhpOpenTagInMarkdownTest.php b/tests/PhpOpenTagInMarkdownTest.php index af14f702..6feeec5f 100644 --- a/tests/PhpOpenTagInMarkdownTest.php +++ b/tests/PhpOpenTagInMarkdownTest.php @@ -41,6 +41,6 @@ public function blade_md_hybrid_files_containing_php_open_tag_are_processed() protected function getPageDataDummy() { - return PageData::withPageMetaData(new IterableObject(), []); + return PageData::withPageMetaData(new IterableObject, []); } } diff --git a/tests/PresetScaffoldBuilderTest.php b/tests/PresetScaffoldBuilderTest.php index 55b3e3c9..9048a289 100644 --- a/tests/PresetScaffoldBuilderTest.php +++ b/tests/PresetScaffoldBuilderTest.php @@ -61,12 +61,13 @@ public function named_preset_resolves_to_vendor_package_path_if_not_predefined() /** * @test + * * @doesNotPerformAssertions */ public function package_is_loaded_via_composer_if_not_found_locally() { $process = Mockery::spy(ProcessRunner::class); - $this->app->instance(PresetPackage::class, new PresetPackage(new DefaultInstaller(), new CustomInstaller(), $process)); + $this->app->instance(PresetPackage::class, new PresetPackage(new DefaultInstaller, new CustomInstaller, $process)); $preset = $this->app->make(PresetScaffoldBuilder::class); $this->createSource(['vendor' => ['test' => ['package' => []]]]); $preset->base = $this->tmp; @@ -126,6 +127,7 @@ public function exception_is_thrown_if_package_init_file_contains_errors() /** * @test + * * @doesNotPerformAssertions */ public function init_file_of_array_type_is_loaded() @@ -157,6 +159,7 @@ public function init_file_of_array_type_is_loaded() /** * @test + * * @doesNotPerformAssertions */ public function init_file_of_php_type_is_loaded() @@ -191,6 +194,7 @@ public function init_file_of_php_type_is_loaded() /** * @test + * * @doesNotPerformAssertions */ public function init_file_is_optional() diff --git a/tests/SnapshotsTest.php b/tests/SnapshotsTest.php index 77452c0b..a055320c 100644 --- a/tests/SnapshotsTest.php +++ b/tests/SnapshotsTest.php @@ -40,7 +40,9 @@ public function snapshots(): array /** * @test + * * @group snapshots + * * @dataProvider snapshots */ public function build(string $name) diff --git a/tests/TestCase.php b/tests/TestCase.php index 53a4fdd1..c00ffd82 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -57,14 +57,6 @@ protected function setUp(): void ]; } - protected function createTmp(): void - { - mkdir($this->tmp = __DIR__ . '/fixtures/tmp/' . static::haiku()); - - // TODO this creates Jigsaw's cache directory in the root of this repo - $this->filesystem->ensureDirectoryExists(app()->cachePath()); - } - protected function tearDown(): void { if ($this->app) { @@ -98,6 +90,45 @@ public function getInputFile($filename) return new InputFile($sourceFile, $this->sourcePath); } + public function buildSite($vfs = null, $config = [], $pretty = false, $viewPath = '/source') + { + $this->app->consoleOutput->setup($verbosity = -1); + $this->app->config = collect($this->app->config)->merge($config); + + if ($collections = value($this->app->config->get('collections'))) { + $this->app->config->put('collections', collect($collections)->flatMap(function ($value, $key) { + return is_array($value) ? [$key => $value] : [$value => []]; + })); + } + + $this->app->buildPath = [ + 'source' => "{$this->tmp}/source", + 'views' => "{$this->tmp}/{$viewPath}", + 'destination' => "{$this->tmp}/build", + ]; + + if ($pretty) { + $this->app->instance('outputPathResolver', new PrettyOutputPathResolver); + } + + return $this->app + ->make(Jigsaw::class) + ->build('test'); + } + + public function clean($output) + { + return str_replace("\n", '', $output); + } + + protected function createTmp(): void + { + mkdir($this->tmp = __DIR__ . '/fixtures/tmp/' . static::haiku()); + + // TODO this creates Jigsaw's cache directory in the root of this repo + $this->filesystem->ensureDirectoryExists(app()->cachePath()); + } + protected function tmpPath(string $path): string { return "{$this->tmp}/{$path}"; @@ -110,10 +141,12 @@ protected function setupSource($source = []) { $this->createSource(['source' => $source]); - return new class($this->tmpPath('')) { + return new class($this->tmpPath('')) + { public function __construct( protected string $tmp, - ) {} + ) { + } public function hasChild($path) { @@ -122,11 +155,13 @@ public function hasChild($path) public function getChild($path) { - return new class($this->tmp, $path) { + return new class($this->tmp, $path) + { public function __construct( protected string $tmp, protected string $path, - ) {} + ) { + } public function getContent() { @@ -173,37 +208,6 @@ protected function buildSiteData($vfs = null, $config = []) return $siteData->addCollectionData($collectionData); } - public function buildSite($vfs = null, $config = [], $pretty = false, $viewPath = '/source') - { - $this->app->consoleOutput->setup($verbosity = -1); - $this->app->config = collect($this->app->config)->merge($config); - - if ($collections = value($this->app->config->get('collections'))) { - $this->app->config->put('collections', collect($collections)->flatMap(function ($value, $key) { - return is_array($value) ? [$key => $value] : [$value => []]; - })); - } - - $this->app->buildPath = [ - 'source' => "{$this->tmp}/source", - 'views' => "{$this->tmp}/{$viewPath}", - 'destination' => "{$this->tmp}/build", - ]; - - if ($pretty) { - $this->app->instance('outputPathResolver', new PrettyOutputPathResolver()); - } - - return $this->app - ->make(Jigsaw::class) - ->build('test'); - } - - public function clean($output) - { - return str_replace("\n", '', $output); - } - protected function fixDirectorySlashes(string $path): string { return str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path); diff --git a/tests/ViewPathTest.php b/tests/ViewPathTest.php index 113936d8..9741604f 100644 --- a/tests/ViewPathTest.php +++ b/tests/ViewPathTest.php @@ -9,7 +9,7 @@ public function can_load_views_from_custom_path() { $this->createSource([ 'source' => [ - 'page.md' => << <<<'MD' --- extends: main --- @@ -17,7 +17,7 @@ public function can_load_views_from_custom_path() MD, ], 'views' => [ - 'main.blade.php' => << <<<'BLADE' @yield('content') @@ -27,7 +27,7 @@ public function can_load_views_from_custom_path() $this->buildSite(null, [], false, '/views'); - $this->assertOutputFile('build/page.html', <<assertOutputFile('build/page.html', <<<'HTML'

Hello world!

diff --git a/tests/rebuild.php b/tests/rebuild.php index 0402d374..6b977204 100644 --- a/tests/rebuild.php +++ b/tests/rebuild.php @@ -22,5 +22,4 @@ function removeDirectory($path) rmdir($path); - return; -} + }