Skip to content

Commit

Permalink
Add type checks
Browse files Browse the repository at this point in the history
  • Loading branch information
staudenmeir committed Sep 30, 2024
1 parent 485076c commit b8fb6fc
Show file tree
Hide file tree
Showing 14 changed files with 350 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/.docker export-ignore
/.github export-ignore
/tests export-ignore
/types export-ignore
.gitattributes export-ignore
.gitignore export-ignore
docker-compose.ci.yml export-ignore
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/static-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,7 @@ jobs:
run: |
docker compose -f docker-compose.yml -f docker-compose.ci.yml run --rm php${{ matrix.php }} \
vendor/bin/phpstan analyse --error-format=github --memory-limit=-1
- name: Analyse types
run: |
docker compose -f docker-compose.yml -f docker-compose.ci.yml run --rm php${{ matrix.php }} \
vendor/bin/phpstan analyse --configuration=phpstan.types.neon.dist --error-format=github --memory-limit=-1
6 changes: 6 additions & 0 deletions phpstan.types.neon.dist
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
includes:
- ./vendor/larastan/larastan/extension.neon
parameters:
level: 9
paths:
- types
15 changes: 15 additions & 0 deletions types/Graph/Builder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Tree;

use Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node;

use function PHPStan\Testing\assertType;

function test(Node $node): void
{
assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Builder<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->newQuery()
);
}
16 changes: 16 additions & 0 deletions types/Graph/Models/Node.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Graph\Models;

use Illuminate\Database\Eloquent\Model;
use Staudenmeir\LaravelAdjacencyList\Eloquent\HasGraphRelationships;

class Node extends Model
{
use HasGraphRelationships;

public function getPivotTableName(): string
{
return 'edges';
}
}
50 changes: 50 additions & 0 deletions types/Graph/Relationships.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Graph;

use Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node;

use function PHPStan\Testing\assertType;

function test(Node $node): void
{
assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->ancestors()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->ancestorsAndSelf()
);

assertType(
'Illuminate\Database\Eloquent\Relations\BelongsToMany<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->children()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Descendants<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->childrenAndSelf()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Descendants<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->descendants()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Descendants<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->descendantsAndSelf()
);

assertType(
'Illuminate\Database\Eloquent\Relations\BelongsToMany<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->parents()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->parentsAndSelf()
);
}
35 changes: 35 additions & 0 deletions types/Graph/Scopes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Graph;

use Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node;

use function PHPStan\Testing\assertType;

function test(Node $node): void
{
assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->ancestors()->subgraph(fn () => null)
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->ancestors()->whereDepth(3)
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->ancestors()->breadthFirst()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->ancestors()->depthFirst()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Graph\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Graph\Models\Node>',
$node->ancestors()->whereDepth(3)->breadthFirst()
);
}
15 changes: 15 additions & 0 deletions types/Tree/Builder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Tree;

use Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User;

use function PHPStan\Testing\assertType;

function test(User $user): void
{
assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Builder<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->newQuery()
);
}
10 changes: 10 additions & 0 deletions types/Tree/Models/Post.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Tree\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
//
}
10 changes: 10 additions & 0 deletions types/Tree/Models/Role.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Tree\Models;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
//
}
10 changes: 10 additions & 0 deletions types/Tree/Models/Tag.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Tree\Models;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
//
}
11 changes: 11 additions & 0 deletions types/Tree/Models/User.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Tree\Models;

use Illuminate\Database\Eloquent\Model;
use Staudenmeir\LaravelAdjacencyList\Eloquent\HasRecursiveRelationships;

class User extends Model
{
use HasRecursiveRelationships;
}
107 changes: 107 additions & 0 deletions types/Tree/Relationships.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Tree;

use Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Post;
use Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Role;
use Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Tag;
use Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User;

use function PHPStan\Testing\assertType;

function test(User $user): void
{
assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestorsAndSelf()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Bloodline<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->bloodline()
);

assertType(
'Illuminate\Database\Eloquent\Relations\HasMany<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->children()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Descendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->childrenAndSelf()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Descendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->descendants()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Descendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->descendantsAndSelf()
);

assertType(
'Illuminate\Database\Eloquent\Relations\BelongsTo<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User, Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->parent()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->parentAndSelf()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\RootAncestor<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->rootAncestor()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\RootAncestorOrSelf<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->rootAncestorOrSelf()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Siblings<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->siblings()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Siblings<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->siblingsAndSelf()
);
assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\BelongsToManyOfDescendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Role>',
$user->belongsToManyOfDescendants(Role::class)
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\BelongsToManyOfDescendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Role>',
$user->belongsToManyOfDescendantsAndSelf(Role::class)
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\HasManyOfDescendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Post>',
$user->hasManyOfDescendantsAndSelf(Post::class)
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\HasManyOfDescendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Post>',
$user->hasManyOfDescendantsAndSelf(Post::class)
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\MorphToManyOfDescendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Tag>',
$user->morphToManyOfDescendants(Tag::class, 'taggable')
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\MorphToManyOfDescendants<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\Tag>',
$user->morphToManyOfDescendantsAndSelf(Tag::class, 'taggable')
);
}
60 changes: 60 additions & 0 deletions types/Tree/Scopes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

namespace Staudenmeir\LaravelAdjacencyList\Types\Tree;

use Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User;

use function PHPStan\Testing\assertType;

function test(User $user): void
{
assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Builder<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->tree()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Builder<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->treeOf(fn () => null)
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()->doesntHaveChildren()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()->hasChildren()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()->hasParent()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()->isLeaf()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()->isRoot()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()->breadthFirst()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()->depthFirst()
);

assertType(
'Staudenmeir\LaravelAdjacencyList\Eloquent\Relations\Ancestors<Staudenmeir\LaravelAdjacencyList\Types\Tree\Models\User>',
$user->ancestors()->hasChildren()->breadthFirst()
);
}

0 comments on commit b8fb6fc

Please sign in to comment.