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
1 change: 1 addition & 0 deletions src/contracts/Factory/IbexaRectorConfigFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public function createConfig(): RectorConfigBuilder
$this->extraSets
)
)
->withAttributesSets(symfony: true, doctrine: true)
;
}
}
3 changes: 3 additions & 0 deletions src/contracts/Factory/IbexaRectorConfigFactoryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,8 @@
*/
interface IbexaRectorConfigFactoryInterface
{
/**
* @throws \Rector\Exception\Configuration\InvalidConfigurationException
*/
public function createConfig(): RectorConfigBuilder;
}
6 changes: 6 additions & 0 deletions src/contracts/Sets/ibexa-50.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

namespace Ibexa\Contracts\Rector\Sets;

use Ibexa\Rector\Configuration\AnnotationToAttributeConfigurationBuilder;
use Ibexa\Rector\Rule\AddReturnTypeFromParentMethodRule;
use Ibexa\Rector\Rule\AddReturnTypeFromPhpDocRule;
use Ibexa\Rector\Rule\ChangeArgumentTypeRector;
Expand All @@ -17,6 +18,7 @@
use Ibexa\Rector\Rule\PropertyToGetterRector;
use Ibexa\Rector\Rule\RemoveArgumentFromMethodCallRector;
use Rector\Config\RectorConfig;
use Rector\Php80\Rector\Class_\AnnotationToAttributeRector;
use Rector\Renaming\Rector\ClassConstFetch\RenameClassConstFetchRector;
use Rector\Renaming\Rector\MethodCall\RenameMethodRector;
use Rector\Renaming\Rector\Name\RenameClassRector;
Expand Down Expand Up @@ -306,6 +308,10 @@
),
]
);
$rectorConfig->ruleWithConfiguration(
AnnotationToAttributeRector::class,
iterator_to_array((new AnnotationToAttributeConfigurationBuilder())->build())
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, that kinda sucks.

How about we enable other attributes though? From Symfony Validator, routing, etc.?

);

$rectorConfig->skip(
[
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace Ibexa\Rector\Configuration;

use Rector\Php80\ValueObject\AnnotationToAttribute;

final readonly class AnnotationToAttributeConfigurationBuilder
{
/**
* @return iterable<\Rector\Php80\ValueObject\AnnotationToAttribute>
*/
public function build(): iterable
{
foreach (IbexaSymfonyConstraintList::cases() as $constraintFQCN) {
yield new AnnotationToAttribute($constraintFQCN->value);
}
}
}
52 changes: 52 additions & 0 deletions src/lib/Configuration/IbexaSymfonyConstraintList.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace Ibexa\Rector\Configuration;

enum IbexaSymfonyConstraintList: string
{
// Segmentation
case SegmentationUserToSegmentAssignment = 'Ibexa\Segmentation\Validation\Constraint\UserToSegmentAssignment';
case SegmentationUniqueSegmentGroupStructIdentifier = 'Ibexa\Segmentation\Validation\Constraint\UniqueSegmentGroupStructIdentifier';
case SegmentationUniqueSegmentStructIdentifier = 'Ibexa\Segmentation\Validation\Constraint\UniqueSegmentStructIdentifier';

// Connector AI
case ConnectorAiActionConfigurationHandlerOptions = 'Ibexa\ConnectorAi\Validation\Constraints\ActionConfigurationHandlerOptions';
case ConnectorAiActionConfigurationTypeOptions = 'Ibexa\ConnectorAi\Validation\Constraints\ActionConfigurationTypeOptions';
case ConnectorAiUniqueActionConfigurationIdentifier = 'Ibexa\ConnectorAi\Validation\Constraints\UniqueActionConfigurationIdentifier';
case ConnectorAiIdentifier = 'Ibexa\ConnectorAi\Validation\Constraints\Identifier';

// Discounts
case DiscountsAtLeastOneDiscountTranslationWillRemain = 'Ibexa\Discounts\Validation\Constraint\AtLeastOneDiscountTranslationWillRemain';
case DiscountsCountCategories = 'Ibexa\Discounts\Validation\Constraint\CountCategories';
case DiscountsCountCustomerGroup = 'Ibexa\Discounts\Validation\Constraint\CountCustomerGroup';
case DiscountsCountProducts = 'Ibexa\Discounts\Validation\Constraint\CountProducts';
case DiscountsCurrencyRequired = 'Ibexa\Discounts\Validation\Constraint\CurrencyRequired';
case DiscountsUniqueIdentifier = 'Ibexa\Discounts\Validation\Constraint\UniqueIdentifier';
case DiscountsIdentifier = 'Ibexa\Discounts\Validation\Constraint\Identifier';
case DiscountsValidDiscountRuleType = 'Ibexa\Discounts\Validation\Constraint\ValidDiscountRuleType';

// Collaboration
case CollaborationParticipantType = 'Ibexa\Collaboration\Validation\Constraint\ParticipantType';
case CollaborationUniqueToken = 'Ibexa\Collaboration\Validation\Constraint\UniqueToken';

// Payment
case PaymentAllowedPaymentStatusTransition = 'Ibexa\Payment\Validation\Constraints\AllowedPaymentStatusTransition';
case PaymentAtLeastOneTranslation = 'Ibexa\Payment\Validation\Constraints\AtLeastOneTranslation';
case PaymentEnabledPaymentMethod = 'Ibexa\Payment\Validation\Constraints\EnabledPaymentMethod';
case PaymentIdentifier = 'Ibexa\Payment\Validation\Constraints\Identifier';
case PaymentMoneyAmountEqualToOrGreaterThanZero = 'Ibexa\Payment\Validation\Constraints\MoneyAmountEqualToOrGreaterThanZero';
case PaymentPaymentMethodEnabled = 'Ibexa\Payment\Validation\Constraints\PaymentMethodEnabled';
case PaymentPaymentMethodOptions = 'Ibexa\Payment\Validation\Constraints\PaymentMethodOptions';
case PaymentUniquePaymentIdentifier = 'Ibexa\Payment\Validation\Constraints\UniquePaymentIdentifier';
case PaymentUniquePaymentMethodIdentifier = 'Ibexa\Payment\Validation\Constraints\UniquePaymentMethodIdentifier';

// SiteFactory
case SiteFactoryHostnameWithOptionalPort = 'Ibexa\Bundle\SiteFactory\Validator\Constraints\HostnameWithOptionalPort';
case SiteFactoryPort = 'Ibexa\Bundle\SiteFactory\Validator\Constraints\Port';
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);

namespace Ibexa\Payment\Validation\Constraints;

use Symfony\Component\Validator\Constraint;

#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD)]
final class UniquePaymentMethodIdentifier extends Constraint
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace Ibexa\Segmentation\Validation\Constraint;

use Symfony\Component\Validator\Constraint;

#[\Attribute(\Attribute::TARGET_CLASS)]
final class UserToSegmentAssignment extends Constraint
{

}
49 changes: 49 additions & 0 deletions tests/lib/Sets/Ibexa50/Fixture/annotation_to_attribute.php.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);

Comment thread
alongosz marked this conversation as resolved.
namespace Ibexa\Rector\Tests\Sets\Ibexa50\Fixture;

use Ibexa\Payment\Validation\Constraints\UniquePaymentMethodIdentifier;
use Ibexa\Segmentation\Validation\Constraint\UserToSegmentAssignment;

/**
* @UserToSegmentAssignment()
*/
class Foo
{
/** @UniquePaymentMethodIdentifier */
public string $uniquePaymentIdentifier;

/**
* @UniquePaymentMethodIdentifier
*/
public function getUniquePaymentIdentifier(): string
{
return $this->uniquePaymentIdentifier;
}
}

?>
-----
<?php
declare(strict_types=1);

Comment thread
alongosz marked this conversation as resolved.
namespace Ibexa\Rector\Tests\Sets\Ibexa50\Fixture;

use Ibexa\Payment\Validation\Constraints\UniquePaymentMethodIdentifier;
use Ibexa\Segmentation\Validation\Constraint\UserToSegmentAssignment;

#[UserToSegmentAssignment]
class Foo
{
#[UniquePaymentMethodIdentifier]
public string $uniquePaymentIdentifier;

#[UniquePaymentMethodIdentifier]
public function getUniquePaymentIdentifier(): string
{
return $this->uniquePaymentIdentifier;
}
}

?>
Loading