Skip to content
Open
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
9 changes: 3 additions & 6 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ jobs:
coverage: "none"
extensions: "${{ env.PHP_EXTENSIONS }}"
php-version: "${{ matrix.php-version }}"
tools: "composer-require-checker, composer-unused, flex"
tools: "flex"

- name: "Install composer dependencies"
uses: "ramsey/composer-install@v3"
Expand All @@ -87,11 +87,8 @@ jobs:
with:
dependency-versions: "${{ matrix.dependencies }}"

- name: "Run maglnet/composer-require-checker"
run: "composer-require-checker check"

- name: "Run composer-unused/composer-unused"
run: "composer-unused"
- name: "Run shipmonk/composer-dependency-analyser"
run: "vendor/bin/composer-dependency-analyser"

static-code-analysis:
name: "Static Code Analysis"
Expand Down
24 changes: 24 additions & 0 deletions composer-dependency-analyser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

use ShipMonk\ComposerDependencyAnalyser\Config\Configuration;
use ShipMonk\ComposerDependencyAnalyser\Config\ErrorType;
use Symfony\Component\TypeInfo\Type;

$config = new Configuration();

$config
->ignoreErrorsOnPackage('doctrine/doctrine-bundle', [ErrorType::UNUSED_DEPENDENCY])
;

if (class_exists(Type::class)) {
$config->ignoreErrorsOnPackage('symfony/type-info', [ErrorType::SHADOW_DEPENDENCY]);
} else {
$config->ignoreUnknownClasses([Type::class]);
}

// ignore polyfill
if (version_compare(PHP_VERSION, '8.3.0', '>=')) {
$config->ignoreErrorsOnPackage('symfony/polyfill-php83', [ErrorType::UNUSED_DEPENDENCY]);
}

return $config;
12 changes: 0 additions & 12 deletions composer-unused.php

This file was deleted.

4 changes: 3 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"symfony/form": "^5.4 || ^6.0 || ^7.0",
"symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
"symfony/options-resolver": "^5.4 || ^6.0 || ^7.0",
"symfony/polyfill-php83": "^1.27",
"symfony/property-info": "^5.4 || ^6.0 || ^7.0",
"symfony/validator": "^5.4 || ^6.0 || ^7.0",
"webmozart/assert": "^1.10"
Expand All @@ -30,9 +31,10 @@
"phpunit/phpunit": "^9.5",
"psalm/plugin-phpunit": "^0.19",
"roave/security-advisories": "dev-latest",
"shipmonk/composer-dependency-analyser": "^1.8",
"sylius-labs/coding-standard": "^4.1.1",
"symplify/easy-coding-standard": "^12.3.6",
"vimeo/psalm": "^5.24"
"vimeo/psalm": "^6.0"
},
"prefer-stable": true,
"autoload": {
Expand Down
15 changes: 15 additions & 0 deletions psalm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
<pluginClass class="Psalm\PhpUnitPlugin\Plugin"/>
</plugins>
<issueHandlers>
<UnusedClass>
<errorLevel type="suppress">
<referencedClass name="Setono\CronExpressionBundle\SetonoCronExpressionBundle" />
</errorLevel>
</UnusedClass>
<DeprecatedMethod>
<errorLevel type="suppress">
<referencedMethod name="Cron\CronExpression::factory"/>
Expand All @@ -32,5 +37,15 @@
<directory name="src/Validator"/>
</errorLevel>
</PropertyNotSetInConstructor>
<UnusedProperty>
<errorLevel type="suppress">
<directory name="tests/Form/TypeGuesser"/>
</errorLevel>
</UnusedProperty>
<UnusedParam>
<errorLevel type="suppress">
<directory name="src/Doctrine/DBAL/Types" />
</errorLevel>
</UnusedParam>
</issueHandlers>
</psalm>
2 changes: 2 additions & 0 deletions src/DependencyInjection/SetonoCronExpressionExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@

final class SetonoCronExpressionExtension extends Extension implements PrependExtensionInterface
{
#[\Override]
public function load(array $configs, ContainerBuilder $container): void
{
$loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.xml');
}

#[\Override]
public function prepend(ContainerBuilder $container): void
{
if (!$container->hasExtension('doctrine')) {
Expand Down
4 changes: 4 additions & 0 deletions src/Doctrine/DBAL/Types/CronExpressionType.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ final class CronExpressionType extends Type
{
public const CRON_EXPRESSION_TYPE = 'cron_expression';

#[\Override]
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
return $platform->getStringTypeDeclarationSQL($column);
Expand All @@ -25,6 +26,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform): st
*
* @throws InvalidType|ValueNotConvertible
*/
#[\Override]
public function convertToPHPValue($value, AbstractPlatform $platform): ?CronExpression
{
if (null === $value) {
Expand Down Expand Up @@ -55,6 +57,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform): ?CronExpr
/**
* @param mixed $value
*/
#[\Override]
public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string
{
if (null === $value) {
Expand All @@ -69,6 +72,7 @@ public function getName(): string
return self::CRON_EXPRESSION_TYPE;
}

/** @noinspection PhpUnusedParameterInspection */
public function requiresSQLCommentHint(AbstractPlatform $platform): bool
{
return true;
Expand Down
2 changes: 2 additions & 0 deletions src/Form/DataTransformer/CronExpressionToPartsTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ final class CronExpressionToPartsTransformer implements DataTransformerInterface
*
* @return array<string, array<string>>
*/
#[\Override]
public function transform($value): array
{
if (null === $value) {
Expand Down Expand Up @@ -49,6 +50,7 @@ public function transform($value): array
/**
* @param mixed $value
*/
#[\Override]
public function reverseTransform($value): CronExpression
{
$cronExpression = CronExpression::factory('* * * * *');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ final class CronExpressionToStringPartsTransformer implements DataTransformerInt
*
* @return array<string,string>
*/
#[\Override]
public function transform($value): array
{
if (null === $value) {
Expand Down Expand Up @@ -49,6 +50,7 @@ public function transform($value): array
/**
* @param mixed $value
*/
#[\Override]
public function reverseTransform($value): CronExpression
{
$exception = new TransformationFailedException('Expected an instance of array{minutes: string, hours: string, days: string, months: string, weekdays: string}');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ final class CronExpressionToStringTransformer implements DataTransformerInterfac
/**
* @param mixed $value
*/
#[\Override]
public function transform($value): ?string
{
if (null === $value) {
Expand All @@ -34,6 +35,7 @@ public function transform($value): ?string
/**
* @param mixed $value
*/
#[\Override]
public function reverseTransform($value): CronExpression
{
if (null === $value || '' === $value) {
Expand Down
3 changes: 3 additions & 0 deletions src/Form/Type/CronExpressionType.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public function __construct()
$this->fieldFactory = new FieldFactory();
}

#[\Override]
public function buildForm(FormBuilderInterface $builder, array $options): void
{
if ('single_text' === $options['widget']) {
Expand Down Expand Up @@ -102,6 +103,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
}
}

#[\Override]
public function configureOptions(OptionsResolver $resolver): void
{
$compound = function (Options $options): bool {
Expand All @@ -125,6 +127,7 @@ public function configureOptions(OptionsResolver $resolver): void
]);
}

#[\Override]
public function getBlockPrefix(): string
{
return 'setono_cron_expression';
Expand Down
68 changes: 55 additions & 13 deletions src/Form/TypeGuesser/CronExpressionTypeGuesser.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Form\Guess\TypeGuess;
use Symfony\Component\Form\Guess\ValueGuess;
use Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor;
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\PropertyInfo\PropertyInfoExtractor;
use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface;
use Symfony\Component\PropertyInfo\Type;
use Symfony\Component\PropertyInfo\Type as LegacyType;
use Symfony\Component\TypeInfo\Type;

final class CronExpressionTypeGuesser implements FormTypeGuesserInterface
{
Expand All @@ -29,21 +31,15 @@ public function __construct(?PropertyTypeExtractorInterface $extractor = null)
* @param string $class
* @param string $property
*/
#[\Override]
public function guessType($class, $property): ?TypeGuess
{
if (!class_exists($class)) {
return null;
}

$types = $this->extractor->getTypes($class, $property);
if (null === $types) {
return null;
}
foreach ($types as $type) {
if (Type::BUILTIN_TYPE_OBJECT === $type->getBuiltinType() &&
CronExpression::class === $type->getClassName()) {
return new TypeGuess(CronExpressionType::class, [], Guess::VERY_HIGH_CONFIDENCE);
}
if ($this->isCronExpression($class, $property)) {
return new TypeGuess(CronExpressionType::class, [], Guess::VERY_HIGH_CONFIDENCE);
}

return null;
Expand All @@ -53,6 +49,7 @@ public function guessType($class, $property): ?TypeGuess
* @param string $class
* @param string $property
*/
#[\Override]
public function guessRequired($class, $property): ?ValueGuess
{
return null;
Expand All @@ -62,6 +59,7 @@ public function guessRequired($class, $property): ?ValueGuess
* @param string $class
* @param string $property
*/
#[\Override]
public function guessMaxLength($class, $property): ?ValueGuess
{
return null;
Expand All @@ -71,16 +69,60 @@ public function guessMaxLength($class, $property): ?ValueGuess
* @param string $class
* @param string $property
*/
#[\Override]
public function guessPattern($class, $property): ?ValueGuess
{
return null;
}

private function createExtractor(): PropertyTypeExtractorInterface
{
$docExtractor = new PhpDocExtractor();
$reflectionExtractor = new ReflectionExtractor();

return new PropertyInfoExtractor([], [
new PhpDocExtractor(),
new ReflectionExtractor(),
]);
$docExtractor,
$reflectionExtractor,
new ConstructorExtractor([
$docExtractor,
$reflectionExtractor,
]),
], [], [], [$reflectionExtractor]);
}

private function isCronExpression(string $class, string $property): bool
{
if (class_exists(Type::class) && method_exists($this->extractor, 'getType')) {
/**
* @psalm-suppress MixedAssignment
*/
$type = $this->extractor->getType($class, $property);
if (null === $type) {
return false;
}
if ($type->isIdentifiedBy(CronExpression::class)) {
return true;
}
} else {
/**
* @psalm-suppress DeprecatedClass
* @psalm-suppress DeprecatedMethod
*/
$types = $this->extractor->getTypes($class, $property);
if (null === $types) {
return false;
}
foreach ($types as $lType) {
/**
* @psalm-suppress DeprecatedClass
*/
if (LegacyType::BUILTIN_TYPE_OBJECT === $lType->getBuiltinType() &&
CronExpression::class === $lType->getClassName()) {
return true;
}
}
}

return false;
}
}
2 changes: 1 addition & 1 deletion src/SetonoCronExpressionBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@

use Symfony\Component\HttpKernel\Bundle\Bundle;

class SetonoCronExpressionBundle extends Bundle
final class SetonoCronExpressionBundle extends Bundle
{
}
2 changes: 1 addition & 1 deletion src/Validator/CronExpression.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*/
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
class CronExpression extends Constraint
final class CronExpression extends Constraint
{
public string $message = '{{ value }} is not a valid cron expression.';

Expand Down
3 changes: 2 additions & 1 deletion src/Validator/CronExpressionValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;

class CronExpressionValidator extends ConstraintValidator
final class CronExpressionValidator extends ConstraintValidator
{
/**
* @param mixed $value
*/
#[\Override]
public function validate($value, Constraint $constraint): void
{
if (!$constraint instanceof CronExpression) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

final class SetonoCronExpressionExtensionTest extends AbstractExtensionTestCase
{
#[\Override]
protected function getContainerExtensions(): array
{
return [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

final class SetonoCronExpressionExtensionWithDoctrineTest extends AbstractExtensionTestCase
{
#[\Override]
protected function getContainerExtensions(): array
{
return [
Expand Down
Loading