Skip to content

Commit 8bb8a1f

Browse files
authored
Merge branch 'main' into leak-issue
2 parents 5e50455 + c82446b commit 8bb8a1f

File tree

66 files changed

+929
-160
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+929
-160
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
name: Architectural test
2+
3+
on:
4+
push:
5+
6+
jobs:
7+
phparkitect:
8+
name: PHPArkitect
9+
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- name: "Checkout"
14+
uses: actions/checkout@v2
15+
16+
- name: PHPArkitect
17+
uses: docker://phparkitect/arkitect-github-actions:latest
18+
with:
19+
args: check

.github/workflows/build.yml

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ jobs:
1111
build:
1212
runs-on: "ubuntu-22.04"
1313
strategy:
14+
fail-fast: false
1415
matrix:
15-
php-versions: [ '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2']
16+
php-versions: [ '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3']
1617
coverage-driver: [ 'pcov' ]
1718

1819
steps:
@@ -56,13 +57,6 @@ jobs:
5657
with:
5758
token: ${{ secrets.CODECOV_TOKEN }}
5859

59-
- name: Architectural Rules
60-
uses: docker://phparkitect/arkitect-github-actions:latest
61-
env:
62-
PHP_VERSION: ${{ matrix.php-versions }}
63-
with:
64-
args: check
65-
6660
phar:
6761
runs-on: "ubuntu-20.04"
6862
needs: build

.php-cs-fixer.dist.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
'modernize_types_casting' => true, // Replaces intval, floatval, doubleval, strval and boolval function calls with according type casting operator.
2525
'multiline_whitespace_before_semicolons' => true, // Forbid multi-line whitespace before the closing semicolon or move the semicolon to the new line for chained calls.
2626
'no_unreachable_default_argument_value' => true, // In function arguments there must not be arguments with default values before non-default ones.
27+
'no_superfluous_phpdoc_tags' => ['allow_mixed' => true],// To avoid problems of compatibility with the old php-cs-fixer version used on PHP 7.3
2728
'no_useless_else' => true,
2829
'no_useless_return' => true,
2930
'ordered_class_elements' => true, // Orders the elements of classes/interfaces/traits.

CONTRIBUTORS.md

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,31 @@ Shout out to our top contributors!
44

55
- [AlessandroMinoccheri](https://api.github.com/users/AlessandroMinoccheri)
66
- [fain182](https://api.github.com/users/fain182)
7-
- [micheleorselli](https://api.github.com/users/micheleorselli)
87
- [pfazzi](https://api.github.com/users/pfazzi)
98
- [github-actions[bot]](https://api.github.com/users/github-actions%5Bbot%5D)
10-
- [ricfio](https://api.github.com/users/ricfio)
9+
- [micheleorselli](https://api.github.com/users/micheleorselli)
1110
- [sebastianstucke87](https://api.github.com/users/sebastianstucke87)
11+
- [ricfio](https://api.github.com/users/ricfio)
1212
- [szepeviktor](https://api.github.com/users/szepeviktor)
1313
- [JulienRAVIA](https://api.github.com/users/JulienRAVIA)
14-
- [annervisser](https://api.github.com/users/annervisser)
14+
- [helyakin](https://api.github.com/users/helyakin)
15+
- [ben-challis](https://api.github.com/users/ben-challis)
1516
- [LuigiCardamone](https://api.github.com/users/LuigiCardamone)
17+
- [annervisser](https://api.github.com/users/annervisser)
1618
- [simivar](https://api.github.com/users/simivar)
17-
- [stephpy](https://api.github.com/users/stephpy)
19+
- [jdomenechbLendable](https://api.github.com/users/jdomenechbLendable)
1820
- [dbu](https://api.github.com/users/dbu)
21+
- [stephpy](https://api.github.com/users/stephpy)
22+
- [marmichalski](https://api.github.com/users/marmichalski)
23+
- [hgraca](https://api.github.com/users/hgraca)
1924
- [frankverhoeven](https://api.github.com/users/frankverhoeven)
2025
- [hectorespert](https://api.github.com/users/hectorespert)
26+
- [kapersoft](https://api.github.com/users/kapersoft)
2127
- [jerowork](https://api.github.com/users/jerowork)
2228
- [jkrzefski](https://api.github.com/users/jkrzefski)
2329
- [mloru](https://api.github.com/users/mloru)
30+
- [nikow13](https://api.github.com/users/nikow13)
31+
- [OskarStark](https://api.github.com/users/OskarStark)
2432
- [smortexa](https://api.github.com/users/smortexa)
2533
- [DonCallisto](https://api.github.com/users/DonCallisto)
34+
- [notcgi](https://api.github.com/users/notcgi)

README.md

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ Currently, you can check if a class:
155155
### Depends on a namespace
156156

157157
```php
158-
$rules = Rule::allClasses()
158+
$rules[] = Rule::allClasses()
159159
->that(new ResideInOneOfTheseNamespaces('App\Domain'))
160160
->should(new DependsOnlyOnTheseNamespaces('App\Domain', 'Ramsey\Uuid'))
161161
->because('we want to protect our domain from external dependencies except for Ramsey\Uuid');
@@ -164,7 +164,7 @@ $rules = Rule::allClasses()
164164
### Doc block contains a string
165165

166166
```php
167-
$rules = Rule::allClasses()
167+
$rules[] = Rule::allClasses()
168168
->that(new ResideInOneOfTheseNamespaces('App\Domain\Events'))
169169
->should(new ContainDocBlockLike('@psalm-immutable'))
170170
->because('we want to enforce immutability');
@@ -173,7 +173,7 @@ $rules = Rule::allClasses()
173173
### Doc block not contains a string
174174

175175
```php
176-
$rules = Rule::allClasses()
176+
$rules[] = Rule::allClasses()
177177
->that(new ResideInOneOfTheseNamespaces('App\Controller'))
178178
->should(new NotContainDocBlockLike('@psalm-immutable'))
179179
->because('we don\'t want to enforce immutability');
@@ -182,16 +182,18 @@ $rules = Rule::allClasses()
182182
### Extend another class
183183

184184
```php
185-
$rules = Rule::allClasses()
185+
$rules[] = Rule::allClasses()
186186
->that(new ResideInOneOfTheseNamespaces('App\Controller'))
187187
->should(new Extend('App\Controller\AbstractController'))
188188
->because('we want to be sure that all controllers extend AbstractController');
189+
190+
You can add multiple parameters, the violation will happen when none of them match
189191
```
190192

191193
### Has an attribute (requires PHP >= 8.0)
192194

193195
```php
194-
$rules = Rule::allClasses()
196+
$rules[] = Rule::allClasses()
195197
->that(new ResideInOneOfTheseNamespaces('App\Controller'))
196198
->should(new HaveAttribute('AsController'))
197199
->because('it configures the service container');
@@ -200,7 +202,7 @@ $rules = Rule::allClasses()
200202
### Have a name matching a pattern
201203

202204
```php
203-
$rules = Rule::allClasses()
205+
$rules[] = Rule::allClasses()
204206
->that(new ResideInOneOfTheseNamespaces('App\Service'))
205207
->should(new HaveNameMatching('*Service'))
206208
->because('we want uniform naming for services');
@@ -209,7 +211,7 @@ $rules = Rule::allClasses()
209211
### Implements an interface
210212

211213
```php
212-
$rules = Rule::allClasses()
214+
$rules[] = Rule::allClasses()
213215
->that(new ResideInOneOfTheseNamespaces('App\Controller'))
214216
->should(new Implement('ContainerAwareInterface'))
215217
->because('all controllers should be container aware');
@@ -218,7 +220,7 @@ $rules = Rule::allClasses()
218220
### Not implements an interface
219221

220222
```php
221-
$rules = Rule::allClasses()
223+
$rules[] = Rule::allClasses()
222224
->that(new ResideInOneOfTheseNamespaces('App\Infrastructure\RestApi\Public'))
223225
->should(new NotImplement('ContainerAwareInterface'))
224226
->because('all public controllers should not be container aware');
@@ -227,7 +229,7 @@ $rules = Rule::allClasses()
227229
### Is abstract
228230

229231
```php
230-
$rules = Rule::allClasses()
232+
$rules[] = Rule::allClasses()
231233
->that(new ResideInOneOfTheseNamespaces('App\Customer\Service'))
232234
->should(new IsAbstract())
233235
->because('we want to be sure that classes are abstract in a specific namespace');
@@ -236,7 +238,7 @@ $rules = Rule::allClasses()
236238
### Is trait
237239

238240
```php
239-
$rules = Rule::allClasses()
241+
$rules[] = Rule::allClasses()
240242
->that(new ResideInOneOfTheseNamespaces('App\Customer\Service\Traits'))
241243
->should(new IsTrait())
242244
->because('we want to be sure that there are only traits in a specific namespace');
@@ -245,16 +247,25 @@ $rules = Rule::allClasses()
245247
### Is final
246248

247249
```php
248-
$rules = Rule::allClasses()
250+
$rules[] = Rule::allClasses()
249251
->that(new ResideInOneOfTheseNamespaces('App\Domain\Aggregates'))
250252
->should(new IsFinal())
251253
->because('we want to be sure that aggregates are final classes');
252254
```
253255

256+
### Is readonly
257+
258+
```php
259+
$rules[] = Rule::allClasses()
260+
->that(new ResideInOneOfTheseNamespaces('App\Domain\ValueObjects'))
261+
->should(new IsReadonly())
262+
->because('we want to be sure that value objects are readonly classes');
263+
```
264+
254265
### Is interface
255266

256267
```php
257-
$rules = Rule::allClasses()
268+
$rules[] = Rule::allClasses()
258269
->that(new ResideInOneOfTheseNamespaces('App\Interfaces'))
259270
->should(new IsInterface())
260271
->because('we want to be sure that all interfaces are in one directory');
@@ -263,7 +274,7 @@ $rules = Rule::allClasses()
263274
### Is enum
264275

265276
```php
266-
$rules = Rule::allClasses()
277+
$rules[] = Rule::allClasses()
267278
->that(new ResideInOneOfTheseNamespaces('App\Enum'))
268279
->should(new IsEnum())
269280
->because('we want to be sure that all classes are enum');
@@ -272,7 +283,7 @@ $rules = Rule::allClasses()
272283
### Is not abstract
273284

274285
```php
275-
$rules = Rule::allClasses()
286+
$rules[] = Rule::allClasses()
276287
->that(new ResideInOneOfTheseNamespaces('App\Domain'))
277288
->should(new IsNotAbstract())
278289
->because('we want to avoid abstract classes into our domain');
@@ -281,7 +292,7 @@ $rules = Rule::allClasses()
281292
### Is not trait
282293

283294
```php
284-
$rules = Rule::allClasses()
295+
$rules[] = Rule::allClasses()
285296
->that(new ResideInOneOfTheseNamespaces('App\Domain'))
286297
->should(new IsNotTrait())
287298
->because('we want to avoid traits in our codebase');
@@ -290,16 +301,25 @@ $rules = Rule::allClasses()
290301
### Is not final
291302

292303
```php
293-
$rules = Rule::allClasses()
304+
$rules[] = Rule::allClasses()
294305
->that(new ResideInOneOfTheseNamespaces('App\Infrastructure\Doctrine'))
295306
->should(new IsNotFinal())
296307
->because('we want to be sure that our adapters are not final classes');
297308
```
298309

310+
### Is not readonly
311+
312+
```php
313+
$rules[] = Rule::allClasses()
314+
->that(new ResideInOneOfTheseNamespaces('App\Domain\Entity'))
315+
->should(new IsNotReadonly())
316+
->because('we want to be sure that there are no readonly entities');
317+
```
318+
299319
### Is not interface
300320

301321
```php
302-
$rules = Rule::allClasses()
322+
$rules[] = Rule::allClasses()
303323
->that(new ResideInOneOfTheseNamespaces('Tests\Integration'))
304324
->should(new IsNotInterface())
305325
->because('we want to be sure that we do not have interfaces in tests');
@@ -308,7 +328,7 @@ $rules = Rule::allClasses()
308328
### Is not enum
309329

310330
```php
311-
$rules = Rule::allClasses()
331+
$rules[] = Rule::allClasses()
312332
->that(new ResideInOneOfTheseNamespaces('App\Controller'))
313333
->should(new IsNotEnum())
314334
->because('we want to be sure that all classes are not enum');
@@ -317,7 +337,7 @@ $rules = Rule::allClasses()
317337
### Not depends on a namespace
318338

319339
```php
320-
$rules = Rule::allClasses()
340+
$rules[] = Rule::allClasses()
321341
->that(new ResideInOneOfTheseNamespaces('App\Application'))
322342
->should(new NotDependsOnTheseNamespaces('App\Infrastructure'))
323343
->because('we want to avoid coupling between application layer and infrastructure layer');
@@ -326,25 +346,27 @@ $rules = Rule::allClasses()
326346
### Not extend another class
327347

328348
```php
329-
$rules = Rule::allClasses()
349+
$rules[] = Rule::allClasses()
330350
->that(new ResideInOneOfTheseNamespaces('App\Controller\Admin'))
331351
->should(new NotExtend('App\Controller\AbstractController'))
332352
->because('we want to be sure that all admin controllers not extend AbstractController for security reasons');
353+
354+
You can add multiple parameters, the violation will happen when one of them match
333355
```
334356

335357
### Don't have dependency outside a namespace
336358

337359
```php
338-
$rules = Rule::allClasses()
360+
$rules[] = Rule::allClasses()
339361
->that(new ResideInOneOfTheseNamespaces('App\Domain'))
340-
->should(new NotHaveDependencyOutsideNamespace('App\Domain', ['Ramsey\Uuid']))
362+
->should(new NotHaveDependencyOutsideNamespace('App\Domain', ['Ramsey\Uuid'], true))
341363
->because('we want protect our domain except for Ramsey\Uuid');
342364
```
343365

344366
### Not have a name matching a pattern
345367

346368
```php
347-
$rules = Rule::allClasses()
369+
$rules[] = Rule::allClasses()
348370
->that(new ResideInOneOfTheseNamespaces('App'))
349371
->should(new NotHaveNameMatching('*Manager'))
350372
->because('*Manager is too vague in naming classes');
@@ -353,7 +375,7 @@ $rules = Rule::allClasses()
353375
### Reside in a namespace
354376

355377
```php
356-
$rules = Rule::allClasses()
378+
$rules[] = Rule::allClasses()
357379
->that(new HaveNameMatching('*Handler'))
358380
->should(new ResideInOneOfTheseNamespaces('App\Application'))
359381
->because('we want to be sure that all CommandHandlers are in a specific namespace');
@@ -363,9 +385,9 @@ $rules = Rule::allClasses()
363385
### Not reside in a namespace
364386

365387
```php
366-
$rules = Rule::allClasses()
388+
$rules[] = Rule::allClasses()
367389
->that(new Extend('App\Domain\Event'))
368-
->should(new NotResideInOneOfTheseNamespaces('App\Application', 'App\Infrastructure'))
390+
->should(new NotResideInTheseNamespaces('App\Application', 'App\Infrastructure'))
369391
->because('we want to be sure that all events not reside in wrong layers');
370392
```
371393

composer.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "Enforce architectural constraints in your PHP applications",
44
"type": "library",
55
"license": "MIT",
6-
"version": "0.3.25",
6+
"version": "0.3.33",
77
"authors": [
88
{
99
"name": "Pietro Campagnano",
@@ -24,9 +24,9 @@
2424
],
2525
"require": {
2626
"php": "^7.1|^8",
27-
"symfony/finder": "^3.0|^4.0|^5.0|^6.0",
28-
"symfony/event-dispatcher": "^3.0|^4.0|^5.0|^6.0",
29-
"symfony/console": "^3.0|^4.0|^5.0|^6.0",
27+
"symfony/finder": "^3.0|^4.0|^5.0|^6.0|^7.0",
28+
"symfony/event-dispatcher": "^3.0|^4.0|^5.0|^6.0|^7.0",
29+
"symfony/console": "^3.0|^4.0|^5.0|^6.0|^7.0",
3030
"symfony/polyfill-php80": "^1.20",
3131
"nikic/php-parser": "~4",
3232
"webmozart/assert": "^1.9",
@@ -36,7 +36,7 @@
3636
},
3737
"require-dev": {
3838
"roave/security-advisories": "dev-master",
39-
"symfony/var-dumper": "^3.0|^4.0|^5.0|^6.0",
39+
"symfony/var-dumper": "^3.0|^4.0|^5.0|^6.0|^7.0",
4040
"vimeo/psalm": "^4.6",
4141
"friendsofphp/php-cs-fixer": "^3.0",
4242
"phpunit/phpunit": "^7.5|^9.0|^10.0",

src/Analyzer/ClassDependency.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class ClassDependency
88
/** @var int */
99
private $line;
1010

11-
/** @var \Arkitect\Analyzer\FullyQualifiedClassName */
11+
/** @var FullyQualifiedClassName */
1212
private $FQCN;
1313

1414
public function __construct(string $FQCN, int $line)

0 commit comments

Comments
 (0)