From 704e11f357dd5911b7a142076f41dad672656e84 Mon Sep 17 00:00:00 2001 From: Stefan Mielke Date: Fri, 26 Jan 2024 08:38:21 +0100 Subject: [PATCH 001/202] Add option to change number of threads for imagemagick convert --- src/Image/Darkroom/ImageMagick.php | 5 +++-- tests/Image/Darkroom/ImageMagickTest.php | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Image/Darkroom/ImageMagick.php b/src/Image/Darkroom/ImageMagick.php index 49892368e0..8e65e5412b 100644 --- a/src/Image/Darkroom/ImageMagick.php +++ b/src/Image/Darkroom/ImageMagick.php @@ -62,8 +62,8 @@ protected function convert(string $file, array $options): string { $command = escapeshellarg($options['bin']); - // limit to single-threading to keep CPU usage sane - $command .= ' -limit thread 1'; + // default is limiting to single-threading to keep CPU usage sane + $command .= ' -limit thread ' . escapeshellarg($options['thread']); // add JPEG size hint to optimize CPU and memory usage if (F::mime($file) === 'image/jpeg') { @@ -85,6 +85,7 @@ protected function defaults(): array return parent::defaults() + [ 'bin' => 'convert', 'interlace' => false, + 'thread' => 1, ]; } diff --git a/tests/Image/Darkroom/ImageMagickTest.php b/tests/Image/Darkroom/ImageMagickTest.php index 9d04f3f05c..c7baec5ebc 100644 --- a/tests/Image/Darkroom/ImageMagickTest.php +++ b/tests/Image/Darkroom/ImageMagickTest.php @@ -45,6 +45,7 @@ public function testProcess() 'width' => 500, 'bin' => 'convert', 'interlace' => false, + 'thread' => 1, 'sourceWidth' => 500, 'sourceHeight' => 500 ], $im->process($file)); From b83dfeb5157a57d9873ab2b142d60cd218d3abba Mon Sep 17 00:00:00 2001 From: Stefan Mielke Date: Tue, 30 Jan 2024 12:33:21 +0100 Subject: [PATCH 002/202] rename option to threads --- src/Image/Darkroom/ImageMagick.php | 4 ++-- tests/Image/Darkroom/ImageMagickTest.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Image/Darkroom/ImageMagick.php b/src/Image/Darkroom/ImageMagick.php index 8e65e5412b..1c0f281bc6 100644 --- a/src/Image/Darkroom/ImageMagick.php +++ b/src/Image/Darkroom/ImageMagick.php @@ -63,7 +63,7 @@ protected function convert(string $file, array $options): string $command = escapeshellarg($options['bin']); // default is limiting to single-threading to keep CPU usage sane - $command .= ' -limit thread ' . escapeshellarg($options['thread']); + $command .= ' -limit thread ' . escapeshellarg($options['threads']); // add JPEG size hint to optimize CPU and memory usage if (F::mime($file) === 'image/jpeg') { @@ -85,7 +85,7 @@ protected function defaults(): array return parent::defaults() + [ 'bin' => 'convert', 'interlace' => false, - 'thread' => 1, + 'threads' => 1, ]; } diff --git a/tests/Image/Darkroom/ImageMagickTest.php b/tests/Image/Darkroom/ImageMagickTest.php index c7baec5ebc..2b2718ad44 100644 --- a/tests/Image/Darkroom/ImageMagickTest.php +++ b/tests/Image/Darkroom/ImageMagickTest.php @@ -45,7 +45,7 @@ public function testProcess() 'width' => 500, 'bin' => 'convert', 'interlace' => false, - 'thread' => 1, + 'threads' => 1, 'sourceWidth' => 500, 'sourceHeight' => 500 ], $im->process($file)); From 53143ecf5dc7c40f40a27359920a3e9d7c3195e8 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 15:12:38 +0100 Subject: [PATCH 003/202] Fix `A::prepend()` --- src/Toolkit/A.php | 2 +- tests/Toolkit/ATest.php | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Toolkit/A.php b/src/Toolkit/A.php index 850fb5cf48..a62d9c2a55 100644 --- a/src/Toolkit/A.php +++ b/src/Toolkit/A.php @@ -588,7 +588,7 @@ public static function pluck(array $array, string $key): array */ public static function prepend(array $array, array $prepend): array { - return $prepend + $array; + return static::merge($prepend, $array, A::MERGE_APPEND); } /** diff --git a/tests/Toolkit/ATest.php b/tests/Toolkit/ATest.php index 0507108c0f..8ea33567cf 100644 --- a/tests/Toolkit/ATest.php +++ b/tests/Toolkit/ATest.php @@ -496,6 +496,30 @@ public function testMergeModes() $this->assertSame($expected, $result); } + /** + * @covers ::prepend + */ + public function testPrepend() + { + // associative + $one = ['a' => 'A', 'b' => 'B', 'c' => 'C']; + $two = ['d' => 'D', 'e' => 'E', 'f' => 'F']; + $result = A::prepend($one, $two); + $this->assertSame(['d' => 'D', 'e' => 'E', 'f' => 'F', 'a' => 'A', 'b' => 'B', 'c' => 'C'], $result); + + // numeric + $one = ['a', 'b', 'c']; + $two = ['d', 'e', 'f']; + $result = A::prepend($one, $two); + $this->assertSame(['d', 'e', 'f', 'a', 'b', 'c'], $result); + + // mixed + $one = ['a' => 'A', 'b' => 'B', 'c' => 'C']; + $two = ['d', 'e', 'f']; + $result = A::prepend($one, $two); + $this->assertSame(['d', 'e', 'f', 'a' => 'A', 'b' => 'B', 'c' => 'C'], $result); + } + /** * @covers ::pluck */ From 98dbc5e2e6c66b765ab94294555b8f6329028a42 Mon Sep 17 00:00:00 2001 From: Lukas Bestle Date: Wed, 31 Jan 2024 19:30:51 +0100 Subject: [PATCH 004/202] Fix coding style --- src/Image/Darkroom/ImageMagick.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Image/Darkroom/ImageMagick.php b/src/Image/Darkroom/ImageMagick.php index 1c0f281bc6..ecac0f390f 100644 --- a/src/Image/Darkroom/ImageMagick.php +++ b/src/Image/Darkroom/ImageMagick.php @@ -85,7 +85,7 @@ protected function defaults(): array return parent::defaults() + [ 'bin' => 'convert', 'interlace' => false, - 'threads' => 1, + 'threads' => 1, ]; } From 69810e29e734a57f2e90204dc66813c6c6e3192c Mon Sep 17 00:00:00 2001 From: Ahmet Bora Date: Thu, 1 Feb 2024 21:43:49 +0300 Subject: [PATCH 005/202] Translatable range tooltip #6221 --- config/fields/range.php | 9 ++++++ tests/Form/Fields/RangeFieldTest.php | 46 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/config/fields/range.php b/config/fields/range.php index 04221f1372..d203a7e77e 100644 --- a/config/fields/range.php +++ b/config/fields/range.php @@ -1,5 +1,7 @@ 'number', 'props' => [ @@ -18,6 +20,13 @@ * Enables/disables the tooltip and set the before and after values */ 'tooltip' => function ($tooltip = true) { + if (is_array($tooltip) === true) { + $after = $tooltip['after'] ?? null; + $before = $tooltip['before'] ?? null; + $tooltip['after'] = I18n::translate($after, $after); + $tooltip['before'] = I18n::translate($before, $before); + } + return $tooltip; }, ] diff --git a/tests/Form/Fields/RangeFieldTest.php b/tests/Form/Fields/RangeFieldTest.php index fea86e624b..ccf973ffd1 100644 --- a/tests/Form/Fields/RangeFieldTest.php +++ b/tests/Form/Fields/RangeFieldTest.php @@ -2,6 +2,8 @@ namespace Kirby\Form\Fields; +use Kirby\Toolkit\I18n; + class RangeFieldTest extends TestCase { public function testDefaultProps() @@ -40,4 +42,48 @@ public function testMax() $this->assertFalse($field->isValid()); $this->assertArrayHasKey('max', $field->errors()); } + + public function testTooltip() + { + $field = $this->field('range', [ + 'tooltip' => [ + 'before' => 'per', + 'after' => 'months' + ] + ]); + + $tooltip = $field->tooltip(); + $this->assertIsArray($tooltip); + $this->assertSame('per', $tooltip['before']); + $this->assertSame('months', $tooltip['after']); + } + + public function testTooltipTranslation() + { + $props = [ + 'tooltip' => [ + 'before' => [ + 'en' => 'per', + 'de' => 'pro' + ], + 'after' => [ + 'en' => 'months', + 'de' => 'monate' + ] + ] + ]; + + I18n::$locale = 'en'; + $tooltip = $this->field('range', $props)->tooltip(); + $this->assertIsArray($tooltip); + $this->assertSame('per', $tooltip['before']); + $this->assertSame('months', $tooltip['after']); + + + I18n::$locale = 'de'; + $tooltip = $this->field('range', $props)->tooltip(); + $this->assertIsArray($tooltip); + $this->assertSame('pro', $tooltip['before']); + $this->assertSame('monate', $tooltip['after']); + } } From da033a3a3a1596e46fc807416d4a13e9993c9913 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Thu, 25 Jan 2024 20:24:48 +0100 Subject: [PATCH 006/202] Improve input disabled styles --- panel/src/components/Forms/Field/LinkField.vue | 5 +++-- panel/src/components/Forms/Input/ChoiceInput.vue | 11 ++++++++++- panel/src/components/Forms/Input/DateInput.vue | 9 ++++++++- panel/src/components/Forms/Input/TextInput.vue | 10 +++++++++- panel/src/components/Forms/Input/ToggleInput.vue | 1 + 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/panel/src/components/Forms/Field/LinkField.vue b/panel/src/components/Forms/Field/LinkField.vue index 986f06e7a7..dc2def4a7b 100644 --- a/panel/src/components/Forms/Field/LinkField.vue +++ b/panel/src/components/Forms/Field/LinkField.vue @@ -29,7 +29,7 @@ :value="value" @remove="removeModel" > - - - diff --git a/panel/lab/internals/panel/translation/index.vue b/panel/lab/internals/panel/translation/index.vue index 2964505801..7d96d176bf 100644 --- a/panel/lab/internals/panel/translation/index.vue +++ b/panel/lab/internals/panel/translation/index.vue @@ -39,12 +39,3 @@ - - diff --git a/panel/lab/internals/panel/upload/index.vue b/panel/lab/internals/panel/upload/index.vue index fe88951dc1..70df640d82 100644 --- a/panel/lab/internals/panel/upload/index.vue +++ b/panel/lab/internals/panel/upload/index.vue @@ -78,12 +78,3 @@ - - diff --git a/panel/lab/internals/panel/urls/index.vue b/panel/lab/internals/panel/urls/index.vue index b4a3dc2ccf..8bca2fd886 100644 --- a/panel/lab/internals/panel/urls/index.vue +++ b/panel/lab/internals/panel/urls/index.vue @@ -20,12 +20,3 @@ - - diff --git a/panel/lab/internals/panel/user/index.vue b/panel/lab/internals/panel/user/index.vue index cd7ef5cf38..38cc037aca 100644 --- a/panel/lab/internals/panel/user/index.vue +++ b/panel/lab/internals/panel/user/index.vue @@ -49,12 +49,3 @@ - - diff --git a/panel/lab/internals/panel/view/index.vue b/panel/lab/internals/panel/view/index.vue index d683b7c834..e9b833bf1b 100644 --- a/panel/lab/internals/panel/view/index.vue +++ b/panel/lab/internals/panel/view/index.vue @@ -185,12 +185,3 @@ - - diff --git a/panel/src/components/Lab/PlaygroundView.vue b/panel/src/components/Lab/PlaygroundView.vue index e5fe4b7d64..913377d26c 100644 --- a/panel/src/components/Lab/PlaygroundView.vue +++ b/panel/src/components/Lab/PlaygroundView.vue @@ -126,6 +126,13 @@ export default { margin-bottom: 0; } +.k-lab-examples h2 { + margin-bottom: var(--spacing-6); +} +.k-lab-examples * + h2 { + margin-top: var(--spacing-12); +} + .k-lab-input-examples .k-lab-example-canvas:has(:invalid) { outline: 2px solid var(--color-red-500); outline-offset: -2px; diff --git a/panel/src/helpers/array.js b/panel/src/helpers/array.js index 4210b129d7..a54c94de09 100644 --- a/panel/src/helpers/array.js +++ b/panel/src/helpers/array.js @@ -2,6 +2,8 @@ import sort from "./sort"; import "./regex"; /** + * Creates an array from an object + * * @param {Array|Object} object * @returns {Array} */ From 0373e4ffcb3d03fee8b57b5d37abb1831906c8db Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 12:18:51 +0100 Subject: [PATCH 061/202] Clean up `Dir::inventory()` methods --- src/Filesystem/Dir.php | 120 +++++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 53 deletions(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index c03fe8cccf..5bf086c017 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -220,71 +220,58 @@ public static function inventory( array|null $contentIgnore = null, bool $multilang = false ): array { - $dir = realpath($dir); - $inventory = [ 'children' => [], 'files' => [], 'template' => 'default', ]; + $dir = realpath($dir); + if ($dir === false) { return $inventory; } - $items = static::read($dir, $contentIgnore); - // a temporary store for all content files $content = []; - // sort all items naturally to avoid sorting issues later + // read and sort all items naturally to avoid sorting issues later + $items = static::read($dir, $contentIgnore); natsort($items); foreach ($items as $item) { - // ignore all items with a leading dot + // ignore all items with a leading dot or underscore if (in_array(substr($item, 0, 1), ['.', '_']) === true) { continue; } $root = $dir . '/' . $item; + // collect all directories as children if (is_dir($root) === true) { - // extract the slug and num of the directory - if (preg_match('/^([0-9]+)' . static::$numSeparator . '(.*)$/', $item, $match)) { - $num = (int)$match[1]; - $slug = $match[2]; - } else { - $num = null; - $slug = $item; - } + $inventory['children'][] = static::inventoryChild($item, $root); + continue; + } - $inventory['children'][] = [ - 'dirname' => $item, - 'model' => null, - 'num' => $num, - 'root' => $root, - 'slug' => $slug, - ]; - } else { - $extension = pathinfo($item, PATHINFO_EXTENSION); + $extension = pathinfo($item, PATHINFO_EXTENSION); - switch ($extension) { - case 'htm': - case 'html': - case 'php': - // don't track those files - break; - case $contentExtension: - $content[] = pathinfo($item, PATHINFO_FILENAME); - break; - default: - $inventory['files'][$item] = [ - 'filename' => $item, - 'extension' => $extension, - 'root' => $root, - ]; - } + // don't track files with these extensions + if (in_array($extension, ['htm', 'html', 'php']) === true) { + continue; } + + // collect all content files separately + if ($extension === $contentExtension) { + $content[] = pathinfo($item, PATHINFO_FILENAME); + continue; + } + + // collect all other files + $inventory['files'][$item] = [ + 'filename' => $item, + 'extension' => $extension, + 'root' => $root, + ]; } // remove the language codes from all content filenames @@ -303,26 +290,48 @@ public static function inventory( } /** - * Take all content files, - * remove those who are meta files and - * detect the main content file + * Collect information for a child for the inventory */ - protected static function inventoryContent(array $inventory, array $content): array - { - // filter meta files from the content file + protected static function inventoryChild( + string $item, + string $root + ): array { + // extract the slug and num of the directory + if (preg_match('/^([0-9]+)' . static::$numSeparator . '(.*)$/', $item, $match)) { + $num = (int)$match[1]; + $slug = $match[2]; + } + + return [ + 'dirname' => $item, + 'model' => null, + 'num' => $num ?? null, + 'root' => $root, + 'slug' => $slug ?? $item, + ]; + } + + /** + * Take all content files, remove those who are meta files + * and detect the main content file + */ + protected static function inventoryContent( + array $inventory, + array $content + ): array { + // if no content files are found,apply default template if (empty($content) === true) { - $inventory['template'] = 'default'; - return $inventory; + return [...$inventory, 'template' => 'default']; } - foreach ($content as $contentName) { - // could be a meta file. i.e. cover.jpg - if (isset($inventory['files'][$contentName]) === true) { + foreach ($content as $name) { + // is a meta file corresponding to an actual file, i.e. cover.jpg + if (isset($inventory['files'][$name]) === true) { continue; } // it's most likely the template - $inventory['template'] = $contentName; + $inventory['template'] = $name; } return $inventory; @@ -337,17 +346,22 @@ protected static function inventoryModels( string $contentExtension, bool $multilang = false ): array { + $models = array_keys(Page::$models); + // inject models if ( empty($inventory['children']) === false && - empty(Page::$models) === false + empty($models) === false ) { if ($multilang === true) { $contentExtension = App::instance()->defaultLanguage()->code() . '.' . $contentExtension; } + // for each child, try to find a model foreach ($inventory['children'] as $key => $child) { - foreach (Page::$models as $modelName => $modelClass) { + // look if a content file can be found + // for any of the available models + foreach ($models as $modelName) { if (file_exists($child['root'] . '/' . $modelName . '.' . $contentExtension) === true) { $inventory['children'][$key]['model'] = $modelName; break; From 787a5e1a8d4d45b54b628c66bbb4824e34352c69 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 12:23:23 +0100 Subject: [PATCH 062/202] Add more unit tests for `Dir::inventory()` --- tests/Filesystem/DirTest.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/Filesystem/DirTest.php b/tests/Filesystem/DirTest.php index 25a75e2572..0b142e6962 100644 --- a/tests/Filesystem/DirTest.php +++ b/tests/Filesystem/DirTest.php @@ -280,7 +280,9 @@ public function testInventory() '2_project-b', 'cover.jpg', 'cover.jpg.txt', - 'projects.txt' + 'projects.txt', + '_ignore.txt', + '.invisible' ]); $this->assertSame('project-a', $inventory['children'][0]['slug']); @@ -291,6 +293,8 @@ public function testInventory() $this->assertSame('cover.jpg', $inventory['files']['cover.jpg']['filename']); $this->assertSame('jpg', $inventory['files']['cover.jpg']['extension']); + $this->assertArrayNotHasKey('_ignore.txt', $inventory['files']); + $this->assertArrayNotHasKey('.invisible', $inventory['files']); $this->assertSame('projects', $inventory['template']); } From 2270836ff6316d092a9c179280608456f126b87d Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 12:30:16 +0100 Subject: [PATCH 063/202] =?UTF-8?q?`Dir::=20inventoryContent`=E2=86=92=20`?= =?UTF-8?q?Dir::inventoryTemplate`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Filesystem/Dir.php | 55 ++++++++++++++++-------------------- tests/Filesystem/DirTest.php | 5 ++++ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index 5bf086c017..8e0f5a2772 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -283,10 +283,10 @@ public static function inventory( $content = array_unique($content); } - $inventory = static::inventoryContent($inventory, $content); - $inventory = static::inventoryModels($inventory, $contentExtension, $multilang); - - return $inventory; + return [ + ...static::inventoryModels($inventory, $contentExtension, $multilang), + 'template' => static::inventoryTemplate($content, $inventory['files']) + ]; } /** @@ -311,32 +311,6 @@ protected static function inventoryChild( ]; } - /** - * Take all content files, remove those who are meta files - * and detect the main content file - */ - protected static function inventoryContent( - array $inventory, - array $content - ): array { - // if no content files are found,apply default template - if (empty($content) === true) { - return [...$inventory, 'template' => 'default']; - } - - foreach ($content as $name) { - // is a meta file corresponding to an actual file, i.e. cover.jpg - if (isset($inventory['files'][$name]) === true) { - continue; - } - - // it's most likely the template - $inventory['template'] = $name; - } - - return $inventory; - } - /** * Go through all inventory children * and inject a model for each @@ -373,6 +347,27 @@ protected static function inventoryModels( return $inventory; } + /** + * Determines the main template for the inventory + * from all collected content files, ignory file meta files + */ + protected static function inventoryTemplate( + array $content, + array $files, + ): string { + foreach ($content as $name) { + // is a meta file corresponding to an actual file, i.e. cover.jpg + if (isset($files[$name]) === true) { + continue; + } + + // it's most likely the template + $template = $name; + } + + return $template ?? 'default'; + } + /** * Create a (symbolic) link to a directory */ diff --git a/tests/Filesystem/DirTest.php b/tests/Filesystem/DirTest.php index 0b142e6962..a8015fd57d 100644 --- a/tests/Filesystem/DirTest.php +++ b/tests/Filesystem/DirTest.php @@ -375,6 +375,7 @@ public function testInventoryFileSorting() /** * @covers ::inventory + * @covers ::inventoryTemplate */ public function testInventoryMissingTemplate() { @@ -389,6 +390,7 @@ public function testInventoryMissingTemplate() /** * @covers ::inventory + * @covers ::inventoryTemplate */ public function testInventoryTemplateWithDotInFilename() { @@ -404,6 +406,7 @@ public function testInventoryTemplateWithDotInFilename() /** * @covers ::inventory + * @covers ::inventoryTemplate */ public function testInventoryExtension() { @@ -419,6 +422,7 @@ public function testInventoryExtension() /** * @covers ::inventory + * @covers ::inventoryTemplate */ public function testInventoryIgnore() { @@ -433,6 +437,7 @@ public function testInventoryIgnore() /** * @covers ::inventory + * @covers ::inventoryTemplate */ public function testInventoryMultilang() { From af4af8daba4e05f5814d43506d22cb9ef020b438 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 12:52:12 +0100 Subject: [PATCH 064/202] Revert less performant code change --- src/Filesystem/Dir.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index 8e0f5a2772..f3b051a9cd 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -320,12 +320,10 @@ protected static function inventoryModels( string $contentExtension, bool $multilang = false ): array { - $models = array_keys(Page::$models); - // inject models if ( empty($inventory['children']) === false && - empty($models) === false + empty(Page::$models) === false ) { if ($multilang === true) { $contentExtension = App::instance()->defaultLanguage()->code() . '.' . $contentExtension; @@ -335,7 +333,7 @@ protected static function inventoryModels( foreach ($inventory['children'] as $key => $child) { // look if a content file can be found // for any of the available models - foreach ($models as $modelName) { + foreach (Page::$models as $modelName => $modelClass) { if (file_exists($child['root'] . '/' . $modelName . '.' . $contentExtension) === true) { $inventory['children'][$key]['model'] = $modelName; break; From 894e5b646253c51c8d02d6588ad729ba0a1f6341 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 13:21:40 +0100 Subject: [PATCH 065/202] Add performance testing --- composer.json | 2 +- performance/Filesystem/DirBench.php | 72 +++++++++++++++++++ .../fixtures/inventory/models/a/a.txt | 0 .../fixtures/inventory/models/b/b.txt | 0 .../fixtures/inventory/models/b/d/d.txt | 0 .../fixtures/inventory/models/c/c.txt | 0 .../fixtures/inventory/models/e/e.txt | 0 .../fixtures/inventory/models/f/f.txt | 0 .../fixtures/inventory/models/g/g.txt | 0 .../fixtures/inventory/models/h/h.txt | 0 .../fixtures/inventory/models/i/i.txt | 0 .../fixtures/inventory/models/j/j.txt | 0 .../fixtures/inventory/models/k/k.txt | 0 .../fixtures/inventory/models/l/l.txt | 0 .../fixtures/inventory/models/m/m.txt | 0 .../fixtures/inventory/models/n/n.txt | 0 .../fixtures/inventory/models/o/o.txt | 0 .../fixtures/inventory/models/p/p.txt | 0 .../fixtures/inventory/models/q/q.txt | 0 .../fixtures/inventory/models/r/r.txt | 0 .../fixtures/inventory/models/s/s.txt | 0 .../fixtures/inventory/models/t/t.txt | 0 .../fixtures/inventory/models/u/u.txt | 0 .../fixtures/inventory/models/v/v.txt | 0 .../fixtures/inventory/models/w/w.txt | 0 .../fixtures/inventory/models/x/x.txt | 0 .../fixtures/inventory/models/y/y.txt | 0 .../fixtures/inventory/models/z/z.txt | 0 performance/bootstrap.php | 3 + 29 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 performance/Filesystem/DirBench.php create mode 100644 performance/Filesystem/fixtures/inventory/models/a/a.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/b/b.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/b/d/d.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/c/c.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/e/e.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/f/f.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/g/g.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/h/h.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/i/i.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/j/j.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/k/k.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/l/l.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/m/m.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/n/n.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/o/o.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/p/p.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/q/q.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/r/r.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/s/s.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/t/t.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/u/u.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/v/v.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/w/w.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/x/x.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/y/y.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/z/z.txt create mode 100644 performance/bootstrap.php diff --git a/composer.json b/composer.json index e8293c5f77..8f7d5f9619 100644 --- a/composer.json +++ b/composer.json @@ -90,7 +90,6 @@ ] }, "scripts": { - "post-update-cmd": "curl -o cacert.pem https://curl.se/ca/cacert.pem", "analyze": [ "@analyze:composer", "@analyze:psalm", @@ -108,6 +107,7 @@ "@test" ], "fix": "php-cs-fixer fix", + "post-update-cmd": "curl -o cacert.pem https://curl.se/ca/cacert.pem", "test": "phpunit", "test:coverage": "XDEBUG_MODE=coverage phpunit --coverage-html=tests/coverage", "zip": "composer archive --format=zip --file=dist" diff --git a/performance/Filesystem/DirBench.php b/performance/Filesystem/DirBench.php new file mode 100644 index 0000000000..03f37aaf9f --- /dev/null +++ b/performance/Filesystem/DirBench.php @@ -0,0 +1,72 @@ + 'A' + ]; + + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + Page::$models = []; + } + + public function benchInventoryTwoModels() + { + Page::$models = [ + 'a' => 'A', + 'b' => 'B' + ]; + + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + Page::$models = []; + } + + public function benchInventoryManyModels() + { + Page::$models = [ + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z' + ]; + + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + Page::$models = []; + } +} diff --git a/performance/Filesystem/fixtures/inventory/models/a/a.txt b/performance/Filesystem/fixtures/inventory/models/a/a.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/b/b.txt b/performance/Filesystem/fixtures/inventory/models/b/b.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/b/d/d.txt b/performance/Filesystem/fixtures/inventory/models/b/d/d.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/c/c.txt b/performance/Filesystem/fixtures/inventory/models/c/c.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/e/e.txt b/performance/Filesystem/fixtures/inventory/models/e/e.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/f/f.txt b/performance/Filesystem/fixtures/inventory/models/f/f.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/g/g.txt b/performance/Filesystem/fixtures/inventory/models/g/g.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/h/h.txt b/performance/Filesystem/fixtures/inventory/models/h/h.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/i/i.txt b/performance/Filesystem/fixtures/inventory/models/i/i.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/j/j.txt b/performance/Filesystem/fixtures/inventory/models/j/j.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/k/k.txt b/performance/Filesystem/fixtures/inventory/models/k/k.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/l/l.txt b/performance/Filesystem/fixtures/inventory/models/l/l.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/m/m.txt b/performance/Filesystem/fixtures/inventory/models/m/m.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/n/n.txt b/performance/Filesystem/fixtures/inventory/models/n/n.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/o/o.txt b/performance/Filesystem/fixtures/inventory/models/o/o.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/p/p.txt b/performance/Filesystem/fixtures/inventory/models/p/p.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/q/q.txt b/performance/Filesystem/fixtures/inventory/models/q/q.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/r/r.txt b/performance/Filesystem/fixtures/inventory/models/r/r.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/s/s.txt b/performance/Filesystem/fixtures/inventory/models/s/s.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/t/t.txt b/performance/Filesystem/fixtures/inventory/models/t/t.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/u/u.txt b/performance/Filesystem/fixtures/inventory/models/u/u.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/v/v.txt b/performance/Filesystem/fixtures/inventory/models/v/v.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/w/w.txt b/performance/Filesystem/fixtures/inventory/models/w/w.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/x/x.txt b/performance/Filesystem/fixtures/inventory/models/x/x.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/y/y.txt b/performance/Filesystem/fixtures/inventory/models/y/y.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/z/z.txt b/performance/Filesystem/fixtures/inventory/models/z/z.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/bootstrap.php b/performance/bootstrap.php new file mode 100644 index 0000000000..6c8c4f51b9 --- /dev/null +++ b/performance/bootstrap.php @@ -0,0 +1,3 @@ + Date: Sun, 21 Jan 2024 13:30:24 +0100 Subject: [PATCH 066/202] =?UTF-8?q?Merge=20`Dir::inventoryModels`=20?= =?UTF-8?q?=E2=86=92=20=20`::inventoryChild`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Filesystem/Dir.php | 78 ++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 44 deletions(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index f3b051a9cd..da5e3d2b8c 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -249,7 +249,12 @@ public static function inventory( // collect all directories as children if (is_dir($root) === true) { - $inventory['children'][] = static::inventoryChild($item, $root); + $inventory['children'][] = static::inventoryChild( + $item, + $root, + $contentExtension, + $multilang + ); continue; } @@ -262,7 +267,14 @@ public static function inventory( // collect all content files separately if ($extension === $contentExtension) { - $content[] = pathinfo($item, PATHINFO_FILENAME); + $filename = pathinfo($item, PATHINFO_FILENAME); + + // remove the language codes from all content filenames + if ($multilang === true) { + $filename = pathinfo($filename, PATHINFO_FILENAME); + } + + $content[] = $filename; continue; } @@ -274,17 +286,10 @@ public static function inventory( ]; } - // remove the language codes from all content filenames - if ($multilang === true) { - foreach ($content as $key => $filename) { - $content[$key] = pathinfo($filename, PATHINFO_FILENAME); - } - - $content = array_unique($content); - } + $content = array_unique($content); return [ - ...static::inventoryModels($inventory, $contentExtension, $multilang), + ...$inventory, 'template' => static::inventoryTemplate($content, $inventory['files']) ]; } @@ -294,7 +299,9 @@ public static function inventory( */ protected static function inventoryChild( string $item, - string $root + string $root, + string $contentExtension = 'txt', + bool $multilang = false ): array { // extract the slug and num of the directory if (preg_match('/^([0-9]+)' . static::$numSeparator . '(.*)$/', $item, $match)) { @@ -302,47 +309,30 @@ protected static function inventoryChild( $slug = $match[2]; } - return [ - 'dirname' => $item, - 'model' => null, - 'num' => $num ?? null, - 'root' => $root, - 'slug' => $slug ?? $item, - ]; - } - - /** - * Go through all inventory children - * and inject a model for each - */ - protected static function inventoryModels( - array $inventory, - string $contentExtension, - bool $multilang = false - ): array { + // determine the model // inject models - if ( - empty($inventory['children']) === false && - empty(Page::$models) === false - ) { + if (empty(Page::$models) === false) { if ($multilang === true) { $contentExtension = App::instance()->defaultLanguage()->code() . '.' . $contentExtension; } - // for each child, try to find a model - foreach ($inventory['children'] as $key => $child) { - // look if a content file can be found - // for any of the available models - foreach (Page::$models as $modelName => $modelClass) { - if (file_exists($child['root'] . '/' . $modelName . '.' . $contentExtension) === true) { - $inventory['children'][$key]['model'] = $modelName; - break; - } + // look if a content file can be found + // for any of the available models + foreach (Page::$models as $modelName => $modelClass) { + if (file_exists($root . '/' . $modelName . '.' . $contentExtension) === true) { + $model = $modelName; + break; } } } - return $inventory; + return [ + 'dirname' => $item, + 'model' => $model ?? null, + 'num' => $num ?? null, + 'root' => $root, + 'slug' => $slug ?? $item, + ]; } /** From feed115fef61ce2beb1e688950a3ecdac6fe8548 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 13:37:01 +0100 Subject: [PATCH 067/202] Add some comments --- src/Filesystem/Dir.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index da5e3d2b8c..53c52536bf 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -239,6 +239,7 @@ public static function inventory( $items = static::read($dir, $contentIgnore); natsort($items); + // loop through all directory items and collect all relevant information foreach ($items as $item) { // ignore all items with a leading dot or underscore if (in_array(substr($item, 0, 1), ['.', '_']) === true) { @@ -265,7 +266,8 @@ public static function inventory( continue; } - // collect all content files separately + // collect all content files separately, + // not as inventory entries if ($extension === $contentExtension) { $filename = pathinfo($item, PATHINFO_FILENAME); @@ -310,16 +312,16 @@ protected static function inventoryChild( } // determine the model - // inject models if (empty(Page::$models) === false) { if ($multilang === true) { - $contentExtension = App::instance()->defaultLanguage()->code() . '.' . $contentExtension; + $code = App::instance()->defaultLanguage()->code(); + $contentExtension = $code . '.' . $contentExtension; } // look if a content file can be found // for any of the available models foreach (Page::$models as $modelName => $modelClass) { - if (file_exists($root . '/' . $modelName . '.' . $contentExtension) === true) { + if (file_exists($root . '/' . $modelName . '.' . $contentExtension)) { $model = $modelName; break; } @@ -350,6 +352,7 @@ protected static function inventoryTemplate( } // it's most likely the template + // (will overwrite and use the last match for historic reasons) $template = $name; } From 50d9b0f464f0ebc100067d6566733f024d2f5939 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 13:41:10 +0100 Subject: [PATCH 068/202] Extract num and slug without regex --- src/Filesystem/Dir.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index 53c52536bf..17337b6352 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -306,9 +306,9 @@ protected static function inventoryChild( bool $multilang = false ): array { // extract the slug and num of the directory - if (preg_match('/^([0-9]+)' . static::$numSeparator . '(.*)$/', $item, $match)) { - $num = (int)$match[1]; - $slug = $match[2]; + if ($separator = strpos($item, static::$numSeparator)) { + $num = (int)substr($item, 0, $separator); + $slug = substr($item, $separator + 1); } // determine the model From 88fbe90af0ce669629415e14e378c77a99d3d58a Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 13:54:11 +0100 Subject: [PATCH 069/202] More extensive performance test setup --- performance/Filesystem/DirBench.php | 57 +++++++++++++++++++ .../inventory/models/{b/d/d.txt => a.txt} | 0 .../fixtures/inventory/models/a/bar.png | 0 .../fixtures/inventory/models/a/bar.png.txt | 0 .../fixtures/inventory/models/a/foo.jpg | 0 .../fixtures/inventory/models/a/foo.jpg.txt | 0 .../fixtures/inventory/models/b/bar.png | 0 .../fixtures/inventory/models/b/bar.png.txt | 0 .../fixtures/inventory/models/b/foo.jpg | 0 .../fixtures/inventory/models/b/foo.jpg.txt | 0 .../fixtures/inventory/models/bar.png | 0 .../fixtures/inventory/models/bar.png.txt | 0 .../fixtures/inventory/models/c/bar.png | 0 .../fixtures/inventory/models/c/bar.png.txt | 0 .../fixtures/inventory/models/c/foo.jpg | 0 .../fixtures/inventory/models/c/foo.jpg.txt | 0 .../fixtures/inventory/models/d/bar.png | 0 .../fixtures/inventory/models/d/bar.png.txt | 0 .../fixtures/inventory/models/d/d.txt | 0 .../fixtures/inventory/models/d/foo.jpg | 0 .../fixtures/inventory/models/d/foo.jpg.txt | 0 .../fixtures/inventory/models/e/bar.png | 0 .../fixtures/inventory/models/e/bar.png.txt | 0 .../fixtures/inventory/models/e/foo.jpg | 0 .../fixtures/inventory/models/e/foo.jpg.txt | 0 .../fixtures/inventory/models/f/bar.png | 0 .../fixtures/inventory/models/f/bar.png.txt | 0 .../fixtures/inventory/models/f/foo.jpg | 0 .../fixtures/inventory/models/f/foo.jpg.txt | 0 .../fixtures/inventory/models/foo.jpg | 0 .../fixtures/inventory/models/foo.jpg.txt | 0 .../fixtures/inventory/models/g/bar.png | 0 .../fixtures/inventory/models/g/bar.png.txt | 0 .../fixtures/inventory/models/g/foo.jpg | 0 .../fixtures/inventory/models/g/foo.jpg.txt | 0 .../fixtures/inventory/models/h/bar.png | 0 .../fixtures/inventory/models/h/bar.png.txt | 0 .../fixtures/inventory/models/h/foo.jpg | 0 .../fixtures/inventory/models/h/foo.jpg.txt | 0 .../fixtures/inventory/models/i/bar.png | 0 .../fixtures/inventory/models/i/bar.png.txt | 0 .../fixtures/inventory/models/i/foo.jpg | 0 .../fixtures/inventory/models/i/foo.jpg.txt | 0 .../fixtures/inventory/models/j/bar.png | 0 .../fixtures/inventory/models/j/bar.png.txt | 0 .../fixtures/inventory/models/j/foo.jpg | 0 .../fixtures/inventory/models/j/foo.jpg.txt | 0 .../fixtures/inventory/models/k/bar.png | 0 .../fixtures/inventory/models/k/bar.png.txt | 0 .../fixtures/inventory/models/k/foo.jpg | 0 .../fixtures/inventory/models/k/foo.jpg.txt | 0 .../fixtures/inventory/models/l/bar.png | 0 .../fixtures/inventory/models/l/bar.png.txt | 0 .../fixtures/inventory/models/l/foo.jpg | 0 .../fixtures/inventory/models/l/foo.jpg.txt | 0 .../fixtures/inventory/models/m/bar.png | 0 .../fixtures/inventory/models/m/bar.png.txt | 0 .../fixtures/inventory/models/m/foo.jpg | 0 .../fixtures/inventory/models/m/foo.jpg.txt | 0 .../fixtures/inventory/models/n/bar.png | 0 .../fixtures/inventory/models/n/bar.png.txt | 0 .../fixtures/inventory/models/n/foo.jpg | 0 .../fixtures/inventory/models/n/foo.jpg.txt | 0 .../fixtures/inventory/models/o/bar.png | 0 .../fixtures/inventory/models/o/bar.png.txt | 0 .../fixtures/inventory/models/o/foo.jpg | 0 .../fixtures/inventory/models/o/foo.jpg.txt | 0 .../fixtures/inventory/models/p/bar.png | 0 .../fixtures/inventory/models/p/bar.png.txt | 0 .../fixtures/inventory/models/p/foo.jpg | 0 .../fixtures/inventory/models/p/foo.jpg.txt | 0 .../fixtures/inventory/models/q/bar.png | 0 .../fixtures/inventory/models/q/bar.png.txt | 0 .../fixtures/inventory/models/q/foo.jpg | 0 .../fixtures/inventory/models/q/foo.jpg.txt | 0 .../fixtures/inventory/models/r/bar.png | 0 .../fixtures/inventory/models/r/bar.png.txt | 0 .../fixtures/inventory/models/r/foo.jpg | 0 .../fixtures/inventory/models/r/foo.jpg.txt | 0 .../fixtures/inventory/models/s/bar.png | 0 .../fixtures/inventory/models/s/bar.png.txt | 0 .../fixtures/inventory/models/s/foo.jpg | 0 .../fixtures/inventory/models/s/foo.jpg.txt | 0 .../fixtures/inventory/models/t/bar.png | 0 .../fixtures/inventory/models/t/bar.png.txt | 0 .../fixtures/inventory/models/t/foo.jpg | 0 .../fixtures/inventory/models/t/foo.jpg.txt | 0 .../fixtures/inventory/models/u/bar.png | 0 .../fixtures/inventory/models/u/bar.png.txt | 0 .../fixtures/inventory/models/u/foo.jpg | 0 .../fixtures/inventory/models/u/foo.jpg.txt | 0 .../fixtures/inventory/models/v/bar.png | 0 .../fixtures/inventory/models/v/bar.png.txt | 0 .../fixtures/inventory/models/v/foo.jpg | 0 .../fixtures/inventory/models/v/foo.jpg.txt | 0 .../fixtures/inventory/models/w/bar.png | 0 .../fixtures/inventory/models/w/bar.png.txt | 0 .../fixtures/inventory/models/w/foo.jpg | 0 .../fixtures/inventory/models/w/foo.jpg.txt | 0 .../fixtures/inventory/models/x/bar.png | 0 .../fixtures/inventory/models/x/bar.png.txt | 0 .../fixtures/inventory/models/x/foo.jpg | 0 .../fixtures/inventory/models/x/foo.jpg.txt | 0 .../fixtures/inventory/models/y/bar.png | 0 .../fixtures/inventory/models/y/bar.png.txt | 0 .../fixtures/inventory/models/y/foo.jpg | 0 .../fixtures/inventory/models/y/foo.jpg.txt | 0 .../fixtures/inventory/models/z/bar.png | 0 .../fixtures/inventory/models/z/bar.png.txt | 0 .../fixtures/inventory/models/z/foo.jpg | 0 .../fixtures/inventory/models/z/foo.jpg.txt | 0 111 files changed, 57 insertions(+) rename performance/Filesystem/fixtures/inventory/models/{b/d/d.txt => a.txt} (100%) create mode 100644 performance/Filesystem/fixtures/inventory/models/a/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/a/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/a/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/a/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/b/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/b/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/b/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/b/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/c/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/c/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/c/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/c/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/d/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/d/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/d/d.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/d/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/d/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/e/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/e/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/e/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/e/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/f/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/f/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/f/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/f/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/g/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/g/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/g/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/g/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/h/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/h/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/h/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/h/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/i/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/i/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/i/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/i/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/j/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/j/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/j/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/j/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/k/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/k/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/k/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/k/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/l/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/l/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/l/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/l/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/m/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/m/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/m/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/m/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/n/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/n/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/n/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/n/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/o/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/o/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/o/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/o/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/p/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/p/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/p/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/p/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/q/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/q/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/q/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/q/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/r/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/r/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/r/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/r/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/s/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/s/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/s/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/s/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/t/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/t/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/t/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/t/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/u/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/u/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/u/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/u/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/v/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/v/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/v/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/v/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/w/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/w/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/w/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/w/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/x/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/x/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/x/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/x/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/y/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/y/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/y/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/y/foo.jpg.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/z/bar.png create mode 100644 performance/Filesystem/fixtures/inventory/models/z/bar.png.txt create mode 100644 performance/Filesystem/fixtures/inventory/models/z/foo.jpg create mode 100644 performance/Filesystem/fixtures/inventory/models/z/foo.jpg.txt diff --git a/performance/Filesystem/DirBench.php b/performance/Filesystem/DirBench.php index 03f37aaf9f..1fc92dbb2a 100644 --- a/performance/Filesystem/DirBench.php +++ b/performance/Filesystem/DirBench.php @@ -34,6 +34,63 @@ public function benchInventoryTwoModels() Page::$models = []; } + public function benchInventoryThreeModels() + { + Page::$models = [ + 'a' => 'A', + 'b' => 'B', + 'c' => 'C' + ]; + + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + Page::$models = []; + } + + public function benchInventoryFourModels() + { + Page::$models = [ + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D' + ]; + + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + Page::$models = []; + } + + public function benchInventoryFiveModels() + { + Page::$models = [ + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E' + ]; + + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + Page::$models = []; + } + + public function benchInventorySixModels() + { + Page::$models = [ + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + ]; + + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + Page::$models = []; + } + public function benchInventoryManyModels() { Page::$models = [ diff --git a/performance/Filesystem/fixtures/inventory/models/b/d/d.txt b/performance/Filesystem/fixtures/inventory/models/a.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/b/d/d.txt rename to performance/Filesystem/fixtures/inventory/models/a.txt diff --git a/performance/Filesystem/fixtures/inventory/models/a/bar.png b/performance/Filesystem/fixtures/inventory/models/a/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/a/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/a/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/a/foo.jpg b/performance/Filesystem/fixtures/inventory/models/a/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/a/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/a/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/b/bar.png b/performance/Filesystem/fixtures/inventory/models/b/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/b/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/b/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/b/foo.jpg b/performance/Filesystem/fixtures/inventory/models/b/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/b/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/b/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/bar.png b/performance/Filesystem/fixtures/inventory/models/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/c/bar.png b/performance/Filesystem/fixtures/inventory/models/c/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/c/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/c/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/c/foo.jpg b/performance/Filesystem/fixtures/inventory/models/c/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/c/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/c/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/d/bar.png b/performance/Filesystem/fixtures/inventory/models/d/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/d/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/d/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/d/d.txt b/performance/Filesystem/fixtures/inventory/models/d/d.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/d/foo.jpg b/performance/Filesystem/fixtures/inventory/models/d/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/d/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/d/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/e/bar.png b/performance/Filesystem/fixtures/inventory/models/e/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/e/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/e/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/e/foo.jpg b/performance/Filesystem/fixtures/inventory/models/e/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/e/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/e/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/f/bar.png b/performance/Filesystem/fixtures/inventory/models/f/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/f/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/f/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/f/foo.jpg b/performance/Filesystem/fixtures/inventory/models/f/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/f/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/f/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/foo.jpg b/performance/Filesystem/fixtures/inventory/models/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/g/bar.png b/performance/Filesystem/fixtures/inventory/models/g/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/g/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/g/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/g/foo.jpg b/performance/Filesystem/fixtures/inventory/models/g/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/g/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/g/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/h/bar.png b/performance/Filesystem/fixtures/inventory/models/h/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/h/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/h/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/h/foo.jpg b/performance/Filesystem/fixtures/inventory/models/h/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/h/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/h/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/i/bar.png b/performance/Filesystem/fixtures/inventory/models/i/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/i/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/i/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/i/foo.jpg b/performance/Filesystem/fixtures/inventory/models/i/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/i/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/i/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/j/bar.png b/performance/Filesystem/fixtures/inventory/models/j/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/j/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/j/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/j/foo.jpg b/performance/Filesystem/fixtures/inventory/models/j/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/j/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/j/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/k/bar.png b/performance/Filesystem/fixtures/inventory/models/k/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/k/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/k/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/k/foo.jpg b/performance/Filesystem/fixtures/inventory/models/k/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/k/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/k/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/l/bar.png b/performance/Filesystem/fixtures/inventory/models/l/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/l/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/l/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/l/foo.jpg b/performance/Filesystem/fixtures/inventory/models/l/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/l/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/l/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/m/bar.png b/performance/Filesystem/fixtures/inventory/models/m/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/m/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/m/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/m/foo.jpg b/performance/Filesystem/fixtures/inventory/models/m/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/m/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/m/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/n/bar.png b/performance/Filesystem/fixtures/inventory/models/n/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/n/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/n/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/n/foo.jpg b/performance/Filesystem/fixtures/inventory/models/n/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/n/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/n/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/o/bar.png b/performance/Filesystem/fixtures/inventory/models/o/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/o/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/o/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/o/foo.jpg b/performance/Filesystem/fixtures/inventory/models/o/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/o/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/o/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/p/bar.png b/performance/Filesystem/fixtures/inventory/models/p/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/p/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/p/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/p/foo.jpg b/performance/Filesystem/fixtures/inventory/models/p/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/p/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/p/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/q/bar.png b/performance/Filesystem/fixtures/inventory/models/q/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/q/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/q/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/q/foo.jpg b/performance/Filesystem/fixtures/inventory/models/q/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/q/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/q/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/r/bar.png b/performance/Filesystem/fixtures/inventory/models/r/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/r/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/r/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/r/foo.jpg b/performance/Filesystem/fixtures/inventory/models/r/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/r/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/r/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/s/bar.png b/performance/Filesystem/fixtures/inventory/models/s/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/s/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/s/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/s/foo.jpg b/performance/Filesystem/fixtures/inventory/models/s/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/s/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/s/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/t/bar.png b/performance/Filesystem/fixtures/inventory/models/t/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/t/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/t/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/t/foo.jpg b/performance/Filesystem/fixtures/inventory/models/t/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/t/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/t/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/u/bar.png b/performance/Filesystem/fixtures/inventory/models/u/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/u/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/u/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/u/foo.jpg b/performance/Filesystem/fixtures/inventory/models/u/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/u/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/u/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/v/bar.png b/performance/Filesystem/fixtures/inventory/models/v/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/v/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/v/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/v/foo.jpg b/performance/Filesystem/fixtures/inventory/models/v/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/v/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/v/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/w/bar.png b/performance/Filesystem/fixtures/inventory/models/w/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/w/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/w/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/w/foo.jpg b/performance/Filesystem/fixtures/inventory/models/w/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/w/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/w/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/x/bar.png b/performance/Filesystem/fixtures/inventory/models/x/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/x/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/x/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/x/foo.jpg b/performance/Filesystem/fixtures/inventory/models/x/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/x/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/x/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/y/bar.png b/performance/Filesystem/fixtures/inventory/models/y/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/y/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/y/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/y/foo.jpg b/performance/Filesystem/fixtures/inventory/models/y/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/y/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/y/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/z/bar.png b/performance/Filesystem/fixtures/inventory/models/z/bar.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/z/bar.png.txt b/performance/Filesystem/fixtures/inventory/models/z/bar.png.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/z/foo.jpg b/performance/Filesystem/fixtures/inventory/models/z/foo.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/performance/Filesystem/fixtures/inventory/models/z/foo.jpg.txt b/performance/Filesystem/fixtures/inventory/models/z/foo.jpg.txt new file mode 100644 index 0000000000..e69de29bb2 From e8c63078465073b9ca101a8a86a00fec8ab1482b Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 13:54:54 +0100 Subject: [PATCH 070/202] Exclude phpbench files from export From db6252971d8c67b087f8f4656537a6346f95e990 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 14:03:37 +0100 Subject: [PATCH 071/202] Tweak DirBench cases --- performance/Filesystem/DirBench.php | 41 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/performance/Filesystem/DirBench.php b/performance/Filesystem/DirBench.php index 1fc92dbb2a..6b74132e74 100644 --- a/performance/Filesystem/DirBench.php +++ b/performance/Filesystem/DirBench.php @@ -34,26 +34,14 @@ public function benchInventoryTwoModels() Page::$models = []; } - public function benchInventoryThreeModels() - { - Page::$models = [ - 'a' => 'A', - 'b' => 'B', - 'c' => 'C' - ]; - - Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - - Page::$models = []; - } - - public function benchInventoryFourModels() + public function benchInventoryFiveModels() { Page::$models = [ 'a' => 'A', 'b' => 'B', 'c' => 'C', - 'd' => 'D' + 'd' => 'D', + 'e' => 'E' ]; Dir::inventory(__DIR__ . '/fixtures/inventory/models'); @@ -61,14 +49,19 @@ public function benchInventoryFourModels() Page::$models = []; } - public function benchInventoryFiveModels() + public function benchInventory10Models() { Page::$models = [ 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', - 'e' => 'E' + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J' ]; Dir::inventory(__DIR__ . '/fixtures/inventory/models'); @@ -76,7 +69,7 @@ public function benchInventoryFiveModels() Page::$models = []; } - public function benchInventorySixModels() + public function benchInventory15Models() { Page::$models = [ 'a' => 'A', @@ -84,6 +77,16 @@ public function benchInventorySixModels() 'c' => 'C', 'd' => 'D', 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O' ]; Dir::inventory(__DIR__ . '/fixtures/inventory/models'); @@ -91,7 +94,7 @@ public function benchInventorySixModels() Page::$models = []; } - public function benchInventoryManyModels() + public function benchInventory26Models() { Page::$models = [ 'a' => 'A', From 4df5c3c4c40e33d98481942d1d82a544f3fe20ed Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 21 Jan 2024 14:21:51 +0100 Subject: [PATCH 072/202] Deactivate some DirBench cases --- performance/Filesystem/DirBench.php | 134 ++++++++++++++-------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/performance/Filesystem/DirBench.php b/performance/Filesystem/DirBench.php index 6b74132e74..2216258e14 100644 --- a/performance/Filesystem/DirBench.php +++ b/performance/Filesystem/DirBench.php @@ -11,16 +11,16 @@ public function benchInventoryNoModels() Dir::inventory(__DIR__ . '/fixtures/inventory/models'); } - public function benchInventoryOneModels() - { - Page::$models = [ - 'a' => 'A' - ]; + // public function benchInventoryOneModels() + // { + // Page::$models = [ + // 'a' => 'A' + // ]; - Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + // Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - Page::$models = []; - } + // Page::$models = []; + // } public function benchInventoryTwoModels() { @@ -34,65 +34,65 @@ public function benchInventoryTwoModels() Page::$models = []; } - public function benchInventoryFiveModels() - { - Page::$models = [ - 'a' => 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E' - ]; - - Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - - Page::$models = []; - } - - public function benchInventory10Models() - { - Page::$models = [ - 'a' => 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E', - 'f' => 'F', - 'g' => 'G', - 'h' => 'H', - 'i' => 'I', - 'j' => 'J' - ]; - - Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - - Page::$models = []; - } - - public function benchInventory15Models() - { - Page::$models = [ - 'a' => 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E', - 'f' => 'F', - 'g' => 'G', - 'h' => 'H', - 'i' => 'I', - 'j' => 'J', - 'k' => 'K', - 'l' => 'L', - 'm' => 'M', - 'n' => 'N', - 'o' => 'O' - ]; - - Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - - Page::$models = []; - } + // public function benchInventoryFiveModels() + // { + // Page::$models = [ + // 'a' => 'A', + // 'b' => 'B', + // 'c' => 'C', + // 'd' => 'D', + // 'e' => 'E' + // ]; + + // Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + // Page::$models = []; + // } + + // public function benchInventory10Models() + // { + // Page::$models = [ + // 'a' => 'A', + // 'b' => 'B', + // 'c' => 'C', + // 'd' => 'D', + // 'e' => 'E', + // 'f' => 'F', + // 'g' => 'G', + // 'h' => 'H', + // 'i' => 'I', + // 'j' => 'J' + // ]; + + // Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + // Page::$models = []; + // } + + // public function benchInventory15Models() + // { + // Page::$models = [ + // 'a' => 'A', + // 'b' => 'B', + // 'c' => 'C', + // 'd' => 'D', + // 'e' => 'E', + // 'f' => 'F', + // 'g' => 'G', + // 'h' => 'H', + // 'i' => 'I', + // 'j' => 'J', + // 'k' => 'K', + // 'l' => 'L', + // 'm' => 'M', + // 'n' => 'N', + // 'o' => 'O' + // ]; + + // Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + + // Page::$models = []; + // } public function benchInventory26Models() { From c9a6443a0ec00af2487ef94c0cb30c96d1b24077 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sat, 27 Jan 2024 23:02:32 +0100 Subject: [PATCH 073/202] Fix bench setup after merge conflicts --- {performance => bench}/Filesystem/DirBench.php | 0 .../Filesystem/fixtures/inventory/models/a.txt | 0 .../Filesystem/fixtures/inventory/models/a/a.txt | 0 .../Filesystem/fixtures/inventory/models/a/bar.png | 0 .../Filesystem/fixtures/inventory/models/a/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/a/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/a/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/b/b.txt | 0 .../Filesystem/fixtures/inventory/models/b/bar.png | 0 .../Filesystem/fixtures/inventory/models/b/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/b/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/b/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/bar.png | 0 .../Filesystem/fixtures/inventory/models/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/c/bar.png | 0 .../Filesystem/fixtures/inventory/models/c/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/c/c.txt | 0 .../Filesystem/fixtures/inventory/models/c/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/c/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/d/bar.png | 0 .../Filesystem/fixtures/inventory/models/d/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/d/d.txt | 0 .../Filesystem/fixtures/inventory/models/d/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/d/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/e/bar.png | 0 .../Filesystem/fixtures/inventory/models/e/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/e/e.txt | 0 .../Filesystem/fixtures/inventory/models/e/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/e/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/f/bar.png | 0 .../Filesystem/fixtures/inventory/models/f/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/f/f.txt | 0 .../Filesystem/fixtures/inventory/models/f/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/f/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/g/bar.png | 0 .../Filesystem/fixtures/inventory/models/g/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/g/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/g/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/g/g.txt | 0 .../Filesystem/fixtures/inventory/models/h/bar.png | 0 .../Filesystem/fixtures/inventory/models/h/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/h/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/h/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/h/h.txt | 0 .../Filesystem/fixtures/inventory/models/i/bar.png | 0 .../Filesystem/fixtures/inventory/models/i/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/i/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/i/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/i/i.txt | 0 .../Filesystem/fixtures/inventory/models/j/bar.png | 0 .../Filesystem/fixtures/inventory/models/j/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/j/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/j/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/j/j.txt | 0 .../Filesystem/fixtures/inventory/models/k/bar.png | 0 .../Filesystem/fixtures/inventory/models/k/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/k/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/k/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/k/k.txt | 0 .../Filesystem/fixtures/inventory/models/l/bar.png | 0 .../Filesystem/fixtures/inventory/models/l/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/l/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/l/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/l/l.txt | 0 .../Filesystem/fixtures/inventory/models/m/bar.png | 0 .../Filesystem/fixtures/inventory/models/m/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/m/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/m/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/m/m.txt | 0 .../Filesystem/fixtures/inventory/models/n/bar.png | 0 .../Filesystem/fixtures/inventory/models/n/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/n/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/n/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/n/n.txt | 0 .../Filesystem/fixtures/inventory/models/o/bar.png | 0 .../Filesystem/fixtures/inventory/models/o/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/o/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/o/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/o/o.txt | 0 .../Filesystem/fixtures/inventory/models/p/bar.png | 0 .../Filesystem/fixtures/inventory/models/p/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/p/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/p/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/p/p.txt | 0 .../Filesystem/fixtures/inventory/models/q/bar.png | 0 .../Filesystem/fixtures/inventory/models/q/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/q/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/q/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/q/q.txt | 0 .../Filesystem/fixtures/inventory/models/r/bar.png | 0 .../Filesystem/fixtures/inventory/models/r/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/r/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/r/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/r/r.txt | 0 .../Filesystem/fixtures/inventory/models/s/bar.png | 0 .../Filesystem/fixtures/inventory/models/s/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/s/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/s/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/s/s.txt | 0 .../Filesystem/fixtures/inventory/models/t/bar.png | 0 .../Filesystem/fixtures/inventory/models/t/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/t/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/t/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/t/t.txt | 0 .../Filesystem/fixtures/inventory/models/u/bar.png | 0 .../Filesystem/fixtures/inventory/models/u/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/u/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/u/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/u/u.txt | 0 .../Filesystem/fixtures/inventory/models/v/bar.png | 0 .../Filesystem/fixtures/inventory/models/v/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/v/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/v/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/v/v.txt | 0 .../Filesystem/fixtures/inventory/models/w/bar.png | 0 .../Filesystem/fixtures/inventory/models/w/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/w/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/w/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/w/w.txt | 0 .../Filesystem/fixtures/inventory/models/x/bar.png | 0 .../Filesystem/fixtures/inventory/models/x/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/x/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/x/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/x/x.txt | 0 .../Filesystem/fixtures/inventory/models/y/bar.png | 0 .../Filesystem/fixtures/inventory/models/y/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/y/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/y/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/y/y.txt | 0 .../Filesystem/fixtures/inventory/models/z/bar.png | 0 .../Filesystem/fixtures/inventory/models/z/bar.png.txt | 0 .../Filesystem/fixtures/inventory/models/z/foo.jpg | 0 .../Filesystem/fixtures/inventory/models/z/foo.jpg.txt | 0 .../Filesystem/fixtures/inventory/models/z/z.txt | 0 performance/bootstrap.php | 3 --- 137 files changed, 3 deletions(-) rename {performance => bench}/Filesystem/DirBench.php (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/a.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/a/a.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/a/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/a/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/a/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/a/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/b/b.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/b/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/b/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/b/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/b/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/c/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/c/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/c/c.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/c/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/c/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/d/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/d/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/d/d.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/d/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/d/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/e/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/e/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/e/e.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/e/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/e/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/f/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/f/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/f/f.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/f/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/f/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/g/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/g/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/g/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/g/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/g/g.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/h/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/h/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/h/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/h/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/h/h.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/i/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/i/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/i/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/i/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/i/i.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/j/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/j/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/j/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/j/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/j/j.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/k/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/k/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/k/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/k/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/k/k.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/l/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/l/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/l/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/l/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/l/l.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/m/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/m/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/m/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/m/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/m/m.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/n/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/n/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/n/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/n/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/n/n.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/o/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/o/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/o/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/o/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/o/o.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/p/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/p/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/p/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/p/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/p/p.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/q/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/q/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/q/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/q/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/q/q.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/r/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/r/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/r/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/r/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/r/r.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/s/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/s/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/s/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/s/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/s/s.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/t/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/t/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/t/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/t/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/t/t.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/u/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/u/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/u/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/u/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/u/u.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/v/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/v/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/v/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/v/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/v/v.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/w/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/w/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/w/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/w/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/w/w.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/x/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/x/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/x/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/x/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/x/x.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/y/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/y/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/y/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/y/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/y/y.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/z/bar.png (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/z/bar.png.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/z/foo.jpg (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/z/foo.jpg.txt (100%) rename {performance => bench}/Filesystem/fixtures/inventory/models/z/z.txt (100%) delete mode 100644 performance/bootstrap.php diff --git a/performance/Filesystem/DirBench.php b/bench/Filesystem/DirBench.php similarity index 100% rename from performance/Filesystem/DirBench.php rename to bench/Filesystem/DirBench.php diff --git a/performance/Filesystem/fixtures/inventory/models/a.txt b/bench/Filesystem/fixtures/inventory/models/a.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/a.txt rename to bench/Filesystem/fixtures/inventory/models/a.txt diff --git a/performance/Filesystem/fixtures/inventory/models/a/a.txt b/bench/Filesystem/fixtures/inventory/models/a/a.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/a/a.txt rename to bench/Filesystem/fixtures/inventory/models/a/a.txt diff --git a/performance/Filesystem/fixtures/inventory/models/a/bar.png b/bench/Filesystem/fixtures/inventory/models/a/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/a/bar.png rename to bench/Filesystem/fixtures/inventory/models/a/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/a/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/a/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/a/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/a/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/a/foo.jpg b/bench/Filesystem/fixtures/inventory/models/a/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/a/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/a/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/a/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/a/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/a/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/a/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/b/b.txt b/bench/Filesystem/fixtures/inventory/models/b/b.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/b/b.txt rename to bench/Filesystem/fixtures/inventory/models/b/b.txt diff --git a/performance/Filesystem/fixtures/inventory/models/b/bar.png b/bench/Filesystem/fixtures/inventory/models/b/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/b/bar.png rename to bench/Filesystem/fixtures/inventory/models/b/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/b/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/b/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/b/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/b/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/b/foo.jpg b/bench/Filesystem/fixtures/inventory/models/b/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/b/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/b/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/b/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/b/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/b/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/b/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/bar.png b/bench/Filesystem/fixtures/inventory/models/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/bar.png rename to bench/Filesystem/fixtures/inventory/models/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/c/bar.png b/bench/Filesystem/fixtures/inventory/models/c/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/c/bar.png rename to bench/Filesystem/fixtures/inventory/models/c/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/c/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/c/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/c/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/c/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/c/c.txt b/bench/Filesystem/fixtures/inventory/models/c/c.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/c/c.txt rename to bench/Filesystem/fixtures/inventory/models/c/c.txt diff --git a/performance/Filesystem/fixtures/inventory/models/c/foo.jpg b/bench/Filesystem/fixtures/inventory/models/c/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/c/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/c/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/c/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/c/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/c/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/c/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/d/bar.png b/bench/Filesystem/fixtures/inventory/models/d/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/d/bar.png rename to bench/Filesystem/fixtures/inventory/models/d/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/d/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/d/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/d/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/d/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/d/d.txt b/bench/Filesystem/fixtures/inventory/models/d/d.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/d/d.txt rename to bench/Filesystem/fixtures/inventory/models/d/d.txt diff --git a/performance/Filesystem/fixtures/inventory/models/d/foo.jpg b/bench/Filesystem/fixtures/inventory/models/d/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/d/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/d/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/d/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/d/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/d/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/d/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/e/bar.png b/bench/Filesystem/fixtures/inventory/models/e/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/e/bar.png rename to bench/Filesystem/fixtures/inventory/models/e/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/e/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/e/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/e/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/e/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/e/e.txt b/bench/Filesystem/fixtures/inventory/models/e/e.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/e/e.txt rename to bench/Filesystem/fixtures/inventory/models/e/e.txt diff --git a/performance/Filesystem/fixtures/inventory/models/e/foo.jpg b/bench/Filesystem/fixtures/inventory/models/e/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/e/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/e/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/e/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/e/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/e/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/e/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/f/bar.png b/bench/Filesystem/fixtures/inventory/models/f/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/f/bar.png rename to bench/Filesystem/fixtures/inventory/models/f/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/f/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/f/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/f/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/f/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/f/f.txt b/bench/Filesystem/fixtures/inventory/models/f/f.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/f/f.txt rename to bench/Filesystem/fixtures/inventory/models/f/f.txt diff --git a/performance/Filesystem/fixtures/inventory/models/f/foo.jpg b/bench/Filesystem/fixtures/inventory/models/f/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/f/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/f/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/f/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/f/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/f/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/f/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/foo.jpg b/bench/Filesystem/fixtures/inventory/models/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/g/bar.png b/bench/Filesystem/fixtures/inventory/models/g/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/g/bar.png rename to bench/Filesystem/fixtures/inventory/models/g/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/g/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/g/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/g/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/g/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/g/foo.jpg b/bench/Filesystem/fixtures/inventory/models/g/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/g/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/g/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/g/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/g/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/g/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/g/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/g/g.txt b/bench/Filesystem/fixtures/inventory/models/g/g.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/g/g.txt rename to bench/Filesystem/fixtures/inventory/models/g/g.txt diff --git a/performance/Filesystem/fixtures/inventory/models/h/bar.png b/bench/Filesystem/fixtures/inventory/models/h/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/h/bar.png rename to bench/Filesystem/fixtures/inventory/models/h/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/h/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/h/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/h/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/h/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/h/foo.jpg b/bench/Filesystem/fixtures/inventory/models/h/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/h/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/h/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/h/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/h/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/h/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/h/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/h/h.txt b/bench/Filesystem/fixtures/inventory/models/h/h.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/h/h.txt rename to bench/Filesystem/fixtures/inventory/models/h/h.txt diff --git a/performance/Filesystem/fixtures/inventory/models/i/bar.png b/bench/Filesystem/fixtures/inventory/models/i/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/i/bar.png rename to bench/Filesystem/fixtures/inventory/models/i/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/i/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/i/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/i/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/i/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/i/foo.jpg b/bench/Filesystem/fixtures/inventory/models/i/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/i/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/i/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/i/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/i/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/i/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/i/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/i/i.txt b/bench/Filesystem/fixtures/inventory/models/i/i.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/i/i.txt rename to bench/Filesystem/fixtures/inventory/models/i/i.txt diff --git a/performance/Filesystem/fixtures/inventory/models/j/bar.png b/bench/Filesystem/fixtures/inventory/models/j/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/j/bar.png rename to bench/Filesystem/fixtures/inventory/models/j/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/j/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/j/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/j/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/j/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/j/foo.jpg b/bench/Filesystem/fixtures/inventory/models/j/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/j/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/j/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/j/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/j/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/j/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/j/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/j/j.txt b/bench/Filesystem/fixtures/inventory/models/j/j.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/j/j.txt rename to bench/Filesystem/fixtures/inventory/models/j/j.txt diff --git a/performance/Filesystem/fixtures/inventory/models/k/bar.png b/bench/Filesystem/fixtures/inventory/models/k/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/k/bar.png rename to bench/Filesystem/fixtures/inventory/models/k/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/k/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/k/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/k/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/k/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/k/foo.jpg b/bench/Filesystem/fixtures/inventory/models/k/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/k/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/k/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/k/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/k/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/k/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/k/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/k/k.txt b/bench/Filesystem/fixtures/inventory/models/k/k.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/k/k.txt rename to bench/Filesystem/fixtures/inventory/models/k/k.txt diff --git a/performance/Filesystem/fixtures/inventory/models/l/bar.png b/bench/Filesystem/fixtures/inventory/models/l/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/l/bar.png rename to bench/Filesystem/fixtures/inventory/models/l/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/l/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/l/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/l/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/l/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/l/foo.jpg b/bench/Filesystem/fixtures/inventory/models/l/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/l/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/l/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/l/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/l/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/l/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/l/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/l/l.txt b/bench/Filesystem/fixtures/inventory/models/l/l.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/l/l.txt rename to bench/Filesystem/fixtures/inventory/models/l/l.txt diff --git a/performance/Filesystem/fixtures/inventory/models/m/bar.png b/bench/Filesystem/fixtures/inventory/models/m/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/m/bar.png rename to bench/Filesystem/fixtures/inventory/models/m/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/m/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/m/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/m/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/m/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/m/foo.jpg b/bench/Filesystem/fixtures/inventory/models/m/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/m/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/m/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/m/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/m/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/m/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/m/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/m/m.txt b/bench/Filesystem/fixtures/inventory/models/m/m.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/m/m.txt rename to bench/Filesystem/fixtures/inventory/models/m/m.txt diff --git a/performance/Filesystem/fixtures/inventory/models/n/bar.png b/bench/Filesystem/fixtures/inventory/models/n/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/n/bar.png rename to bench/Filesystem/fixtures/inventory/models/n/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/n/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/n/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/n/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/n/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/n/foo.jpg b/bench/Filesystem/fixtures/inventory/models/n/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/n/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/n/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/n/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/n/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/n/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/n/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/n/n.txt b/bench/Filesystem/fixtures/inventory/models/n/n.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/n/n.txt rename to bench/Filesystem/fixtures/inventory/models/n/n.txt diff --git a/performance/Filesystem/fixtures/inventory/models/o/bar.png b/bench/Filesystem/fixtures/inventory/models/o/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/o/bar.png rename to bench/Filesystem/fixtures/inventory/models/o/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/o/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/o/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/o/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/o/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/o/foo.jpg b/bench/Filesystem/fixtures/inventory/models/o/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/o/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/o/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/o/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/o/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/o/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/o/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/o/o.txt b/bench/Filesystem/fixtures/inventory/models/o/o.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/o/o.txt rename to bench/Filesystem/fixtures/inventory/models/o/o.txt diff --git a/performance/Filesystem/fixtures/inventory/models/p/bar.png b/bench/Filesystem/fixtures/inventory/models/p/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/p/bar.png rename to bench/Filesystem/fixtures/inventory/models/p/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/p/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/p/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/p/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/p/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/p/foo.jpg b/bench/Filesystem/fixtures/inventory/models/p/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/p/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/p/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/p/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/p/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/p/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/p/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/p/p.txt b/bench/Filesystem/fixtures/inventory/models/p/p.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/p/p.txt rename to bench/Filesystem/fixtures/inventory/models/p/p.txt diff --git a/performance/Filesystem/fixtures/inventory/models/q/bar.png b/bench/Filesystem/fixtures/inventory/models/q/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/q/bar.png rename to bench/Filesystem/fixtures/inventory/models/q/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/q/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/q/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/q/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/q/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/q/foo.jpg b/bench/Filesystem/fixtures/inventory/models/q/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/q/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/q/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/q/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/q/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/q/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/q/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/q/q.txt b/bench/Filesystem/fixtures/inventory/models/q/q.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/q/q.txt rename to bench/Filesystem/fixtures/inventory/models/q/q.txt diff --git a/performance/Filesystem/fixtures/inventory/models/r/bar.png b/bench/Filesystem/fixtures/inventory/models/r/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/r/bar.png rename to bench/Filesystem/fixtures/inventory/models/r/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/r/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/r/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/r/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/r/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/r/foo.jpg b/bench/Filesystem/fixtures/inventory/models/r/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/r/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/r/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/r/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/r/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/r/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/r/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/r/r.txt b/bench/Filesystem/fixtures/inventory/models/r/r.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/r/r.txt rename to bench/Filesystem/fixtures/inventory/models/r/r.txt diff --git a/performance/Filesystem/fixtures/inventory/models/s/bar.png b/bench/Filesystem/fixtures/inventory/models/s/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/s/bar.png rename to bench/Filesystem/fixtures/inventory/models/s/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/s/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/s/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/s/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/s/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/s/foo.jpg b/bench/Filesystem/fixtures/inventory/models/s/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/s/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/s/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/s/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/s/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/s/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/s/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/s/s.txt b/bench/Filesystem/fixtures/inventory/models/s/s.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/s/s.txt rename to bench/Filesystem/fixtures/inventory/models/s/s.txt diff --git a/performance/Filesystem/fixtures/inventory/models/t/bar.png b/bench/Filesystem/fixtures/inventory/models/t/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/t/bar.png rename to bench/Filesystem/fixtures/inventory/models/t/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/t/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/t/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/t/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/t/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/t/foo.jpg b/bench/Filesystem/fixtures/inventory/models/t/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/t/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/t/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/t/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/t/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/t/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/t/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/t/t.txt b/bench/Filesystem/fixtures/inventory/models/t/t.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/t/t.txt rename to bench/Filesystem/fixtures/inventory/models/t/t.txt diff --git a/performance/Filesystem/fixtures/inventory/models/u/bar.png b/bench/Filesystem/fixtures/inventory/models/u/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/u/bar.png rename to bench/Filesystem/fixtures/inventory/models/u/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/u/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/u/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/u/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/u/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/u/foo.jpg b/bench/Filesystem/fixtures/inventory/models/u/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/u/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/u/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/u/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/u/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/u/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/u/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/u/u.txt b/bench/Filesystem/fixtures/inventory/models/u/u.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/u/u.txt rename to bench/Filesystem/fixtures/inventory/models/u/u.txt diff --git a/performance/Filesystem/fixtures/inventory/models/v/bar.png b/bench/Filesystem/fixtures/inventory/models/v/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/v/bar.png rename to bench/Filesystem/fixtures/inventory/models/v/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/v/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/v/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/v/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/v/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/v/foo.jpg b/bench/Filesystem/fixtures/inventory/models/v/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/v/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/v/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/v/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/v/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/v/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/v/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/v/v.txt b/bench/Filesystem/fixtures/inventory/models/v/v.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/v/v.txt rename to bench/Filesystem/fixtures/inventory/models/v/v.txt diff --git a/performance/Filesystem/fixtures/inventory/models/w/bar.png b/bench/Filesystem/fixtures/inventory/models/w/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/w/bar.png rename to bench/Filesystem/fixtures/inventory/models/w/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/w/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/w/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/w/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/w/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/w/foo.jpg b/bench/Filesystem/fixtures/inventory/models/w/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/w/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/w/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/w/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/w/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/w/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/w/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/w/w.txt b/bench/Filesystem/fixtures/inventory/models/w/w.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/w/w.txt rename to bench/Filesystem/fixtures/inventory/models/w/w.txt diff --git a/performance/Filesystem/fixtures/inventory/models/x/bar.png b/bench/Filesystem/fixtures/inventory/models/x/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/x/bar.png rename to bench/Filesystem/fixtures/inventory/models/x/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/x/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/x/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/x/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/x/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/x/foo.jpg b/bench/Filesystem/fixtures/inventory/models/x/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/x/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/x/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/x/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/x/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/x/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/x/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/x/x.txt b/bench/Filesystem/fixtures/inventory/models/x/x.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/x/x.txt rename to bench/Filesystem/fixtures/inventory/models/x/x.txt diff --git a/performance/Filesystem/fixtures/inventory/models/y/bar.png b/bench/Filesystem/fixtures/inventory/models/y/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/y/bar.png rename to bench/Filesystem/fixtures/inventory/models/y/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/y/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/y/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/y/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/y/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/y/foo.jpg b/bench/Filesystem/fixtures/inventory/models/y/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/y/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/y/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/y/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/y/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/y/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/y/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/y/y.txt b/bench/Filesystem/fixtures/inventory/models/y/y.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/y/y.txt rename to bench/Filesystem/fixtures/inventory/models/y/y.txt diff --git a/performance/Filesystem/fixtures/inventory/models/z/bar.png b/bench/Filesystem/fixtures/inventory/models/z/bar.png similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/z/bar.png rename to bench/Filesystem/fixtures/inventory/models/z/bar.png diff --git a/performance/Filesystem/fixtures/inventory/models/z/bar.png.txt b/bench/Filesystem/fixtures/inventory/models/z/bar.png.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/z/bar.png.txt rename to bench/Filesystem/fixtures/inventory/models/z/bar.png.txt diff --git a/performance/Filesystem/fixtures/inventory/models/z/foo.jpg b/bench/Filesystem/fixtures/inventory/models/z/foo.jpg similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/z/foo.jpg rename to bench/Filesystem/fixtures/inventory/models/z/foo.jpg diff --git a/performance/Filesystem/fixtures/inventory/models/z/foo.jpg.txt b/bench/Filesystem/fixtures/inventory/models/z/foo.jpg.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/z/foo.jpg.txt rename to bench/Filesystem/fixtures/inventory/models/z/foo.jpg.txt diff --git a/performance/Filesystem/fixtures/inventory/models/z/z.txt b/bench/Filesystem/fixtures/inventory/models/z/z.txt similarity index 100% rename from performance/Filesystem/fixtures/inventory/models/z/z.txt rename to bench/Filesystem/fixtures/inventory/models/z/z.txt diff --git a/performance/bootstrap.php b/performance/bootstrap.php deleted file mode 100644 index 6c8c4f51b9..0000000000 --- a/performance/bootstrap.php +++ /dev/null @@ -1,3 +0,0 @@ - Date: Sat, 27 Jan 2024 23:17:35 +0100 Subject: [PATCH 074/202] Fix composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8f7d5f9619..e8293c5f77 100644 --- a/composer.json +++ b/composer.json @@ -90,6 +90,7 @@ ] }, "scripts": { + "post-update-cmd": "curl -o cacert.pem https://curl.se/ca/cacert.pem", "analyze": [ "@analyze:composer", "@analyze:psalm", @@ -107,7 +108,6 @@ "@test" ], "fix": "php-cs-fixer fix", - "post-update-cmd": "curl -o cacert.pem https://curl.se/ca/cacert.pem", "test": "phpunit", "test:coverage": "XDEBUG_MODE=coverage phpunit --coverage-html=tests/coverage", "zip": "composer archive --format=zip --file=dist" From d0f4c3a26d1c15ca764de4c740591a5b48b8383c Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sat, 27 Jan 2024 23:22:34 +0100 Subject: [PATCH 075/202] Fix cs --- bench/Filesystem/DirBench.php | 99 ++++++++++------------------------- 1 file changed, 27 insertions(+), 72 deletions(-) diff --git a/bench/Filesystem/DirBench.php b/bench/Filesystem/DirBench.php index 2216258e14..47c9ac1ce2 100644 --- a/bench/Filesystem/DirBench.php +++ b/bench/Filesystem/DirBench.php @@ -6,24 +6,24 @@ class DirBench { - public function benchInventoryNoModels() - { + public function benchInventoryNoModels() + { Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - } + } - // public function benchInventoryOneModels() - // { - // Page::$models = [ - // 'a' => 'A' - // ]; + public function benchInventoryOneModels() + { + Page::$models = [ + 'a' => 'A' + ]; - // Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - // Page::$models = []; - // } + Page::$models = []; + } public function benchInventoryTwoModels() - { + { Page::$models = [ 'a' => 'A', 'b' => 'B' @@ -32,70 +32,25 @@ public function benchInventoryTwoModels() Dir::inventory(__DIR__ . '/fixtures/inventory/models'); Page::$models = []; - } - - // public function benchInventoryFiveModels() - // { - // Page::$models = [ - // 'a' => 'A', - // 'b' => 'B', - // 'c' => 'C', - // 'd' => 'D', - // 'e' => 'E' - // ]; - - // Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - - // Page::$models = []; - // } - - // public function benchInventory10Models() - // { - // Page::$models = [ - // 'a' => 'A', - // 'b' => 'B', - // 'c' => 'C', - // 'd' => 'D', - // 'e' => 'E', - // 'f' => 'F', - // 'g' => 'G', - // 'h' => 'H', - // 'i' => 'I', - // 'j' => 'J' - // ]; - - // Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + } - // Page::$models = []; - // } - - // public function benchInventory15Models() - // { - // Page::$models = [ - // 'a' => 'A', - // 'b' => 'B', - // 'c' => 'C', - // 'd' => 'D', - // 'e' => 'E', - // 'f' => 'F', - // 'g' => 'G', - // 'h' => 'H', - // 'i' => 'I', - // 'j' => 'J', - // 'k' => 'K', - // 'l' => 'L', - // 'm' => 'M', - // 'n' => 'N', - // 'o' => 'O' - // ]; + public function benchInventoryFiveModels() + { + Page::$models = [ + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E' + ]; - // Dir::inventory(__DIR__ . '/fixtures/inventory/models'); + Dir::inventory(__DIR__ . '/fixtures/inventory/models'); - // Page::$models = []; - // } + Page::$models = []; + } public function benchInventory26Models() - { + { Page::$models = [ 'a' => 'A', 'b' => 'B', @@ -128,5 +83,5 @@ public function benchInventory26Models() Dir::inventory(__DIR__ . '/fixtures/inventory/models'); Page::$models = []; - } + } } From 1942bd0b0a6d62ad729a70c62ba814692d9e94fa Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 12:07:12 +0100 Subject: [PATCH 076/202] Upgrade Psalm --- .github/workflows/backend.yml | 2 +- etc/psalm-plugins/HelperFunctionUsePlugin.php | 3 ++- src/Cms/Helpers.php | 3 +++ src/Filesystem/Dir.php | 10 ++++++---- src/Toolkit/A.php | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index a1b9389137..28752a2590 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -99,7 +99,7 @@ jobs: extensions: ${{ env.extensions }} ini-values: ${{ env.ini }} coverage: pcov - tools: phpunit:10.5.5, psalm:5.15.0 + tools: phpunit:10.5.5, psalm:5.20.0 - name: Setup problem matchers run: | diff --git a/etc/psalm-plugins/HelperFunctionUsePlugin.php b/etc/psalm-plugins/HelperFunctionUsePlugin.php index 03161b315f..3266ee497e 100644 --- a/etc/psalm-plugins/HelperFunctionUsePlugin.php +++ b/etc/psalm-plugins/HelperFunctionUsePlugin.php @@ -27,7 +27,8 @@ public static function afterFunctionCallAnalysis(AfterFunctionCallAnalysisEvent $event->getFunctionId() ); - // if the function is a Kirby helper, consider this function call an issue + // if the function is a Kirby helper, + // consider this function call an issue if ($storage->location->file_path === dirname(__FILE__, 3) . '/config/helpers.php') { IssueBuffer::accepts( new HelperFunctionUse( diff --git a/src/Cms/Helpers.php b/src/Cms/Helpers.php index bb27d8b969..025dccc202 100644 --- a/src/Cms/Helpers.php +++ b/src/Cms/Helpers.php @@ -110,6 +110,9 @@ public static function handleErrors( ) { $override = null; + /** + * @psalm-suppress UndefinedVariable + */ $handler = set_error_handler(function () use (&$override, &$handler, $condition, $fallback) { // check if suppress condition is met $suppress = $condition(...func_get_args()); diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index 17337b6352..d93a49f218 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -290,10 +290,12 @@ public static function inventory( $content = array_unique($content); - return [ - ...$inventory, - 'template' => static::inventoryTemplate($content, $inventory['files']) - ]; + $inventory['template'] = static::inventoryTemplate( + $content, + $inventory['files'] + ); + + return $inventory; } /** diff --git a/src/Toolkit/A.php b/src/Toolkit/A.php index a62d9c2a55..b30b83675f 100644 --- a/src/Toolkit/A.php +++ b/src/Toolkit/A.php @@ -255,7 +255,7 @@ public static function first(array $array): mixed * // result: ['cat' => 'miao', 'dog' => 'wuff']; * * - * @param array $array The source array + * @param mixed $array The source array * @param string|int|array|null $key The key to look for * @param mixed $default Optional default value, which * should be returned if no element From 834a454c5daf238b5f5733b674d9a89696c0765c Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 12:20:02 +0100 Subject: [PATCH 077/202] Fix unit tests --- tests/Filesystem/DirTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Filesystem/DirTest.php b/tests/Filesystem/DirTest.php index a8015fd57d..7f6a3d63ac 100644 --- a/tests/Filesystem/DirTest.php +++ b/tests/Filesystem/DirTest.php @@ -454,9 +454,9 @@ public function testInventoryMultilang() /** * @covers ::inventory - * @covers ::inventoryModels + * @covers ::inventoryChild */ - public function testInventoryModels() + public function testInventoryChildModels() { Page::$models = [ 'a' => 'A', @@ -478,9 +478,9 @@ public function testInventoryModels() /** * @covers ::inventory - * @covers ::inventoryModels + * @covers ::inventoryChild */ - public function testInventoryMultilangModels() + public function testInventoryChildMultilangModels() { new App([ 'roots' => [ From 4009ceda5b2021cf020ef55575fce416623ee2d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nico=20Hoffmann=20=20=E0=B7=B4?= Date: Sat, 3 Feb 2024 21:07:16 +0100 Subject: [PATCH 078/202] Update src/Filesystem/Dir.php Co-authored-by: Bastian Allgeier --- src/Filesystem/Dir.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index d93a49f218..d83df1edcf 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -323,7 +323,7 @@ protected static function inventoryChild( // look if a content file can be found // for any of the available models foreach (Page::$models as $modelName => $modelClass) { - if (file_exists($root . '/' . $modelName . '.' . $contentExtension)) { + if (file_exists($root . '/' . $modelName . '.' . $contentExtension) === true) { $model = $modelName; break; } From c903e6b192617645f2ffc9cdc3bf243a392821b0 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sat, 3 Feb 2024 21:13:49 +0100 Subject: [PATCH 079/202] `Dir::inventory()`: get language code only once --- src/Filesystem/Dir.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index d83df1edcf..5c886b7592 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -232,6 +232,9 @@ public static function inventory( return $inventory; } + // lazily get the default language code + $languageCode = App::instance(null, true)?->defaultLanguage()?->code(); + // a temporary store for all content files $content = []; @@ -254,7 +257,7 @@ public static function inventory( $item, $root, $contentExtension, - $multilang + $languageCode ); continue; } @@ -305,7 +308,7 @@ protected static function inventoryChild( string $item, string $root, string $contentExtension = 'txt', - bool $multilang = false + string|null $languageCode = null ): array { // extract the slug and num of the directory if ($separator = strpos($item, static::$numSeparator)) { @@ -315,9 +318,8 @@ protected static function inventoryChild( // determine the model if (empty(Page::$models) === false) { - if ($multilang === true) { - $code = App::instance()->defaultLanguage()->code(); - $contentExtension = $code . '.' . $contentExtension; + if ($languageCode !== null) { + $contentExtension = $languageCode . '.' . $contentExtension; } // look if a content file can be found From 9da25e8e5c81e9f8aae2589c177a7921e19b3dc4 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sat, 17 Feb 2024 23:54:05 +0100 Subject: [PATCH 080/202] Revert "`Dir::inventory()`: get language code only once" This reverts commit c903e6b192617645f2ffc9cdc3bf243a392821b0. --- src/Filesystem/Dir.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Filesystem/Dir.php b/src/Filesystem/Dir.php index 5c886b7592..d83df1edcf 100644 --- a/src/Filesystem/Dir.php +++ b/src/Filesystem/Dir.php @@ -232,9 +232,6 @@ public static function inventory( return $inventory; } - // lazily get the default language code - $languageCode = App::instance(null, true)?->defaultLanguage()?->code(); - // a temporary store for all content files $content = []; @@ -257,7 +254,7 @@ public static function inventory( $item, $root, $contentExtension, - $languageCode + $multilang ); continue; } @@ -308,7 +305,7 @@ protected static function inventoryChild( string $item, string $root, string $contentExtension = 'txt', - string|null $languageCode = null + bool $multilang = false ): array { // extract the slug and num of the directory if ($separator = strpos($item, static::$numSeparator)) { @@ -318,8 +315,9 @@ protected static function inventoryChild( // determine the model if (empty(Page::$models) === false) { - if ($languageCode !== null) { - $contentExtension = $languageCode . '.' . $contentExtension; + if ($multilang === true) { + $code = App::instance()->defaultLanguage()->code(); + $contentExtension = $code . '.' . $contentExtension; } // look if a content file can be found From 7c8ecb30beed48469fc2a1ce8489f8943092c3ea Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 14:30:12 +0100 Subject: [PATCH 081/202] Add test for `Toolkit\Controller::arguments()` --- tests/Toolkit/ControllerTest.php | 33 +++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/tests/Toolkit/ControllerTest.php b/tests/Toolkit/ControllerTest.php index 0e7cead166..7cf81b5021 100644 --- a/tests/Toolkit/ControllerTest.php +++ b/tests/Toolkit/ControllerTest.php @@ -9,15 +9,6 @@ class ControllerTest extends TestCase { public const FIXTURES = __DIR__ . '/fixtures'; - /** - * @covers ::call - */ - public function testCall() - { - $controller = new Controller(fn () => 'test'); - $this->assertSame('test', $controller->call()); - } - /** * @covers ::arguments */ @@ -47,7 +38,7 @@ public function testArgumentsOrder() /** * @covers ::arguments */ - public function testVariadicArguments() + public function testArgumentsVariadic() { $controller = new Controller(fn ($c, ...$args) => $c . '/' . implode('', $args)); @@ -58,6 +49,26 @@ public function testVariadicArguments() ])); } + /** + * @covers ::arguments + */ + public function testArgumentsNoDefaultNull() + { + $controller = new Controller(fn ($a, $b = 'foo') => ($a === null ? 'null' : $a) . ($b === null ? 'null' : $b)); + + $this->assertSame('nullfoo', $controller->call()); + } + + /** + * @covers ::__construct + * @covers ::call + */ + public function testCall() + { + $controller = new Controller(fn () => 'test'); + $this->assertSame('test', $controller->call()); + } + /** * @covers ::call */ @@ -72,7 +83,7 @@ public function testCallBind() /** * @covers ::call */ - public function testMissingParameter() + public function testCallMissingParameter() { $controller = new Controller(fn ($a) => $a); $this->assertNull($controller->call()); From 54ff1d123bbcfd6e4ba80f37f6bed6c5472c08b6 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 15:35:37 +0100 Subject: [PATCH 082/202] Some unit tests for `Toolkit\Collection` --- tests/Toolkit/CollectionTest.php | 102 +++++++++++++++++++++++++++++-- 1 file changed, 98 insertions(+), 4 deletions(-) diff --git a/tests/Toolkit/CollectionTest.php b/tests/Toolkit/CollectionTest.php index df10cb652a..686cb581c6 100644 --- a/tests/Toolkit/CollectionTest.php +++ b/tests/Toolkit/CollectionTest.php @@ -51,6 +51,16 @@ public function test__debuginfo() $this->assertSame(['a', 'b'], $collection->__debugInfo()); } + /** + * @covers ::__toString + */ + public function test__toString() + { + $collection = new Collection(['a' => 'A', 'b' => 'B']); + $this->assertSame('a
b', $collection->__toString()); + $this->assertSame('a
b', (string)$collection); + } + /** * @covers ::append */ @@ -142,6 +152,30 @@ public function testCount() $this->assertSame(3, count($this->collection)); } + /** + * @covers ::data + */ + public function testData() + { + $collection = new Collection($data = ['a' => 'A', 'b' => 'B']); + $this->assertSame($data, $collection->data()); + + $collection->data($data = ['c' => 'C', 'd' => 'D']); + $this->assertSame($data, $collection->data()); + } + + /** + * @covers ::empty + */ + public function testEmpty() + { + $collection = new Collection($data = ['a' => 'A', 'b' => 'B']); + $this->assertSame($data, $collection->data()); + + $collection = $collection->empty(); + $this->assertSame([], $collection->data()); + } + /** * @covers ::filter */ @@ -237,10 +271,26 @@ public function testGetters() $this->assertSame('My first element', $this->collection->get('first')); $this->assertSame('My second element', $this->collection->get('second')); $this->assertSame('My third element', $this->collection->get('third')); + + $this->assertNull($this->collection->get('fourth')); + } + + /** + * @covers ::__construct + * @covers ::__get + * @covers ::get + */ + public function testGettersCaseSensitive() + { + $collection = new Collection($this->sampleData, true); + + $this->assertSame('My first element', $collection->get('first')); + $this->assertNull($collection->get('FIRst')); } /** * @covers ::group + * @covers ::groupBy */ public function testGroup() { @@ -261,15 +311,17 @@ public function testGroup() 'group' => 'client' ]; - $groups = $collection->group(function ($item) { - return $item['group']; - }); - + $groups = $collection->group(fn ($item) => $item['group']); $this->assertCount(2, $groups->admin()); $this->assertCount(1, $groups->client()); $firstAdmin = $groups->admin()->first(); $this->assertSame('peter', $firstAdmin['username']); + + // alias + $groups = $collection->groupBy(fn ($item) => $item['group']); + $this->assertCount(2, $groups->admin()); + $this->assertCount(1, $groups->client()); } /** @@ -567,6 +619,16 @@ public function testLast() $this->assertSame('My third element', $this->collection->last()); } + /** + * @covers ::map + */ + public function testMap() + { + $collection = new Collection(['a' => 1, 'b' => 2]); + $collection->map(fn ($item) => $item * 2); + $this->assertSame(['a' => 2, 'b' => 4], $collection->data()); + } + /** * @covers ::next * @covers ::prev @@ -871,6 +933,38 @@ public function testToArray() // non-associative $collection = new Collection($input = ['a', 'b', 'c']); $this->assertSame($input, $collection->toArray()); + + // with mapping + $collection = new Collection(['a' => 1, 'b' => 2]); + $this->assertSame(['a' => 2, 'b' => 4], $collection->toArray(fn ($item) => $item * 2)); + } + + /** + * @covers ::toJson + */ + public function testToJson() + { + // associative + $collection = new Collection(['a' => 'value A', 'b' => 'value B']); + $this->assertSame('{"a":"value A","b":"value B"}', $collection->toJson()); + + // non-associative + $collection = new Collection(['a', 'b', 'c']); + $this->assertSame('["a","b","c"]', $collection->toJson()); + } + + /** + * @covers ::toString + */ + public function testToString() + { + // associative + $collection = new Collection(['a' => 'value A', 'b' => 'value B']); + $this->assertSame('a
b', $collection->toString()); + + // non-associative + $collection = new Collection(['a', 'b', 'c']); + $this->assertSame('0
1
2', $collection->toString()); } /** From c988b5d7ae668d8306104c008593ad4e0339d590 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 15:54:24 +0100 Subject: [PATCH 083/202] Add more `Toolkit\Date` unit tests --- tests/Toolkit/DateTest.php | 73 ++++++++++++++++++++++++++++++++++++++ tests/Toolkit/ObjTest.php | 1 + 2 files changed, 74 insertions(+) diff --git a/tests/Toolkit/DateTest.php b/tests/Toolkit/DateTest.php index 72d32813c7..101573b400 100644 --- a/tests/Toolkit/DateTest.php +++ b/tests/Toolkit/DateTest.php @@ -53,6 +53,36 @@ public function test__toString() $this->assertSame('2021-12-12 12:12:12+00:00', (string)$date); } + /** + * @covers ::ceil + */ + public function testCeil() + { + $date = new Date('2021-12-12 12:12:12'); + + $date->ceil('second'); + $this->assertSame('2021-12-12 12:12:13', $date->format('Y-m-d H:i:s')); + + $date->ceil('minute'); + $this->assertSame('2021-12-12 12:13:00', $date->format('Y-m-d H:i:s')); + + $date->ceil('hour'); + $this->assertSame('2021-12-12 13:00:00', $date->format('Y-m-d H:i:s')); + + $date->ceil('day'); + $this->assertSame('2021-12-13 00:00:00', $date->format('Y-m-d H:i:s')); + + $date->ceil('month'); + $this->assertSame('2022-01-01 00:00:00', $date->format('Y-m-d H:i:s')); + + $date->ceil('year'); + $this->assertSame('2023-01-01 00:00:00', $date->format('Y-m-d H:i:s')); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Invalid rounding unit'); + $date->ceil('foo'); + } + /** * @covers ::compare */ @@ -77,6 +107,36 @@ public function testDay() $this->assertSame('2021-12-13', $date->format('Y-m-d')); } + /** + * @covers ::floor + */ + public function testFloor() + { + $date = new Date('2021-12-12 12:12:12'); + + $date->floor('second'); + $this->assertSame('2021-12-12 12:12:12', $date->format('Y-m-d H:i:s')); + + $date->floor('minute'); + $this->assertSame('2021-12-12 12:12:00', $date->format('Y-m-d H:i:s')); + + $date->floor('hour'); + $this->assertSame('2021-12-12 12:00:00', $date->format('Y-m-d H:i:s')); + + $date->floor('day'); + $this->assertSame('2021-12-12 00:00:00', $date->format('Y-m-d H:i:s')); + + $date->floor('month'); + $this->assertSame('2021-12-01 00:00:00', $date->format('Y-m-d H:i:s')); + + $date->floor('year'); + $this->assertSame('2021-01-01 00:00:00', $date->format('Y-m-d H:i:s')); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Invalid rounding unit'); + $date->floor('foo'); + } + /** * @covers ::hour */ @@ -241,6 +301,19 @@ public function testMonth() $this->assertSame('2021-11-12', $date->format('Y-m-d')); } + /** + * @covers ::nearest + */ + public function testNearest() + { + $date = new Date('2021-12-12'); + $a = new Date('2021-12-11'); + $b = new Date('2021-12-15'); + $c = new Date('2021-11-11'); + + $this->assertSame($a, $date->nearest($a, $b, $c)); + } + /** * @covers ::now */ diff --git a/tests/Toolkit/ObjTest.php b/tests/Toolkit/ObjTest.php index 01c7cc5ff2..351d59ee50 100644 --- a/tests/Toolkit/ObjTest.php +++ b/tests/Toolkit/ObjTest.php @@ -10,6 +10,7 @@ class ObjTest extends TestCase { /** + * covers ::__construct * @covers ::__call */ public function test__call() From 8eee97dc91dc0b8b715bd983969e239cd61289ca Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 15:57:42 +0100 Subject: [PATCH 084/202] Fix `Toolkit\Dom` coverage annotations --- src/Toolkit/Dom.php | 10 ++++------ tests/Toolkit/DomTest.php | 4 ++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Toolkit/Dom.php b/src/Toolkit/Dom.php index 2b858f048d..4b42d7af77 100644 --- a/src/Toolkit/Dom.php +++ b/src/Toolkit/Dom.php @@ -710,7 +710,7 @@ protected static function normalizeSanitizeOptions(array $options): array return $options; } - $options = array_merge([ + return [ 'allowedAttrPrefixes' => [], 'allowedAttrs' => true, 'allowedDataUris' => true, @@ -724,11 +724,9 @@ protected static function normalizeSanitizeOptions(array $options): array 'doctypeCallback' => null, 'elementCallback' => null, 'urlAttrs' => ['href', 'src', 'xlink:href'], - ], $options); - - $options['_normalized'] = true; - - return $options; + ...$options, + '_normalized' => true + ]; } /** diff --git a/tests/Toolkit/DomTest.php b/tests/Toolkit/DomTest.php index 839d62a02c..80fe487a7c 100644 --- a/tests/Toolkit/DomTest.php +++ b/tests/Toolkit/DomTest.php @@ -631,6 +631,7 @@ public static function isAllowedAttrProvider(): array /** * @dataProvider isAllowedAttrProvider * @covers ::isAllowedAttr + * @covers ::normalizeSanitizeOptions */ public function testIsAllowedAttr(string $tag, string $attr, $allowedAttrs, $allowedAttrPrefixes, $allowedTags, $expected) { @@ -790,6 +791,7 @@ public static function isAllowedGlobalAttrProvider(): array /** * @dataProvider isAllowedGlobalAttrProvider * @covers ::isAllowedGlobalAttr + * @covers ::normalizeSanitizeOptions */ public function testIsAllowedGlobalAttr(string $name, $allowedAttrs, $allowedAttrPrefixes, $expected) { @@ -941,6 +943,7 @@ public static function isAllowedUrlProvider(): array /** * @dataProvider isAllowedUrlProvider * @covers ::isAllowedUrl + * @covers ::normalizeSanitizeOptions */ public function testIsAllowedUrl(string $url, $expected, array $options = []) { @@ -1253,6 +1256,7 @@ public static function listContainsNameProvider(): array /** * @dataProvider listContainsNameProvider * @covers ::listContainsName + * @covers ::normalizeSanitizeOptions */ public function testListContainsName(array $list, array $node, $allowedNamespaces, string|null $compare, $expected) { From 4f8ddea74b4592281bb2b2e3dec2641ab8052bb5 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 16:06:47 +0100 Subject: [PATCH 085/202] Add coverage annotations to `Toolkit\Component` --- tests/Toolkit/ComponentTest.php | 91 ++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 6 deletions(-) diff --git a/tests/Toolkit/ComponentTest.php b/tests/Toolkit/ComponentTest.php index 31106e2f18..565382a45e 100644 --- a/tests/Toolkit/ComponentTest.php +++ b/tests/Toolkit/ComponentTest.php @@ -5,6 +5,9 @@ use Kirby\Exception\Exception; use Kirby\Exception\InvalidArgumentException; +/** + * @coversDefaultClass \Kirby\Toolkit\Component + */ class ComponentTest extends TestCase { public function tearDown(): void @@ -13,14 +16,17 @@ public function tearDown(): void Component::$mixins = []; } + /** + * @covers ::__construct + * @covers ::__call + * @covers ::applyProps + */ public function testProp() { Component::$types = [ 'test' => [ 'props' => [ - 'prop' => function ($prop) { - return $prop; - } + 'prop' => fn ($prop) => $prop ] ] ]; @@ -31,14 +37,15 @@ public function testProp() $this->assertSame('prop value', $component->prop); } + /** + * @covers ::applyProps + */ public function testPropWithDefaultValue() { Component::$types = [ 'test' => [ 'props' => [ - 'prop' => function ($prop = 'default value') { - return $prop; - } + 'prop' => fn ($prop = 'default value') => $prop ] ] ]; @@ -49,6 +56,9 @@ public function testPropWithDefaultValue() $this->assertSame('default value', $component->prop); } + /** + * @covers ::applyProps + */ public function testPropWithFixedValue() { Component::$types = [ @@ -65,6 +75,9 @@ public function testPropWithFixedValue() $this->assertSame('test', $component->prop); } + /** + * @covers ::__construct + */ public function testAttrs() { Component::$types = [ @@ -77,6 +90,11 @@ public function testAttrs() $this->assertSame('bar', $component->foo); } + /** + * @covers ::__construct + * @covers ::__call + * @covers ::applyComputed + */ public function testComputed() { Component::$types = [ @@ -93,6 +111,11 @@ public function testComputed() $this->assertSame('computed prop', $component->prop); } + /** + * @covers ::__construct + * @covers ::__call + * @covers ::applyComputed + */ public function testComputedFromProp() { Component::$types = [ @@ -111,6 +134,10 @@ public function testComputedFromProp() $this->assertSame('computed: prop value', $component->prop()); } + /** + * @covers ::__construct + * @covers ::__call + */ public function testMethod() { Component::$types = [ @@ -126,6 +153,10 @@ public function testMethod() $this->assertSame('hello world', $component->say()); } + /** + * @covers ::__construct + * @covers ::__call + */ public function testPropsInMethods() { Component::$types = [ @@ -144,6 +175,10 @@ public function testPropsInMethods() $this->assertSame('hello world', $component->say()); } + /** + * @covers ::__construct + * @covers ::__call + */ public function testComputedPropsInMethods() { Component::$types = [ @@ -165,6 +200,10 @@ public function testComputedPropsInMethods() $this->assertSame('HELLO WORLD', $component->say()); } + /** + * @covers ::toArray + * @covers ::__debugInfo + */ public function testToArray() { Component::$types = [ @@ -188,6 +227,10 @@ public function testToArray() $this->assertSame($expected, $component->__debugInfo()); } + /** + * @covers ::toArray + * @covers ::__debugInfo + */ public function testCustomToArray() { Component::$types = [ @@ -203,6 +246,9 @@ public function testCustomToArray() $this->assertSame(['foo' => 'bar'], $component->toArray()); } + /** + * @covers ::__construct + */ public function testInvalidType() { $this->expectException(InvalidArgumentException::class); @@ -211,6 +257,9 @@ public function testInvalidType() new Component('test'); } + /** + * @covers ::load + */ public function testLoadInvalidFile() { Component::$types = ['foo' => 'bar']; @@ -220,6 +269,10 @@ public function testLoadInvalidFile() Component::load('foo'); } + /** + * @covers ::__construct + * @covers ::setup + */ public function testMixins() { Component::$mixins = [ @@ -244,4 +297,30 @@ public function testMixins() $this->assertSame('HELLO WORLD', $component->message()); $this->assertSame('HELLO WORLD', $component->message); } + + /** + * @covers ::__get + */ + public function testGetInvalidProp() + { + Component::$types = [ + 'test' => [] + ]; + + $component = new Component('test'); + $this->assertNull($component->foo); + } + + /** + * @covers ::defaults + */ + public function testDefaults() + { + Component::$types = [ + 'test' => [] + ]; + + $component = new Component('test'); + $this->assertSame([], $component->defaults()); + } } From ad9f9aa4f6f915626b3bc2d86a62bf133be565c1 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 18:57:05 +0100 Subject: [PATCH 086/202] Improve `Text` package unit tests and coverage --- src/Text/KirbyTag.php | 2 +- tests/Text/FileKirbyTagTest.php | 170 +++++++ tests/Text/ImageKirbyTagTest.php | 256 ++++++++++ tests/Text/KirbyTagTest.php | 188 +++++++- tests/Text/KirbyTagsTest.php | 772 +------------------------------ tests/Text/LinkKirbyTagTest.php | 245 ++++++++++ tests/Text/MarkdownTest.php | 11 + tests/Text/VideoKirbyTagTest.php | 256 ++++++++++ tests/Text/fixtures/inline.html | 6 + tests/Text/fixtures/inline.md | 6 + 10 files changed, 1121 insertions(+), 791 deletions(-) create mode 100644 tests/Text/FileKirbyTagTest.php create mode 100644 tests/Text/ImageKirbyTagTest.php create mode 100644 tests/Text/LinkKirbyTagTest.php create mode 100644 tests/Text/VideoKirbyTagTest.php create mode 100644 tests/Text/fixtures/inline.html create mode 100644 tests/Text/fixtures/inline.md diff --git a/src/Text/KirbyTag.php b/src/Text/KirbyTag.php index 1d9736860d..bf62924bf6 100644 --- a/src/Text/KirbyTag.php +++ b/src/Text/KirbyTag.php @@ -219,7 +219,7 @@ public static function parse( */ public function parent(): ModelWithContent|null { - return $this->data['parent']; + return $this->data['parent'] ?? null; } public function render(): string diff --git a/tests/Text/FileKirbyTagTest.php b/tests/Text/FileKirbyTagTest.php new file mode 100644 index 0000000000..3054d81bda --- /dev/null +++ b/tests/Text/FileKirbyTagTest.php @@ -0,0 +1,170 @@ +app = new App([ + 'roots' => [ + 'index' => static::TMP + ] + ]); + + Dir::make(static::TMP); + } + + public function tearDown(): void + { + Dir::remove(static::TMP); + } + + public function testFile() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(file: a.jpg)' + ], + 'files' => [ + [ + 'filename' => 'a.jpg', + ] + ] + ] + ] + ] + ]); + + $page = $kirby->page('a'); + $file = $page->file('a.jpg'); + + $expected = '

a.jpg

'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testFileWithUUID() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(file: file://file-a)', + 'uuid' => 'page-uuid' // this is just to make sure that the test doesn't try to create a content file for this page with a generated UUID + ], + 'files' => [ + [ + 'filename' => 'a.jpg', + 'content' => ['uuid' => 'file-a'] + ] + ] + ] + ] + ] + ]); + + $page = $kirby->page('a'); + $file = $page->file('a.jpg'); + + $expected = '

a.jpg

'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testFileDoesNotExist() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(file: a.jpg) (file: b.jpg text: b)' + ] + ], + + ] + ] + ]); + + $page = $kirby->page('a'); + + $this->assertSame('

a.jpg b

', $page->text()->kt()->value()); + } + + public function testFileWithDisabledDownloadOption() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(file: a.jpg download: false)' + ], + 'files' => [ + [ + 'filename' => 'a.jpg', + ] + ] + ] + ] + ] + ]); + + $page = $kirby->page('a'); + $file = $page->file('a.jpg'); + + $expected = '

a.jpg

'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testFileWithinFile() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'files' => [ + [ + 'filename' => 'a.jpg', + 'content' => [ + 'caption' => '(file: b.jpg)' + ] + ], + [ + 'filename' => 'b.jpg' + ] + ] + ] + ] + ] + ]); + + $a = $kirby->file('a/a.jpg'); + $b = $kirby->file('a/b.jpg'); + $expected = '

b.jpg

'; + + $this->assertSame($expected, $a->caption()->kt()->value()); + } +} diff --git a/tests/Text/ImageKirbyTagTest.php b/tests/Text/ImageKirbyTagTest.php new file mode 100644 index 0000000000..e4fbde3270 --- /dev/null +++ b/tests/Text/ImageKirbyTagTest.php @@ -0,0 +1,256 @@ +app = new App([ + 'roots' => [ + 'index' => static::TMP + ] + ]); + + Dir::make(static::TMP); + } + + public function tearDown(): void + { + Dir::remove(static::TMP); + } + + public function testWithoutFigure() + { + $kirby = $this->app->clone([ + 'options' => [ + 'kirbytext' => [ + 'image' => [ + 'figure' => false + ] + ] + ] + ]); + + $expected = ''; + + $this->assertSame($expected, $kirby->kirbytext('(image: https://test.com/something.jpg)')); + } + + public function testWithCaption() + { + $kirby = $this->app->clone(); + $expected = '
This is an awesome image and this a link
'; + + $this->assertSame($expected, $kirby->kirbytext('(image: myimage.jpg caption: This is an *awesome* image and this a link)')); + } + + public function testWithSrcset() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(image: image.jpg srcset: 200, 300)' + ], + 'files' => [ + [ + 'filename' => 'image.jpg', + ] + ] + ] + ] + ] + ]); + + $page = $kirby->page('a'); + $image = $page->file('image.jpg'); + + $expected = '
'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testWithSrcsetFromThumbsOption() + { + $kirby = $this->app->clone([ + 'options' => [ + 'thumbs' => [ + 'srcsets' => [ + 'album' => [ + '800w' => ['width' => 800], + '1024w' => ['width' => 1024] + ] + ] + ] + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(image: image.jpg srcset: album)' + ], + 'files' => [ + [ + 'filename' => 'image.jpg', + ] + ] + ] + ] + ] + ]); + + $page = $kirby->page('a'); + $image = $page->file('image.jpg'); + + $expected = '
'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testWithSrcsetFromDefaults() + { + $kirby = $this->app->clone([ + 'options' => [ + 'kirbytext' => [ + 'image' => [ + 'srcset' => [200, 300] + ] + ] + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(image: image.jpg)' + ], + 'files' => [ + [ + 'filename' => 'image.jpg', + ] + ] + ] + ] + ] + ]); + + $page = $kirby->page('a'); + $image = $page->file('image.jpg'); + + $expected = '
'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testWithFileLink() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(image: image.jpg link: document.pdf)' + ], + 'files' => [ + [ + 'filename' => 'image.jpg', + ], + [ + 'filename' => 'document.pdf', + ] + ] + ] + ] + ] + ]); + + $page = $kirby->page('a'); + $image = $page->file('image.jpg'); + $doc = $page->file('document.pdf'); + + $expected = '
'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testWithFileUUID() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => [ + 'text' => '(image: file://image-uuid)', + 'uuid' => 'page-uuid' // this is just to make sure that the test doesn't try to create a content file for this page with a generated UUID + ], + 'files' => [ + [ + 'filename' => 'image.jpg', + 'content' => ['uuid' => 'image-uuid'] + ] + ] + ] + ] + ] + ]); + + $page = $kirby->page('a'); + $image = $page->file('image.jpg'); + + $expected = '
'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testWithParent() + { + $app = new App([ + 'roots' => [ + 'index' => '/dev/null', + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'files' => [ + [ + 'filename' => 'a.jpg' + ], + [ + 'filename' => 'b.jpg' + ], + [ + 'filename' => 'c.jpg' + ] + ] + ] + ] + ] + ]); + + $page = $app->page('a'); + $image = $page->image('b.jpg'); + $expected = '
'; + + $this->assertSame($expected, $app->kirbytag('image', 'b.jpg', [], [ + 'parent' => $page, + ])); + } +} diff --git a/tests/Text/KirbyTagTest.php b/tests/Text/KirbyTagTest.php index 466410bed8..45d6d1a7e0 100644 --- a/tests/Text/KirbyTagTest.php +++ b/tests/Text/KirbyTagTest.php @@ -12,6 +12,8 @@ */ class KirbyTagTest extends TestCase { + public const TMP = KIRBY_TMP_DIR . '/Text.KirbyTag'; + public function setUp(): void { KirbyTag::$types = [ @@ -161,6 +163,148 @@ public function testFactory() $this->assertSame('test: test value-attrA-attrB', $result); } + /** + * @covers ::file + */ + public function testFile() + { + $app = new App([ + 'roots' => [ + 'index' => static::TMP + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'files' => [ + [ + 'filename' => 'a.jpg' + ] + ] + ] + ] + ] + ]); + + $page = $app->page('a'); + $file = $page->file('a.jpg'); + $tag = new KirbyTag('image', 'foo'); + $this->assertSame($file, $tag->file('a/a.jpg')); + } + + /** + * @covers ::file + */ + public function testFileInParent() + { + $app = new App([ + 'roots' => [ + 'index' => static::TMP + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'files' => [ + [ + 'filename' => 'a.jpg' + ] + ] + ] + ] + ] + ]); + + $page = $app->page('a'); + $file = $page->file('a.jpg'); + $tag = new KirbyTag('image', 'foo', [], [ + 'parent' => $page, + ]); + $this->assertSame($file, $tag->file('a.jpg')); + } + + /** + * @covers ::file + */ + public function testFileInFileParent() + { + $app = new App([ + 'roots' => [ + 'index' => static::TMP + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'files' => [ + [ + 'filename' => 'a.jpg' + ] + ] + ] + ] + ] + ]); + + $page = $app->page('a'); + $file = $page->file('a.jpg'); + $tag = new KirbyTag('image', 'foo', [], [ + 'parent' => $file, + ]); + $this->assertSame($file, $tag->file('a.jpg')); + } + + /** + * @covers ::file + */ + public function testFileFromUuid() + { + $app = new App([ + 'roots' => [ + 'index' => static::TMP + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'files' => [ + [ + 'filename' => 'a.jpg', + 'content' => ['uuid' => 'image-uuid'] + ] + ] + ] + ] + ] + ]); + + $page = $app->page('a'); + $file = $page->file('a.jpg'); + $tag = new KirbyTag('image', 'foo'); + $this->assertSame($file, $tag->file('file://image-uuid')); + + // with parent + $tag = new KirbyTag('image', 'foo', [], [ + 'parent' => $page, + ]); + $this->assertSame($file, $tag->file('file://image-uuid')); + } + + /** + * @covers ::kirby + */ + public function testKirby() + { + $app = new App([ + 'roots' => [ + 'index' => '/dev/null', + ] + ]); + + $tag = new KirbyTag('image', 'b.jpg'); + $this->assertSame($app, $tag->kirby()); + } + /** * @covers ::option */ @@ -188,7 +332,10 @@ public function testOption() $this->assertSame('optionC', $tag->option('c', 'optionC')); } - public function testWithParent() + /** + * @covers ::parent + */ + public function testParent() { $app = new App([ 'roots' => [ @@ -201,12 +348,6 @@ public function testWithParent() 'files' => [ [ 'filename' => 'a.jpg' - ], - [ - 'filename' => 'b.jpg' - ], - [ - 'filename' => 'c.jpg' ] ] ] @@ -214,25 +355,12 @@ public function testWithParent() ] ]); - $page = $app->page('a'); - $image = $page->image('b.jpg'); - $expected = '
'; - - $this->assertSame($expected, $app->kirbytag('image', 'b.jpg', [], [ + $page = $app->page('a'); + $tag = new KirbyTag('image', 'b.jpg', [], [ 'parent' => $page, - ])); - } + ]); - /** - * @covers ::parse - * @dataProvider parseProvider - */ - public function testParse(string $string, array $data, array $options, array $expected) - { - $tag = KirbyTag::parse($string, $data, $options); - foreach ($expected as $key => $value) { - $this->assertSame($value, $tag->$key); - } + $this->assertSame($page, $tag->parent()); } public static function parseProvider(): array @@ -386,6 +514,18 @@ public static function parseProvider(): array ]; } + /** + * @covers ::parse + * @dataProvider parseProvider + */ + public function testParse(string $string, array $data, array $options, array $expected) + { + $tag = KirbyTag::parse($string, $data, $options); + foreach ($expected as $key => $value) { + $this->assertSame($value, $tag->$key); + } + } + /** * @covers ::render */ diff --git a/tests/Text/KirbyTagsTest.php b/tests/Text/KirbyTagsTest.php index 4bcc91f025..51fbd39e92 100644 --- a/tests/Text/KirbyTagsTest.php +++ b/tests/Text/KirbyTagsTest.php @@ -5,7 +5,6 @@ use Exception; use Kirby\Cms\App; use Kirby\Exception\InvalidArgumentException; -use Kirby\Exception\NotFoundException; use Kirby\Filesystem\Dir; use Kirby\Filesystem\F; use Kirby\TestCase; @@ -234,549 +233,14 @@ public function testWithMarkdownExtra($kirbytext, $expected) $this->assertSame($expected, $kirby->kirbytext($kirbytext)); } - public function testImageWithoutFigure() - { - $kirby = $this->app->clone([ - 'options' => [ - 'kirbytext' => [ - 'image' => [ - 'figure' => false - ] - ] - ] - ]); - - $expected = ''; - - $this->assertSame($expected, $kirby->kirbytext('(image: https://test.com/something.jpg)')); - } - - public function testImageWithCaption() - { - $kirby = $this->app->clone(); - $expected = '
This is an awesome image and this a link
'; - - $this->assertSame($expected, $kirby->kirbytext('(image: myimage.jpg caption: This is an *awesome* image and this a link)')); - } - - public function testImageWithSrcset() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(image: image.jpg srcset: 200, 300)' - ], - 'files' => [ - [ - 'filename' => 'image.jpg', - ] - ] - ] - ] - ] - ]); - - $page = $kirby->page('a'); - $image = $page->file('image.jpg'); - - $expected = '
'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testImageWithSrcsetFromThumbsOption() - { - $kirby = $this->app->clone([ - 'options' => [ - 'thumbs' => [ - 'srcsets' => [ - 'album' => [ - '800w' => ['width' => 800], - '1024w' => ['width' => 1024] - ] - ] - ] - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(image: image.jpg srcset: album)' - ], - 'files' => [ - [ - 'filename' => 'image.jpg', - ] - ] - ] - ] - ] - ]); - - $page = $kirby->page('a'); - $image = $page->file('image.jpg'); - - $expected = '
'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testImageWithSrcsetFromDefaults() - { - $kirby = $this->app->clone([ - 'options' => [ - 'kirbytext' => [ - 'image' => [ - 'srcset' => [200, 300] - ] - ] - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(image: image.jpg)' - ], - 'files' => [ - [ - 'filename' => 'image.jpg', - ] - ] - ] - ] - ] - ]); - - $page = $kirby->page('a'); - $image = $page->file('image.jpg'); - - $expected = '
'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testImageWithFileLink() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(image: image.jpg link: document.pdf)' - ], - 'files' => [ - [ - 'filename' => 'image.jpg', - ], - [ - 'filename' => 'document.pdf', - ] - ] - ] - ] - ] - ]); - - $page = $kirby->page('a'); - $image = $page->file('image.jpg'); - $doc = $page->file('document.pdf'); - - $expected = '
'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testImageWithFileUUID() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(image: file://image-uuid)', - 'uuid' => 'page-uuid' // this is just to make sure that the test doesn't try to create a content file for this page with a generated UUID - ], - 'files' => [ - [ - 'filename' => 'image.jpg', - 'content' => ['uuid' => 'image-uuid'] - ] - ] - ] - ] - ] - ]); - - $page = $kirby->page('a'); - $image = $page->file('image.jpg'); - - $expected = '
'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testFile() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(file: a.jpg)' - ], - 'files' => [ - [ - 'filename' => 'a.jpg', - ] - ] - ] - ] - ] - ]); - - $page = $kirby->page('a'); - $file = $page->file('a.jpg'); - - $expected = '

a.jpg

'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testFileWithUUID() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(file: file://file-a)', - 'uuid' => 'page-uuid' // this is just to make sure that the test doesn't try to create a content file for this page with a generated UUID - ], - 'files' => [ - [ - 'filename' => 'a.jpg', - 'content' => ['uuid' => 'file-a'] - ] - ] - ] - ] - ] - ]); - - $page = $kirby->page('a'); - $file = $page->file('a.jpg'); - - $expected = '

a.jpg

'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testFileDoesNotExist() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(file: a.jpg) (file: b.jpg text: b)' - ] - ], - - ] - ] - ]); - - $page = $kirby->page('a'); - - $this->assertSame('

a.jpg b

', $page->text()->kt()->value()); - } - - public function testFileWithDisabledDownloadOption() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => [ - 'text' => '(file: a.jpg download: false)' - ], - 'files' => [ - [ - 'filename' => 'a.jpg', - ] - ] - ] - ] - ] - ]); - - $page = $kirby->page('a'); - $file = $page->file('a.jpg'); - - $expected = '

a.jpg

'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testFileWithinFile() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'files' => [ - [ - 'filename' => 'a.jpg', - 'content' => [ - 'caption' => '(file: b.jpg)' - ] - ], - [ - 'filename' => 'b.jpg' - ] - ] - ] - ] - ] - ]); - - $a = $kirby->file('a/a.jpg'); - $b = $kirby->file('a/b.jpg'); - $expected = '

b.jpg

'; - - $this->assertSame($expected, $a->caption()->kt()->value()); - } - - public function testLinkWithLangAttribute() - { - $app = $this->app->clone([ - 'urls' => [ - 'index' => 'https://getkirby.com' - ], - 'languages' => [ - 'en' => [ - 'code' => 'en' - ], - 'de' => [ - 'code' => 'de' - ] - ], - 'site' => [ - 'children' => [ - ['slug' => 'a'] - ] - ] - ]); - - $this->assertSame('getkirby.com/en/a', $app->kirbytags('(link: a lang: en)')); - $this->assertSame('getkirby.com/de/a', $app->kirbytags('(link: a lang: de)')); - } - - public function testLinkWithHash() - { - $app = $this->app->clone([ - 'urls' => [ - 'index' => 'https://getkirby.com' - ], - 'languages' => [ - 'en' => [ - 'code' => 'en' - ], - 'de' => [ - 'code' => 'de' - ] - ], - 'site' => [ - 'children' => [ - ['slug' => 'a'] - ] - ] - ]); - - $this->assertSame('getkirby.com/en/a', $app->kirbytags('(link: a)')); - $this->assertSame('getkirby.com/de/a', $app->kirbytags('(link: a lang: de)')); - $this->assertSame('getkirby.com/en/a', $app->kirbytags('(link: a#anchor lang: en)')); - $this->assertSame('getkirby.com/de/a', $app->kirbytags('(link: a#anchor lang: de)')); - } - - public function testLinkWithUuid() - { - $app = $this->app->clone([ - 'urls' => [ - 'index' => 'https://getkirby.com' - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => ['uuid' => 'page-uuid'], - 'files' => [ - [ - 'filename' => 'foo.jpg', - 'content' => ['uuid' => 'file-uuid'], - ] - ] - ] - ] - ] - ]); - - $result = $app->kirbytags('(link: page://page-uuid)'); - $this->assertSame('getkirby.com/a', $result); - - $result = $app->kirbytags('(link: page://not-exists)'); - $this->assertSame('getkirby.com/error', $result); - - $result = $app->kirbytags('(link: file://file-uuid text: file)'); - $this->assertSame('file', $result); - - $result = $app->kirbytags('(link: file://not-exists text: file)'); - $this->assertSame('file', $result); - } - - public function testLinkWithUuidDebug() - { - $app = $this->app->clone([ - 'urls' => [ - 'index' => 'https://getkirby.com' - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => ['uuid' => 'page-uuid'], - 'files' => [ - [ - 'filename' => 'foo.jpg', - 'content' => ['uuid' => 'file-uuid'], - ] - ] - ] - ] - ], - 'options' => [ - 'debug' => true - ] - ]); - - $this->expectException(NotFoundException::class); - $this->expectExceptionMessage('The linked page cannot be found'); - - $app->kirbytags('(link: page://not-exists)'); - } - - public function testLinkWithUuidDebugText() - { - $app = $this->app->clone([ - 'urls' => [ - 'index' => 'https://getkirby.com' - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'content' => ['uuid' => 'page-uuid'], - 'files' => [ - [ - 'filename' => 'foo.jpg', - 'content' => ['uuid' => 'file-uuid'], - ] - ] - ] - ] - ], - 'options' => [ - 'debug' => true - ] - ]); - - $this->expectException(NotFoundException::class); - $this->expectExceptionMessage('The linked page cannot be found for the link text "click here"'); - - $app->kirbytags('(link: page://not-exists text: click here)'); - } - - public function testLinkWithUuidAndLang() - { - $app = $this->app->clone([ - 'urls' => [ - 'index' => 'https://getkirby.com' - ], - 'languages' => [ - [ - 'code' => 'en', - 'name' => 'English', - 'default' => true, - 'locale' => 'en_US', - 'url' => '/', - ], - [ - 'code' => 'de', - 'name' => 'Deutsch', - 'locale' => 'de_DE', - 'url' => '/de', - ], - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'a', - 'files' => [ - [ - 'filename' => 'foo.jpg', - 'translations' => [ - [ - 'code' => 'en', - 'content' => ['uuid' => 'file-uuid'] - ], - [ - 'code' => 'de', - 'content' => [] - ] - ] - ] - ], - 'translations' => [ - [ - 'code' => 'en', - 'content' => ['uuid' => 'page-uuid'] - ], - [ - 'code' => 'de', - 'content' => ['slug' => 'ae'] - ] - ] - ] - ] - ] - ]); - - $result = $app->kirbytags('(link: page://page-uuid lang: de)'); - $this->assertSame('getkirby.com/de/ae', $result); - - $result = $app->kirbytags('(link: file://file-uuid text: file lang: de)'); - $this->assertSame('file', $result); - } - + /** + * @coversNothing + */ public function testHooks() { $app = $this->app->clone([ 'hooks' => [ - 'kirbytags:before' => function ($text, $data, $options) { - return 'before'; - }, + 'kirbytags:before' => fn ($text, $data, $options) => 'before' ] ]); @@ -784,238 +248,13 @@ public function testHooks() $app = $app->clone([ 'hooks' => [ - 'kirbytags:after' => function ($text, $data, $options) { - return 'after'; - }, + 'kirbytags:after' => fn ($text, $data, $options) => 'after' ] ]); $this->assertSame('after', $app->kirbytags('test')); } - public function testVideoLocal() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'test', - 'content' => [ - 'text' => '(video: sample.mp4)' - ], - 'files' => [ - ['filename' => 'sample.mp4'] - ] - ] - ] - ] - ]); - - $page = $kirby->page('test'); - $image = $page->file('sample.mp4'); - - $expected = '
'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testVideoInlineAttrs() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'test', - 'content' => [ - 'text' => '(video: sample.mp4 - autoplay: true - caption: Lorem ipsum - controls: false - class: video-class - height: 350 - loop: true - muted: true - playsinline: true - poster: sample.jpg - preload: auto - style: border: none - width: 500)' - ], - 'files' => [ - ['filename' => 'sample.mp4'], - ['filename' => 'sample.jpg'] - ] - ] - ] - ] - ]); - - $page = $kirby->page('test'); - - $image = $page->file('sample.jpg'); - $video = $page->file('sample.mp4'); - - $expected = '
Lorem ipsum
'; - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testVideoPredefinedAttrs() - { - $kirby = $this->app->clone([ - 'options' => [ - 'kirbytext' => [ - 'video' => [ - 'autoplay' => true, - 'caption' => 'Lorem ipsum', - 'controls' => false, - 'class' => 'video-class', - 'height' => 350, - 'loop' => true, - 'muted' => true, - 'playsinline' => true, - 'poster' => 'sample.jpg', - 'preload' => 'auto', - 'style' => 'border: none', - 'width' => 500 - ] - ] - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'test', - 'content' => [ - 'text' => '(video: sample.mp4)' - ], - 'files' => [ - ['filename' => 'sample.mp4'], - ['filename' => 'sample.jpg'] - ] - ] - ] - ] - ]); - - $page = $kirby->page('test'); - - $image = $page->file('sample.jpg'); - $video = $page->file('sample.mp4'); - - $expected = '
Lorem ipsum
'; - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testVideoAutoplayRelatedAttrs() - { - $kirby = new App([ - 'roots' => [ - 'index' => '/dev/null', - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'test', - 'content' => [ - 'text' => '(video: sample.mp4 autoplay: true)' - ], - 'files' => [ - ['filename' => 'sample.mp4'] - ] - ] - ] - ] - ]); - - $page = $kirby->page('test'); - $video = $page->file('sample.mp4'); - - $expected = '
'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testVideoAutoplayAttrsOverride() - { - $kirby = new App([ - 'roots' => [ - 'index' => '/dev/null', - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'test', - 'content' => [ - 'text' => '(video: sample.mp4 autoplay: true muted: false playsinline: false)' - ], - 'files' => [ - ['filename' => 'sample.mp4'] - ] - ] - ] - ] - ]); - - $page = $kirby->page('test'); - $image = $page->file('sample.mp4'); - - $expected = '
'; - - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testVideoOptions() - { - $kirby = $this->app->clone([ - 'options' => [ - 'kirbytext' => [ - 'video' => [ - 'options' => [ - 'youtube' => [ - 'controls' => 0 - ] - ] - ] - ] - ], - 'site' => [ - 'children' => [ - [ - 'slug' => 'test', - 'content' => [ - 'text' => '(video: https://www.youtube.com/watch?v=VhP7ZzZysQg)' - ] - ] - ] - ] - ]); - - $page = $kirby->page('test'); - - $expected = '
'; - $this->assertSame($expected, $page->text()->kt()->value()); - } - - public function testVideoRemote() - { - $kirby = $this->app->clone([ - 'site' => [ - 'children' => [ - [ - 'slug' => 'test', - 'content' => [ - 'text' => '(video: https://getkirby.com/sample.mp4)' - ] - ] - ] - ] - ]); - - $page = $kirby->page('test'); - - $expected = '
'; - $this->assertSame($expected, $page->text()->kt()->value()); - } - public static function globalOptionsProvider(): array { return [ @@ -1039,6 +278,7 @@ public static function globalOptionsProvider(): array } /** + * @coversNothing * @dataProvider globalOptionsProvider */ public function testGlobalOptions($kirbytext, $expected) diff --git a/tests/Text/LinkKirbyTagTest.php b/tests/Text/LinkKirbyTagTest.php new file mode 100644 index 0000000000..47a937c070 --- /dev/null +++ b/tests/Text/LinkKirbyTagTest.php @@ -0,0 +1,245 @@ +app = new App([ + 'roots' => [ + 'index' => static::TMP + ] + ]); + + Dir::make(static::TMP); + } + + public function tearDown(): void + { + Dir::remove(static::TMP); + } + + public function testWithLangAttribute() + { + $app = $this->app->clone([ + 'urls' => [ + 'index' => 'https://getkirby.com' + ], + 'languages' => [ + 'en' => [ + 'code' => 'en' + ], + 'de' => [ + 'code' => 'de' + ] + ], + 'site' => [ + 'children' => [ + ['slug' => 'a'] + ] + ] + ]); + + $this->assertSame('getkirby.com/en/a', $app->kirbytags('(link: a lang: en)')); + $this->assertSame('getkirby.com/de/a', $app->kirbytags('(link: a lang: de)')); + } + + public function testWithHash() + { + $app = $this->app->clone([ + 'urls' => [ + 'index' => 'https://getkirby.com' + ], + 'languages' => [ + 'en' => [ + 'code' => 'en' + ], + 'de' => [ + 'code' => 'de' + ] + ], + 'site' => [ + 'children' => [ + ['slug' => 'a'] + ] + ] + ]); + + $this->assertSame('getkirby.com/en/a', $app->kirbytags('(link: a)')); + $this->assertSame('getkirby.com/de/a', $app->kirbytags('(link: a lang: de)')); + $this->assertSame('getkirby.com/en/a', $app->kirbytags('(link: a#anchor lang: en)')); + $this->assertSame('getkirby.com/de/a', $app->kirbytags('(link: a#anchor lang: de)')); + } + + public function testWithUuid() + { + $app = $this->app->clone([ + 'urls' => [ + 'index' => 'https://getkirby.com' + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => ['uuid' => 'page-uuid'], + 'files' => [ + [ + 'filename' => 'foo.jpg', + 'content' => ['uuid' => 'file-uuid'], + ] + ] + ] + ] + ] + ]); + + $result = $app->kirbytags('(link: page://page-uuid)'); + $this->assertSame('getkirby.com/a', $result); + + $result = $app->kirbytags('(link: page://not-exists)'); + $this->assertSame('getkirby.com/error', $result); + + $result = $app->kirbytags('(link: file://file-uuid text: file)'); + $this->assertSame('file', $result); + + $result = $app->kirbytags('(link: file://not-exists text: file)'); + $this->assertSame('file', $result); + } + + public function testWithUuidDebug() + { + $app = $this->app->clone([ + 'urls' => [ + 'index' => 'https://getkirby.com' + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => ['uuid' => 'page-uuid'], + 'files' => [ + [ + 'filename' => 'foo.jpg', + 'content' => ['uuid' => 'file-uuid'], + ] + ] + ] + ] + ], + 'options' => [ + 'debug' => true + ] + ]); + + $this->expectException(NotFoundException::class); + $this->expectExceptionMessage('The linked page cannot be found'); + + $app->kirbytags('(link: page://not-exists)'); + } + + public function testWithUuidDebugText() + { + $app = $this->app->clone([ + 'urls' => [ + 'index' => 'https://getkirby.com' + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'content' => ['uuid' => 'page-uuid'], + 'files' => [ + [ + 'filename' => 'foo.jpg', + 'content' => ['uuid' => 'file-uuid'], + ] + ] + ] + ] + ], + 'options' => [ + 'debug' => true + ] + ]); + + $this->expectException(NotFoundException::class); + $this->expectExceptionMessage('The linked page cannot be found for the link text "click here"'); + + $app->kirbytags('(link: page://not-exists text: click here)'); + } + + public function testWithUuidAndLang() + { + $app = $this->app->clone([ + 'urls' => [ + 'index' => 'https://getkirby.com' + ], + 'languages' => [ + [ + 'code' => 'en', + 'name' => 'English', + 'default' => true, + 'locale' => 'en_US', + 'url' => '/', + ], + [ + 'code' => 'de', + 'name' => 'Deutsch', + 'locale' => 'de_DE', + 'url' => '/de', + ], + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'a', + 'files' => [ + [ + 'filename' => 'foo.jpg', + 'translations' => [ + [ + 'code' => 'en', + 'content' => ['uuid' => 'file-uuid'] + ], + [ + 'code' => 'de', + 'content' => [] + ] + ] + ] + ], + 'translations' => [ + [ + 'code' => 'en', + 'content' => ['uuid' => 'page-uuid'] + ], + [ + 'code' => 'de', + 'content' => ['slug' => 'ae'] + ] + ] + ] + ] + ] + ]); + + $result = $app->kirbytags('(link: page://page-uuid lang: de)'); + $this->assertSame('getkirby.com/de/ae', $result); + + $result = $app->kirbytags('(link: file://file-uuid text: file lang: de)'); + $this->assertSame('file', $result); + } +} diff --git a/tests/Text/MarkdownTest.php b/tests/Text/MarkdownTest.php index 9e28eca59f..3f14038285 100644 --- a/tests/Text/MarkdownTest.php +++ b/tests/Text/MarkdownTest.php @@ -73,6 +73,17 @@ public function testParse() $this->assertSame($html, $markdown->parse($md)); } + /** + * @covers ::parse + */ + public function testParseInline() + { + $markdown = new Markdown(); + $md = file_get_contents(static::FIXTURES . '/inline.md'); + $html = file_get_contents(static::FIXTURES . '/inline.html'); + $this->assertSame($html, $markdown->parse($md, true)); + } + /** * @covers ::parse */ diff --git a/tests/Text/VideoKirbyTagTest.php b/tests/Text/VideoKirbyTagTest.php new file mode 100644 index 0000000000..b83648327d --- /dev/null +++ b/tests/Text/VideoKirbyTagTest.php @@ -0,0 +1,256 @@ +app = new App([ + 'roots' => [ + 'index' => static::TMP + ] + ]); + + Dir::make(static::TMP); + } + + public function tearDown(): void + { + Dir::remove(static::TMP); + } + + public function testLocal() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'test', + 'content' => [ + 'text' => '(video: sample.mp4)' + ], + 'files' => [ + ['filename' => 'sample.mp4'] + ] + ] + ] + ] + ]); + + $page = $kirby->page('test'); + $image = $page->file('sample.mp4'); + + $expected = '
'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testInlineAttrs() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'test', + 'content' => [ + 'text' => '(video: sample.mp4 + autoplay: true + caption: Lorem ipsum + controls: false + class: video-class + height: 350 + loop: true + muted: true + playsinline: true + poster: sample.jpg + preload: auto + style: border: none + width: 500)' + ], + 'files' => [ + ['filename' => 'sample.mp4'], + ['filename' => 'sample.jpg'] + ] + ] + ] + ] + ]); + + $page = $kirby->page('test'); + + $image = $page->file('sample.jpg'); + $video = $page->file('sample.mp4'); + + $expected = '
Lorem ipsum
'; + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testPredefinedAttrs() + { + $kirby = $this->app->clone([ + 'options' => [ + 'kirbytext' => [ + 'video' => [ + 'autoplay' => true, + 'caption' => 'Lorem ipsum', + 'controls' => false, + 'class' => 'video-class', + 'height' => 350, + 'loop' => true, + 'muted' => true, + 'playsinline' => true, + 'poster' => 'sample.jpg', + 'preload' => 'auto', + 'style' => 'border: none', + 'width' => 500 + ] + ] + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'test', + 'content' => [ + 'text' => '(video: sample.mp4)' + ], + 'files' => [ + ['filename' => 'sample.mp4'], + ['filename' => 'sample.jpg'] + ] + ] + ] + ] + ]); + + $page = $kirby->page('test'); + + $image = $page->file('sample.jpg'); + $video = $page->file('sample.mp4'); + + $expected = '
Lorem ipsum
'; + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testAutoplayRelatedAttrs() + { + $kirby = new App([ + 'roots' => [ + 'index' => '/dev/null', + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'test', + 'content' => [ + 'text' => '(video: sample.mp4 autoplay: true)' + ], + 'files' => [ + ['filename' => 'sample.mp4'] + ] + ] + ] + ] + ]); + + $page = $kirby->page('test'); + $video = $page->file('sample.mp4'); + + $expected = '
'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testAutoplayAttrsOverride() + { + $kirby = new App([ + 'roots' => [ + 'index' => '/dev/null', + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'test', + 'content' => [ + 'text' => '(video: sample.mp4 autoplay: true muted: false playsinline: false)' + ], + 'files' => [ + ['filename' => 'sample.mp4'] + ] + ] + ] + ] + ]); + + $page = $kirby->page('test'); + $image = $page->file('sample.mp4'); + + $expected = '
'; + + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testOptions() + { + $kirby = $this->app->clone([ + 'options' => [ + 'kirbytext' => [ + 'video' => [ + 'options' => [ + 'youtube' => [ + 'controls' => 0 + ] + ] + ] + ] + ], + 'site' => [ + 'children' => [ + [ + 'slug' => 'test', + 'content' => [ + 'text' => '(video: https://www.youtube.com/watch?v=VhP7ZzZysQg)' + ] + ] + ] + ] + ]); + + $page = $kirby->page('test'); + + $expected = '
'; + $this->assertSame($expected, $page->text()->kt()->value()); + } + + public function testRemote() + { + $kirby = $this->app->clone([ + 'site' => [ + 'children' => [ + [ + 'slug' => 'test', + 'content' => [ + 'text' => '(video: https://getkirby.com/sample.mp4)' + ] + ] + ] + ] + ]); + + $page = $kirby->page('test'); + + $expected = '
'; + $this->assertSame($expected, $page->text()->kt()->value()); + } +} diff --git a/tests/Text/fixtures/inline.html b/tests/Text/fixtures/inline.html new file mode 100644 index 0000000000..40232c1c05 --- /dev/null +++ b/tests/Text/fixtures/inline.html @@ -0,0 +1,6 @@ +italic
+
+bold
+
+This is some text
+and some more text 👀. \ No newline at end of file diff --git a/tests/Text/fixtures/inline.md b/tests/Text/fixtures/inline.md new file mode 100644 index 0000000000..c23b51db04 --- /dev/null +++ b/tests/Text/fixtures/inline.md @@ -0,0 +1,6 @@ +*italic* + +**bold** + +This is some text +and some more text 👀. \ No newline at end of file From 68b1859551010fbf806a1f4b40b473cd00d4ba63 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 19:10:34 +0100 Subject: [PATCH 087/202] Improve `Query` package unit tests and coverage --- tests/Query/ArgumentTest.php | 5 ++-- tests/Query/ArgumentsTest.php | 6 +++-- tests/Query/ExpressionTest.php | 5 ++-- tests/Query/QueryDefaultFunctionsTest.php | 2 +- tests/Query/QueryTest.php | 14 +++++++++-- tests/Query/SegmentTest.php | 29 +++++++++++++++++++++-- tests/Query/SegmentsTest.php | 6 +++-- 7 files changed, 54 insertions(+), 13 deletions(-) diff --git a/tests/Query/ArgumentTest.php b/tests/Query/ArgumentTest.php index 9fa03c00a2..5154981a7b 100644 --- a/tests/Query/ArgumentTest.php +++ b/tests/Query/ArgumentTest.php @@ -3,11 +3,12 @@ namespace Kirby\Query; use Closure; +use Kirby\TestCase; /** - * @coversDefaultClass Kirby\Query\Argument + * @coversDefaultClass \Kirby\Query\Argument */ -class ArgumentTest extends \Kirby\TestCase +class ArgumentTest extends TestCase { /** * @covers ::__construct diff --git a/tests/Query/ArgumentsTest.php b/tests/Query/ArgumentsTest.php index cc97313d75..552a5cefe4 100644 --- a/tests/Query/ArgumentsTest.php +++ b/tests/Query/ArgumentsTest.php @@ -2,10 +2,12 @@ namespace Kirby\Query; +use Kirby\TestCase; + /** - * @coversDefaultClass Kirby\Query\Arguments + * @coversDefaultClass \Kirby\Query\Arguments */ -class ArgumentsTest extends \Kirby\TestCase +class ArgumentsTest extends TestCase { /** * @covers ::factory diff --git a/tests/Query/ExpressionTest.php b/tests/Query/ExpressionTest.php index 50c67cdcb2..0f9f4b060f 100644 --- a/tests/Query/ExpressionTest.php +++ b/tests/Query/ExpressionTest.php @@ -3,11 +3,12 @@ namespace Kirby\Query; use Kirby\Exception\LogicException; +use Kirby\TestCase; /** - * @coversDefaultClass Kirby\Query\Expression + * @coversDefaultClass \Kirby\Query\Expression */ -class ExpressionTest extends \Kirby\TestCase +class ExpressionTest extends TestCase { /** * @covers ::__construct diff --git a/tests/Query/QueryDefaultFunctionsTest.php b/tests/Query/QueryDefaultFunctionsTest.php index c8ef63499b..83fe1faee8 100644 --- a/tests/Query/QueryDefaultFunctionsTest.php +++ b/tests/Query/QueryDefaultFunctionsTest.php @@ -9,7 +9,7 @@ use Kirby\Toolkit\I18n; /** - * @coversDefaultClass Kirby\Query\Query + * @coversNothing */ class QueryDefaultFunctionsTest extends \Kirby\TestCase { diff --git a/tests/Query/QueryTest.php b/tests/Query/QueryTest.php index aacca07aea..6189291f9b 100644 --- a/tests/Query/QueryTest.php +++ b/tests/Query/QueryTest.php @@ -3,11 +3,12 @@ namespace Kirby\Query; use Closure; +use Kirby\TestCase; /** - * @coversDefaultClass Kirby\Query\Query + * @coversDefaultClass \Kirby\Query\Query */ -class QueryTest extends \Kirby\TestCase +class QueryTest extends TestCase { /** * @covers ::__construct @@ -19,6 +20,15 @@ public function testFactory() $this->assertSame('user.me', $query->query); } + /** + * @covers ::intercept + */ + public function testIntercept() + { + $query = new Query("kirby"); + $this->assertSame('foo', $query->intercept('foo')); + } + /** * @covers ::resolve */ diff --git a/tests/Query/SegmentTest.php b/tests/Query/SegmentTest.php index bde52eef65..7b928544c6 100644 --- a/tests/Query/SegmentTest.php +++ b/tests/Query/SegmentTest.php @@ -2,8 +2,10 @@ namespace Kirby\Query; +use Kirby\Cms\App; use Kirby\Exception\BadMethodCallException; use Kirby\Exception\InvalidArgumentException; +use Kirby\TestCase; use stdClass; class MyObj @@ -33,9 +35,9 @@ public function __get($name) } /** - * @coversDefaultClass Kirby\Query\Segment + * @coversDefaultClass \Kirby\Query\Segment */ -class SegmentTest extends \Kirby\TestCase +class SegmentTest extends TestCase { public static function scalarProvider(): array { @@ -74,6 +76,7 @@ public function testErrorWithObject() /** * @covers ::factory + * @covers ::__construct */ public function testFactory() { @@ -116,6 +119,7 @@ public function testResolveFirstWithDataObject() $this->assertSame('bar', $segment->resolve(null, $obj)); } + /** * @covers ::resolve * @covers ::resolveArray @@ -127,6 +131,17 @@ public function testResolveArray() $this->assertSame($expected, $segment->resolve($data)); } + /** + * @covers ::resolve + * @covers ::resolveArray + */ + public function testResolveArrayClosure() + { + $segment = Segment::factory('foo', 0); + $data = ['foo' => fn () => 'bar']; + $this->assertSame('bar', $segment->resolve(null, $data)); + } + /** * @covers ::resolve * @covers ::resolveArray @@ -153,6 +168,16 @@ public function testResolveArrayArgOnNonClosure() $segment->resolve(['foo' => 'bar']); } + /** + * @covers ::resolve + * @covers ::resolveArray + */ + public function testResolveArrayFromGlobalEntry() + { + $segment = Segment::factory('kirby'); + $this->assertSame(App::instance(), $segment->resolve(null, [])); + } + /** * @covers ::resolve * @covers ::resolveObject diff --git a/tests/Query/SegmentsTest.php b/tests/Query/SegmentsTest.php index a9ec1f9e81..dc2d7e3b6e 100644 --- a/tests/Query/SegmentsTest.php +++ b/tests/Query/SegmentsTest.php @@ -4,15 +4,17 @@ use Kirby\Exception\BadMethodCallException; use Kirby\Exception\InvalidArgumentException; +use Kirby\TestCase; use stdClass; /** - * @coversDefaultClass Kirby\Query\Segments + * @coversDefaultClass \Kirby\Query\Segments */ -class SegmentsTest extends \Kirby\TestCase +class SegmentsTest extends TestCase { /** * @covers ::factory + * @covers ::__construct */ public function testFactory() { From c8db40f244f216275f723c4fb990fa6ca3479783 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 19:32:38 +0100 Subject: [PATCH 088/202] Unit tests improvements for `Option` package --- tests/Option/OptionTest.php | 4 ++++ tests/Option/OptionsQueryTest.php | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/Option/OptionTest.php b/tests/Option/OptionTest.php index e729359132..9b47074abf 100644 --- a/tests/Option/OptionTest.php +++ b/tests/Option/OptionTest.php @@ -11,22 +11,26 @@ class OptionTest extends TestCase { /** * @covers ::__construct + * @covers ::id */ public function testConstruct() { // string $option = new Option('test'); $this->assertSame('test', $option->value); + $this->assertSame('test', $option->id()); $this->assertSame('test', $option->text->translations['en']); // int $option = new Option(1); $this->assertSame(1, $option->value); + $this->assertSame(1, $option->id()); $this->assertSame(1, $option->text->translations['en']); // float $option = new Option(1.1); $this->assertSame(1.1, $option->value); + $this->assertSame(1.1, $option->id()); $this->assertSame(1.1, $option->text->translations['en']); } diff --git a/tests/Option/OptionsQueryTest.php b/tests/Option/OptionsQueryTest.php index f10a78d289..8e40b7b97d 100644 --- a/tests/Option/OptionsQueryTest.php +++ b/tests/Option/OptionsQueryTest.php @@ -95,6 +95,7 @@ public function testPolyfill() /** * @covers ::resolve + * @covers ::itemToDefaults */ public function testResolveForArray() { @@ -124,8 +125,8 @@ public function testResolveForArray() // with non-associative array $options = (new OptionsQuery( query: 'page.mySimpleArray', - value: '{{ arrayItem.value }}', - text: '{{ arrayItem.value }}', + value: '{{ item.value }}', + text: '{{ item.value }}', ))->render($model); $this->assertSame('tag1', $options[0]['value']); @@ -136,6 +137,7 @@ public function testResolveForArray() /** * @covers ::resolve + * @covers ::itemToDefaults */ public function testResolveForStructure() { @@ -171,6 +173,7 @@ public function testResolveForStructure() /** * @covers ::resolve + * @covers ::itemToDefaults */ public function testResolveForBlock() { @@ -198,6 +201,7 @@ public function testResolveForBlock() /** * @covers ::resolve + * @covers ::itemToDefaults */ public function testResolveForPages() { @@ -226,6 +230,7 @@ public function testResolveForPages() /** * @covers ::resolve + * @covers ::itemToDefaults */ public function testResolveForFile() { @@ -250,6 +255,7 @@ public function testResolveForFile() /** * @covers ::resolve + * @covers ::itemToDefaults */ public function testResolveForUser() { @@ -271,6 +277,7 @@ public function testResolveForUser() /** * @covers ::resolve + * @covers ::itemToDefaults */ public function testResolveForOptions() { From 7f8a9248d4fedd20b9c1bb650cb7d82e8965c8b6 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Sun, 28 Jan 2024 19:34:48 +0100 Subject: [PATCH 089/202] Fix cs --- tests/Query/QueryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Query/QueryTest.php b/tests/Query/QueryTest.php index 6189291f9b..c51d961f48 100644 --- a/tests/Query/QueryTest.php +++ b/tests/Query/QueryTest.php @@ -25,7 +25,7 @@ public function testFactory() */ public function testIntercept() { - $query = new Query("kirby"); + $query = new Query('kirby'); $this->assertSame('foo', $query->intercept('foo')); } From cb6d91a8d7f1a238fdc79ea514b9d5b7c1da540b Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Tue, 30 Jan 2024 19:55:52 +0100 Subject: [PATCH 090/202] Remove `@coversNothing` --- tests/Query/QueryDefaultFunctionsTest.php | 3 --- tests/Text/FileKirbyTagTest.php | 3 --- tests/Text/ImageKirbyTagTest.php | 3 --- tests/Text/LinkKirbyTagTest.php | 3 --- tests/Text/VideoKirbyTagTest.php | 3 --- 5 files changed, 15 deletions(-) diff --git a/tests/Query/QueryDefaultFunctionsTest.php b/tests/Query/QueryDefaultFunctionsTest.php index 83fe1faee8..09540d87ae 100644 --- a/tests/Query/QueryDefaultFunctionsTest.php +++ b/tests/Query/QueryDefaultFunctionsTest.php @@ -8,9 +8,6 @@ use Kirby\Image\QrCode; use Kirby\Toolkit\I18n; -/** - * @coversNothing - */ class QueryDefaultFunctionsTest extends \Kirby\TestCase { public const TMP = KIRBY_TMP_DIR . '/Query.QueryDefaultFunctions'; diff --git a/tests/Text/FileKirbyTagTest.php b/tests/Text/FileKirbyTagTest.php index 3054d81bda..ffd00b6084 100644 --- a/tests/Text/FileKirbyTagTest.php +++ b/tests/Text/FileKirbyTagTest.php @@ -6,9 +6,6 @@ use Kirby\Filesystem\Dir; use Kirby\TestCase; -/** - * @coversNothing - */ class FileKirbyTagTest extends TestCase { public const TMP = KIRBY_TMP_DIR . '/Text.FileKirbyTag'; diff --git a/tests/Text/ImageKirbyTagTest.php b/tests/Text/ImageKirbyTagTest.php index e4fbde3270..4de5cc68b6 100644 --- a/tests/Text/ImageKirbyTagTest.php +++ b/tests/Text/ImageKirbyTagTest.php @@ -6,9 +6,6 @@ use Kirby\Filesystem\Dir; use Kirby\TestCase; -/** - * @coversNothing - */ class ImageKirbyTagTest extends TestCase { public const TMP = KIRBY_TMP_DIR . '/Text.ImageKirbyTag'; diff --git a/tests/Text/LinkKirbyTagTest.php b/tests/Text/LinkKirbyTagTest.php index 47a937c070..4c653adb20 100644 --- a/tests/Text/LinkKirbyTagTest.php +++ b/tests/Text/LinkKirbyTagTest.php @@ -7,9 +7,6 @@ use Kirby\Filesystem\Dir; use Kirby\TestCase; -/** - * @coversNothing - */ class LinkKirbyTagTest extends TestCase { public const TMP = KIRBY_TMP_DIR . '/Text.LinkKirbyTag'; diff --git a/tests/Text/VideoKirbyTagTest.php b/tests/Text/VideoKirbyTagTest.php index b83648327d..62eb5f2809 100644 --- a/tests/Text/VideoKirbyTagTest.php +++ b/tests/Text/VideoKirbyTagTest.php @@ -6,9 +6,6 @@ use Kirby\Filesystem\Dir; use Kirby\TestCase; -/** - * @coversNothing - */ class VideoKirbyTagTest extends TestCase { public const TMP = KIRBY_TMP_DIR . '/Text.VideoKirbyTag'; From e25270f1f5be2ab4c28db59c38b35f4e7a4f3e97 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Tue, 30 Jan 2024 21:37:55 +0100 Subject: [PATCH 091/202] Add missing tests for `Component::applyProps()` --- tests/Toolkit/ComponentTest.php | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/Toolkit/ComponentTest.php b/tests/Toolkit/ComponentTest.php index 565382a45e..a4e78017d7 100644 --- a/tests/Toolkit/ComponentTest.php +++ b/tests/Toolkit/ComponentTest.php @@ -2,8 +2,10 @@ namespace Kirby\Toolkit; +use ArgumentCountError; use Kirby\Exception\Exception; use Kirby\Exception\InvalidArgumentException; +use TypeError; /** * @coversDefaultClass \Kirby\Toolkit\Component @@ -75,6 +77,44 @@ public function testPropWithFixedValue() $this->assertSame('test', $component->prop); } + /** + * @covers ::applyProps + */ + public function testPropWithInvalidValue() + { + Component::$types = [ + 'test' => [ + 'props' => [ + 'prop' => fn (string $prop) => $prop + ] + ] + ]; + + $this->expectException(TypeError::class); + $this->expectExceptionMessage('Invalid value for "prop"'); + + new Component('test', ['prop' => [1, 2, 3]]); + } + + /** + * @covers ::applyProps + */ + public function testPropWithMissingValue() + { + Component::$types = [ + 'test' => [ + 'props' => [ + 'prop' => fn (string $prop) => $prop + ] + ] + ]; + + $this->expectException(ArgumentCountError::class); + $this->expectExceptionMessage('Please provide a value for "prop"'); + + new Component('test'); + } + /** * @covers ::__construct */ From 1fb7ab2fb36dd7a39d6bffabff1b84133057745b Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Tue, 30 Jan 2024 21:46:02 +0100 Subject: [PATCH 092/202] Add missing tests for KirbyTags --- tests/Text/DateKirbyTagTest.php | 16 ++++++++++++++++ tests/Text/EmailKirbyTagTest.php | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 tests/Text/DateKirbyTagTest.php create mode 100644 tests/Text/EmailKirbyTagTest.php diff --git a/tests/Text/DateKirbyTagTest.php b/tests/Text/DateKirbyTagTest.php new file mode 100644 index 0000000000..5985c0453f --- /dev/null +++ b/tests/Text/DateKirbyTagTest.php @@ -0,0 +1,16 @@ +assertSame(date('d.m.Y'), $app->kirbytags('(date: d.m.Y)')); + $this->assertSame(date('Y'), $app->kirbytags('(date: year)')); + } +} diff --git a/tests/Text/EmailKirbyTagTest.php b/tests/Text/EmailKirbyTagTest.php new file mode 100644 index 0000000000..82885fd02a --- /dev/null +++ b/tests/Text/EmailKirbyTagTest.php @@ -0,0 +1,21 @@ +kirbytags('(email: mail@company.com?subject=Test class: email)'); + $expected = '!^$!'; + $this->assertMatchesRegularExpression($expected, $html); + preg_match($expected, $html, $matches); + $this->assertSame('mail@company.com?subject=Test', Html::decode($matches[1])); + $this->assertSame('mail@company.com', Html::decode($matches[2])); + } +} From c482ccfaf158ac4c155cb3b8dcfec6e2b3f77957 Mon Sep 17 00:00:00 2001 From: Bastian Allgeier Date: Mon, 19 Feb 2024 13:14:15 +0100 Subject: [PATCH 093/202] Improve styling with k-code and grids --- panel/lab/internals/helpers/array/index.vue | 139 ++++++++++++++------ 1 file changed, 100 insertions(+), 39 deletions(-) diff --git a/panel/lab/internals/helpers/array/index.vue b/panel/lab/internals/helpers/array/index.vue index b7076958dd..9274b0e12a 100644 --- a/panel/lab/internals/helpers/array/index.vue +++ b/panel/lab/internals/helpers/array/index.vue @@ -11,13 +11,21 @@ Creates an array from an object: this.$helpers.array.fromObject(object)

- - Input: {{ fromObjectInput }} - - Result: {{ $helper.array.fromObject(fromObjectInput) }} - - + + + +

Input

+ {{ fromObjectInput }} +
+ +

Result

+ {{ + $helper.array.fromObject(fromObjectInput) + }} +
+
+ @@ -29,22 +37,27 @@ field: "name" })

- - {{ searchInput }} - - {{ searchResult }} - + + + + + + + +

Input

+ {{ searchInput }} +
+ +

Result

+ {{ searchResult }} +
+
+
@@ -53,13 +66,21 @@ Sorts an array by one or more fields and directions: this.$helpers.array.sortBy(array, "name desc")

- - {{ searchInput }} - {{ - $helper.array.sortBy(searchInput, "name desc") - }} - + + + +

Input

+ {{ searchInput }} +
+ +

Result

+ {{ + $helper.array.sortBy(searchInput, "name desc") + }} +
+
+
@@ -68,11 +89,21 @@ Splits an array into groups by a delimiter entry: this.$helpers.array.split(array, "-")

- - {{ splitInput }} - {{ $helper.array.split(splitInput, "-") }} - + + + +

Input

+ {{ splitInput }} +
+ +

Result

+ {{ + $helper.array.split(splitInput, "-") + }} +
+
+
@@ -81,14 +112,29 @@ Wraps a value in an array (ensures the value will be an array): this.$helpers.array.wrap(value)

- "aaa", ["aaa"] - - - {{ $helper.array.wrap("aaa") }}, - {{ $helper.array.wrap(["aaa"]) }} - - + + + +

Input

+ "aaa" +
+ +

Result

+ {{ $helper.array.wrap("aaa") }} +
+ +

Input

+ {{ ["aaa"] }} +
+ +

Result

+ {{ + $helper.array.wrap(["aaa"]) + }} +
+
+
@@ -97,7 +143,6 @@ export default { data() { return { - searchResult: null, searchQuery: "" }; }, @@ -112,6 +157,12 @@ export default { { id: 3, name: "Jane Doe" } ]; }, + searchResult() { + return this.$helper.array.search(this.searchInput, this.searchQuery, { + min: 0, + field: "name" + }); + }, splitInput() { return [ { id: 1, name: "John Doe" }, @@ -123,3 +174,13 @@ export default { } }; + + From f44b276135a0a77571742c474e1060446083d629 Mon Sep 17 00:00:00 2001 From: Bastian Allgeier Date: Mon, 19 Feb 2024 14:46:43 +0100 Subject: [PATCH 094/202] Parse individual script blocks and show them in the code view --- panel/lab/internals/helpers/array/index.vue | 56 +++++++++++++++++---- src/Panel/Lab/Example.php | 38 +++++++++++--- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/panel/lab/internals/helpers/array/index.vue b/panel/lab/internals/helpers/array/index.vue index 9274b0e12a..8ecf4bde43 100644 --- a/panel/lab/internals/helpers/array/index.vue +++ b/panel/lab/internals/helpers/array/index.vue @@ -5,7 +5,7 @@ this.$helpers.array - +

Creates an array from an object: @@ -28,7 +28,7 @@ - +

Filters an array by a provided query: @@ -60,7 +60,7 @@ - +

Sorts an array by one or more fields and directions: @@ -71,19 +71,19 @@

Input

- {{ searchInput }} + {{ sortInput }}

Result

{{ - $helper.array.sortBy(searchInput, "name desc") + $helper.array.sortBy(sortInput, "name desc") }}
- +

Splits an array into groups by a delimiter entry: @@ -140,16 +140,24 @@ diff --git a/panel/lab/internals/library.dayjs/3_interpret/index.vue b/panel/lab/internals/library.dayjs/3_interpret/index.vue index 68532cd1f4..6d8eefb993 100644 --- a/panel/lab/internals/library.dayjs/3_interpret/index.vue +++ b/panel/lab/internals/library.dayjs/3_interpret/index.vue @@ -8,41 +8,39 @@ - this.$library.dayjs.interpret("23-09-12", "date"): dayjs|null + this.$library.dayjs.interpret("23-09-12", "date"): dayjs|null -

- - -
- - {{ date ?? "-" }} -
+ + + + + + {{ date ?? "-" }} + +
- this.$library.dayjs.interpret("9:12", "time"): dayjs|null - -
- + this.$library.dayjs.interpret("9:12", "time"): dayjs|null -
- - {{ time ?? "-" }} -
+ + + + + + {{ time ?? "-" }} + +
@@ -66,13 +64,7 @@ export default { diff --git a/panel/lab/internals/library.dayjs/4_iso/index.vue b/panel/lab/internals/library.dayjs/4_iso/index.vue index 8808380b39..816951417e 100644 --- a/panel/lab/internals/library.dayjs/4_iso/index.vue +++ b/panel/lab/internals/library.dayjs/4_iso/index.vue @@ -9,123 +9,115 @@ - this.$library.dayjs.iso("2023-09-12", "date"): dayjs + this.$library.dayjs.iso("2023-09-12", "date"): dayjs -
- - - - -
- - {{ string ?? "-" }} -
-
- - - myDayjsObject.toIso("date"): string - -
-
- - + + + + - - -
- - + + + {{ string ?? "-" }} + + + -
+ + myDayjsObject.toIso("date"): string - {{ iso ?? "-" }} -
+ + + + + + + + + + {{ iso ?? "-" }}
From c54717ee014cc430698c996a94a906fbe9766720 Mon Sep 17 00:00:00 2001 From: Nico Hoffmann Date: Thu, 22 Feb 2024 19:17:56 +0100 Subject: [PATCH 097/202] Lab: tweak helper.array docs --- panel/lab/internals/helpers/array/index.vue | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/panel/lab/internals/helpers/array/index.vue b/panel/lab/internals/helpers/array/index.vue index 8ecf4bde43..0db13ebc02 100644 --- a/panel/lab/internals/helpers/array/index.vue +++ b/panel/lab/internals/helpers/array/index.vue @@ -1,9 +1,11 @@