Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions .github/.kodiak.toml

This file was deleted.

22 changes: 14 additions & 8 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,39 @@ on:
workflow_dispatch:

push:
branches: [ "*" ]
branches: ["*"]

schedule:
- cron: "0 8 * * 1"

jobs:
test83:
test85:
name: "Nette Tester"
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: "8.3"
php: "8.5"

test82:
test84:
name: "Nette Tester"
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: "8.2"
php: "8.4"

test81:
test83:
name: "Nette Tester"
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: "8.1"
php: "8.3"

test82:
name: "Nette Tester"
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: "8.2"

testlower:
name: "Nette Tester"
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: "8.1"
php: "8.2"
composer: "composer update --no-interaction --no-progress --prefer-dist --prefer-stable --prefer-lowest"
9 changes: 3 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,12 @@ phpstan:

.PHONY: tests
tests:
vendor/bin/codecept build
vendor/bin/codecept run --debug
vendor/bin/tester -s -p php --colors 1 -C tests/Cases

.PHONY: coverage
coverage:
ifdef GITHUB_ACTION
vendor/bin/codecept build
vendor/bin/codecept run --coverage-xml
vendor/bin/tester -s -p phpdbg --colors 1 -C --coverage coverage.xml --coverage-src src tests/Cases
else
vendor/bin/codecept build
vendor/bin/codecept run --coverage-html
vendor/bin/tester -s -p phpdbg --colors 1 -C --coverage coverage.html --coverage-src src tests/Cases
endif
15 changes: 0 additions & 15 deletions codeception.yml

This file was deleted.

20 changes: 6 additions & 14 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,16 @@
"MIT"
],
"require": {
"php": ">=8.1",
"php": ">=8.2",
"ext-fileinfo": "*",
"nette/utils": "^4.0.3",
"league/flysystem": "^2.5.0 || ^3.23.0",
"psr/event-dispatcher": "^1.0.0"
},
"require-dev": {
"codeception/codeception": "^5.0.13",
"codeception/module-asserts": "^3.0.0",
"codeception/module-phpbrowser": "^3.0.1",
"phpunit/php-code-coverage": "^10.1.11",
"contributte/qa": "~0.4.0",
"contributte/tester": "~0.3.0",
"contributte/phpstan": "~0.2.0",
"doctrine/annotations": "^1.14.3",
"doctrine/dbal": "^3.7.2",
"imagine/imagine": "^1.3.5",
Expand All @@ -25,14 +24,9 @@
"nette/di": "^3.1.8",
"nette/forms": "^3.1.14",
"nette/http": "^3.2.3",
"nettrine/orm": "^0.8.4",
"contributte/qa": "^0.4",
"contributte/phpunit": "^0.2",
"contributte/phpstan": "^0.1",
"nettrine/orm": "~0.8.4",
"ramsey/uuid": "^4.7.5",
"spatie/temporary-directory": "^1.3.0",
"symfony/dependency-injection": "^6.4.0 || ^7.0.0",
"symfony/filesystem": "^6.4.0 || ^7.0.0",
"symfony/http-foundation": "^6.4.0 || ^7.0.0",
"symfony/http-kernel": "^6.4.0 || ^7.0.0",
"symfony/serializer": "^6.4.0 || ^7.0.0",
Expand All @@ -46,9 +40,7 @@
},
"autoload-dev": {
"psr-4": {
"Tests\\Testing\\": "tests/src",
"Tests\\Unit\\": "tests/unit",
"Tests\\Functional\\": "tests/functional"
"Tests\\": "tests"
}
},
"minimum-stability": "dev",
Expand Down
71 changes: 59 additions & 12 deletions phpstan.neon
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
includes:
#- vendor/contributte/phpstan/phpstan.neon
- vendor/phpstan/phpstan-deprecation-rules/rules.neon
- vendor/phpstan/phpstan-nette/extension.neon
- vendor/phpstan/phpstan-nette/rules.neon
#- vendor/phpstan/phpstan-strict-rules/rules.neon
- vendor/contributte/phpstan/phpstan.neon

parameters:
level: 8
phpVersion: 80100
phpVersion: 80200

scanDirectories:
- src
Expand All @@ -19,7 +15,64 @@ parameters:
- src
- .docs

reportUnmatchedIgnoredErrors: false

ignoreErrors:
# Strict rules - pre-existing codebase patterns
-
identifier: booleanNot.exprNotBoolean
-
identifier: booleanAnd.leftNotBoolean
-
identifier: booleanAnd.rightNotBoolean
-
identifier: booleanOr.leftNotBoolean
-
identifier: booleanOr.rightNotBoolean
-
identifier: if.condNotBoolean
-
identifier: elseif.condNotBoolean
-
identifier: ternary.condNotBoolean
-
identifier: ternary.shortNotAllowed
-
identifier: foreach.nonIterable
-
identifier: foreach.valueOverwrite
-
identifier: property.dynamicName
-
identifier: return.type
-
identifier: return.unusedType
-
identifier: function.alreadyNarrowedType
-
identifier: notIdentical.alwaysTrue
-
identifier: constructor.missingParentCall

# Tracy BlueScreen callable type mismatch
-
identifier: argument.type
path: src/Bridge/Nette/Tracy/ImagistBlueScreen.php
-
identifier: arguments.count
path: src/Bridge/Nette/Tracy/ImagistBlueScreen.php

# Covariance issues (Doctrine EventSubscriber, Latte Extension)
-
identifier: method.childReturnType
paths:
- src/Bridge/Doctrine/Event/
- src/Bridge/Nette/Latte/Extension/

# Nette Arrays::invoke callable signature
-
message: "#^Parameter \\#1 \\$callbacks of static method Nette\\\\Utils\\\\Arrays\\:\\:invoke\\(\\)#"

-
message: """
#^Call to deprecated method getName\\(\\) of class Contributte\\\\Imagist\\\\Bridge\\\\Doctrine\\\\ImageType\\:
Expand Down Expand Up @@ -59,11 +112,6 @@ parameters:
count: 1
path: src/Bridge/Symfony/Serializer/ImagistNormalizer.php

-
message: "#^Method Contributte\\\\Imagist\\\\Bridge\\\\Symfony\\\\Serializer\\\\ImagistNormalizer\\:\\:supportsNormalization\\(\\) has parameter \\$context with no value type specified in iterable type array\\.$#"
count: 1
path: src/Bridge/Symfony/Serializer/ImagistNormalizer.php

-
message: "#^PHPDoc tag @return with type mixed is not subtype of native type array\\|ArrayObject\\|bool\\|float\\|int\\|string\\|null\\.$#"
count: 1
Expand All @@ -88,4 +136,3 @@ parameters:
message: "#^Method Contributte\\\\Imagist\\\\Entity\\\\PromisedImage\\:\\:withScope\\(\\) should return Contributte\\\\Imagist\\\\Entity\\\\PromisedImage but returns Contributte\\\\Imagist\\\\Entity\\\\PersistentImageInterface\\.$#"
count: 1
path: src/Entity/PromisedImage.php

10 changes: 3 additions & 7 deletions ruleset.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="Contributte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/squizlabs/php_codesniffer/phpcs.xsd">
<!-- Rulesets -->
<rule ref="./vendor/contributte/qa/ruleset-8.0.xml">
<rule ref="./vendor/contributte/qa/ruleset-8.2.xml">
<exclude name="SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming.SuperfluousSuffix"/>
<exclude name="SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming.SuperfluousSuffix"/>
<exclude name="SlevomatCodingStandard.PHP.DisallowReference.DisallowedReturningReference"/>
Expand All @@ -12,11 +12,7 @@
<properties>
<property name="rootNamespaces" type="array">
<element key="src" value="Contributte\Imagist"/>
<element key="tests/src" value="Tests\Testing"/>
<element key="tests/unit" value="Tests\Unit"/>
<element key="tests/functional" value="Tests\Functional"/>
<element key="tests/_support/Helper" value="Tests\Helper"/>
<element key="tests/_support" value="Tests"/>
<element key="tests" value="Tests"/>
</property>
<property name="extensions" type="array">
<element key="php" value="php"/>
Expand All @@ -26,5 +22,5 @@
</rule>

<!-- Excludes -->
<exclude-pattern>/tests</exclude-pattern>
<exclude-pattern>/tests/tmp</exclude-pattern>
</ruleset>
22 changes: 9 additions & 13 deletions src/Bridge/Nette/Form/ImageUploadControl.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,26 +66,14 @@ public static function validateFileSize(ImageUploadControl $control, int|float $
return true;
}

if ($file->getSize() > $limit || $file->getError() === UPLOAD_ERR_INI_SIZE) {
return false;
}

return true;
return $file->getSize() <= $limit && $file->getError() !== UPLOAD_ERR_INI_SIZE;
}

public function isFilled(): bool
{
return $this->value || $this->uploadValue;
}

private function isOk(): bool
{
return match (true) {
!$this->uploadValue => false,
default => $this->uploadValue->isOk(),
};
}

public function loadHttpData(): void
{
$value = $this->getHttpData(Form::DataFile);
Expand Down Expand Up @@ -250,4 +238,12 @@ public function setRemove(?ImageRemoveInterface $remove): static
return $this;
}

private function isOk(): bool
{
return match (true) {
!$this->uploadValue => false,
default => $this->uploadValue->isOk(),
};
}

}
37 changes: 37 additions & 0 deletions tests/Cases/Functional/LocalStorageTest.filterAndDelete.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php declare(strict_types = 1);

namespace Tests\Cases\Functional;

use Contributte\Imagist\Builder\LocalImageStorageBuilder;
use Contributte\Imagist\Entity\StorableImage;
use Contributte\Imagist\Uploader\FilePathUploader;
use Contributte\Tester\Toolkit;
use Tests\Fixtures\FileTestCase;
use Tests\Fixtures\Filter\ThumbnailFilter;

require_once __DIR__ . '/../../bootstrap.php';

Toolkit::test(static function (): void {
$case = new FileTestCase();

$builder = new LocalImageStorageBuilder($case->getAbsolutePath());
$builder->withNetteFilterProcessor();
$result = $builder->build();

$storage = $result->getImageStorage();

$image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg');
$persistent = $storage->persist($image);

$storage->persist($persistent->withFilter(new ThumbnailFilter()));

$case->assertTempFileExists('media/name.jpg');
$case->assertTempFileExists('cache/_thumbnail/name.jpg');

$storage->remove($persistent);

$case->assertTempFileNotExists('media/name.jpg');
$case->assertTempFileNotExists('cache/_thumbnail/name.jpg');

$case->cleanup();
});
36 changes: 36 additions & 0 deletions tests/Cases/Functional/LocalStorageTest.filterExisting.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php declare(strict_types = 1);

namespace Tests\Cases\Functional;

use Contributte\Imagist\Builder\LocalImageStorageBuilder;
use Contributte\Imagist\Entity\StorableImage;
use Contributte\Imagist\Uploader\FilePathUploader;
use Contributte\Tester\Toolkit;
use Tester\Assert;
use Tests\Fixtures\FileTestCase;
use Tests\Fixtures\Filter\ThumbnailFilter;

require_once __DIR__ . '/../../bootstrap.php';

Toolkit::test(static function (): void {
$case = new FileTestCase();

$builder = new LocalImageStorageBuilder($case->getAbsolutePath());
$builder->withNetteFilterProcessor();
$result = $builder->build();

$storage = $result->getImageStorage();

$image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg');
$persistent = $storage->persist($image);

$storage->persist($persistent->withFilter(new ThumbnailFilter()));

$case->assertTempFileExists('media/name.jpg');
$case->assertTempFileExists('cache/_thumbnail/name.jpg');
$size = getimagesize($case->getAbsolutePath('cache/_thumbnail/name.jpg'));
Assert::same(15, $size[0]);
Assert::same(15, $size[1]);

$case->cleanup();
});
Loading