diff --git a/Makefile b/Makefile index 2129aac..658dbd3 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,9 @@ help: ## Outputs this help screen build: ## Builds the Docker images @$(DOCKER_COMP) build --pull --no-cache +phparkitect: ## Vérifie l'architecture avec PHPArkitect + @$(PHP_CONT) vendor/bin/phparkitect check + up: ## Start the docker hub @$(DOCKER_COMP) up -d diff --git a/composer.json b/composer.json index 074f48d..713be7b 100644 --- a/composer.json +++ b/composer.json @@ -112,6 +112,7 @@ "doctrine/doctrine-fixtures-bundle": "^3.5", "friendsofphp/php-cs-fixer": "^3.48", "mtdowling/jmespath.php": "^2.7", + "phparkitect/phparkitect": "^0.3.33", "phpmd/phpmd": "^2.15", "phpunit/phpunit": "^10.5", "symfony/browser-kit": "7.0.*", diff --git a/composer.lock b/composer.lock index b26ae21..86955a8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e2253575e3f4a0344fe2ff59ac54aad0", + "content-hash": "be8113b23da88e97654b9211688e5160", "packages": [ { "name": "api-platform/core", @@ -10188,6 +10188,84 @@ }, "time": "2023-12-10T21:03:43+00:00" }, + { + "name": "ondram/ci-detector", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/OndraM/ci-detector.git", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.13.2", + "lmc/coding-standard": "^3.0.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^9.6.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "OndraM\\CiDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ondřej Machulda", + "email": "ondrej.machulda@gmail.com" + } + ], + "description": "Detect continuous integration environment and provide unified access to properties of current build", + "keywords": [ + "CircleCI", + "Codeship", + "Wercker", + "adapter", + "appveyor", + "aws", + "aws codebuild", + "azure", + "azure devops", + "azure pipelines", + "bamboo", + "bitbucket", + "buddy", + "ci-info", + "codebuild", + "continuous integration", + "continuousphp", + "devops", + "drone", + "github", + "gitlab", + "interface", + "jenkins", + "pipelines", + "sourcehut", + "teamcity", + "travis" + ], + "support": { + "issues": "https://github.com/OndraM/ci-detector/issues", + "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" + }, + "time": "2024-03-12T13:22:30+00:00" + }, { "name": "pdepend/pdepend", "version": "2.16.2", @@ -10362,6 +10440,89 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "phparkitect/phparkitect", + "version": "0.3.33", + "source": { + "type": "git", + "url": "https://github.com/phparkitect/arkitect.git", + "reference": "aa15c864bef601d797e24f479852ec3f7d35cdd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phparkitect/arkitect/zipball/aa15c864bef601d797e24f479852ec3f7d35cdd1", + "reference": "aa15c864bef601d797e24f479852ec3f7d35cdd1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "nikic/php-parser": "~4", + "ondram/ci-detector": "^4.1", + "php": "^7.1|^8", + "phpstan/phpdoc-parser": "^1.2", + "symfony/console": "^3.0|^4.0|^5.0|^6.0|^7.0", + "symfony/event-dispatcher": "^3.0|^4.0|^5.0|^6.0|^7.0", + "symfony/finder": "^3.0|^4.0|^5.0|^6.0|^7.0", + "symfony/polyfill-php80": "^1.20", + "webmozart/assert": "^1.9" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "mikey179/vfsstream": "^1.6", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5|^9.0|^10.0", + "roave/security-advisories": "dev-master", + "symfony/var-dumper": "^3.0|^4.0|^5.0|^6.0|^7.0", + "vimeo/psalm": "^4.6" + }, + "bin": [ + "bin-stub/phparkitect" + ], + "type": "library", + "autoload": { + "psr-4": { + "Arkitect\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pietro Campagnano", + "email": "hello@pietro.camp" + }, + { + "name": "Patrick Luca Fazzi", + "email": "patrick91@live.it" + }, + { + "name": "Alessandro Minoccheri", + "email": "alessandro.minoccheri@gmail.com" + }, + { + "name": "Michele Orselli", + "email": "michele.orselli@gmail.com" + } + ], + "description": "Enforce architectural constraints in your PHP applications", + "support": { + "issues": "https://github.com/phparkitect/arkitect/issues", + "source": "https://github.com/phparkitect/arkitect/tree/0.3.33" + }, + "funding": [ + { + "url": "https://github.com/AlessandroMinoccheri", + "type": "github" + }, + { + "url": "https://github.com/micheleorselli", + "type": "github" + } + ], + "time": "2024-05-28T05:56:58+00:00" + }, { "name": "phpmd/phpmd", "version": "2.15.0", diff --git a/phparkitect.php b/phparkitect.php new file mode 100644 index 0000000..5645c73 --- /dev/null +++ b/phparkitect.php @@ -0,0 +1,80 @@ +that(new ResideInOneOfTheseNamespaces('App\Domain')) + ->should(new HaveNameMatching('*')) + ->because('nous voulons un namespace cohérent pour notre domaine'); + + $rules = [$namespaceRule]; + + // Les classes de Application ne doivent pas dépendre de l'infrastructure + $rules[] = Rule::allClasses() + ->that(new ResideInOneOfTheseNamespaces('App\Domain\*\Application')) + ->should(new NotDependsOnTheseNamespaces('App\Domain\*\Infrastructure')) + ->because('la couche Application ne doit pas dépendre de l\'infrastructure'); + + // Les classes de Domain ne doivent pas dépendre de l'infrastructure ou de l'application + $rules[] = Rule::allClasses() + ->that(new ResideInOneOfTheseNamespaces('App\Domain\*\Domain')) + ->should(new NotDependsOnTheseNamespaces( + 'App\Domain\*\Infrastructure', + 'App\Domain\*\Application' + )) + ->because('la couche Domain ne doit pas dépendre de l\'infrastructure ou de l\'application'); + + // Génération des règles pour chaque domaine + foreach ($domains as $domain) { + // Récupération des autres domaines + $otherDomains = array_filter($domains, fn($d) => $d !== $domain); + $otherDomainsNamespaces = array_map(fn($d) => "App\Domain\\$d\*", $otherDomains); + + // Règle pour la couche Domain + $rules[] = Rule::allClasses() + ->that(new ResideInOneOfTheseNamespaces("App\Domain\\$domain\Domain")) + ->should(new NotHaveDependencyOutsideNamespace("App\Domain\\$domain\Domain", $standardExceptions)) + ->because("la couche Domain de $domain ne doit dépendre que de ses propres classes et des exceptions autorisées"); + + // Règle pour la couche Application + $rules[] = Rule::allClasses() + ->that(new ResideInOneOfTheseNamespaces("App\Domain\\$domain\Application")) + ->should(new NotHaveDependencyOutsideNamespace( + "App\Domain\\$domain", + array_merge($standardExceptions, $externalDependencies) + )) + ->because("la couche Application de $domain ne peut dépendre que de son propre domaine et des dépendances autorisées"); + } + + $config->add($domainClassSet, ...$rules); +}; \ No newline at end of file diff --git a/src/Domain/Scraping/Domain/Model/ValueObject/ChapterUrl.php b/src/Domain/Scraping/Domain/Model/ValueObject/ChapterUrl.php index 32f78f8..3f171f7 100644 --- a/src/Domain/Scraping/Domain/Model/ValueObject/ChapterUrl.php +++ b/src/Domain/Scraping/Domain/Model/ValueObject/ChapterUrl.php @@ -2,7 +2,7 @@ namespace App\Domain\Scraping\Domain\Model\ValueObject; -use Symfony\Component\HttpClient\Exception\InvalidArgumentException; +use InvalidArgumentException; class ChapterUrl {