refactor analyze results, work out cyclic dependencies

master
Josha von Gizycki 2 days ago
parent 29972a6982
commit 933f193dd7

@ -17,7 +17,10 @@ return static function (DeptracConfig $config): void {
$analyzePublic = Layer::withName('AnalyzePublic') $analyzePublic = Layer::withName('AnalyzePublic')
->collectors( ->collectors(
ClassLikeConfig::create('Kartierung\\Analyze\\Exception\\.+'), ClassLikeConfig::create('Kartierung\\Analyze\\Exception\\.+'),
ClassLikeConfig::create('Kartierung\\Analyze\\Result\\.+') ClassLikeConfig::create('Kartierung\\Analyze\\Result\\.+'),
ClassLikeConfig::create('Kartierung\\Analyze\\RepositoryAnalyzer'),
ClassLikeConfig::create('Kartierung\\Analyze\\EntityAnalyzer'),
ClassLikeConfig::create('Kartierung\\Analyze\\RecursionCheck')
), ),
$analyze = Layer::withName('Analyze') $analyze = Layer::withName('Analyze')
->collectors( ->collectors(
@ -30,12 +33,20 @@ return static function (DeptracConfig $config): void {
), ),
$attribute = Layer::withName('Attribute') $attribute = Layer::withName('Attribute')
->collectors( ->collectors(
ClassLikeConfig::create('Kartierung\\Attribute\\.*'), ClassLikeConfig::create('Kartierung\\Attribute\\.+'),
), ),
$repository = Layer::withName('Repository')
->collectors(
ClassLikeConfig::create('Kartierung\\Repository\\.+')
)
) )
->rulesets( ->rulesets(
Ruleset::forLayer($analyze) Ruleset::forLayer($analyze)
->accesses($attribute),
Ruleset::forLayer($analyzePublic)
->accesses($attribute) ->accesses($attribute)
->accesses($analyzePublic), ->accesses($analyze),
Ruleset::forLayer($repository)
->accesses($analyzePublic)
); );
}; };

@ -11,7 +11,6 @@ use Kartierung\Analyze\Result\RepositoryMethodParameter;
use Kartierung\Analyze\Result\RepositoryResult; use Kartierung\Analyze\Result\RepositoryResult;
use Kartierung\Attribute\ListOf; use Kartierung\Attribute\ListOf;
use Kartierung\Attribute\Query; use Kartierung\Attribute\Query;
use Kartierung\Repository\ResolutionStrategy\ResolutionStrategyFactory;
use ReflectionClass; use ReflectionClass;
use ReflectionIntersectionType; use ReflectionIntersectionType;
use ReflectionMethod; use ReflectionMethod;
@ -23,11 +22,6 @@ use ReflectionUnionType;
*/ */
readonly class RepositoryAnalyzer readonly class RepositoryAnalyzer
{ {
public function __construct(
private ResolutionStrategyFactory $methodValidator
) {}
/** /**
* @param class-string<R> $repositoryClass * @param class-string<R> $repositoryClass
* @noinspection PhpDocMissingThrowsInspection * @noinspection PhpDocMissingThrowsInspection
@ -40,6 +34,7 @@ readonly class RepositoryAnalyzer
$refClass = new ReflectionClass($repositoryClass); $refClass = new ReflectionClass($repositoryClass);
return new RepositoryResult( return new RepositoryResult(
repoFqcn: $repositoryClass,
methods: $this->methods($refClass) methods: $this->methods($refClass)
); );
} }
@ -60,15 +55,6 @@ readonly class RepositoryAnalyzer
$params = $this->parameters($refMethod); $params = $this->parameters($refMethod);
$name = $refMethod->name; $name = $refMethod->name;
$resolutionStrategy = $this->methodValidator->forRepositoryMethod(
repName: $refClass->name,
methodName: $name,
query: $query,
returnType: $returnType,
returnsNullable: $returnsNullable,
listType: $listType,
params: $params
);
$methods[$refMethod->name] = new RepositoryMethod( $methods[$refMethod->name] = new RepositoryMethod(
query: $query, query: $query,
@ -77,7 +63,6 @@ readonly class RepositoryAnalyzer
returnListType: $listType, returnListType: $listType,
name: $name, name: $name,
parameters: $params, parameters: $params,
resolutionStrategy: $resolutionStrategy
); );
} }

@ -19,15 +19,6 @@ readonly class RepositoryMethod
public bool $returnsNullable, public bool $returnsNullable,
public ?string $returnListType, public ?string $returnListType,
public string $name, public string $name,
public array $parameters, public array $parameters
public ResolutionStrategy $resolutionStrategy
) {} ) {}
/**
* @param array<string, mixed> $parameters
*/
public function createQuery(array $parameters): LazyQuery
{
return $this->resolutionStrategy->createQuery($this, $parameters);
}
} }

@ -7,9 +7,11 @@ namespace Kartierung\Analyze\Result;
readonly class RepositoryResult readonly class RepositoryResult
{ {
/** /**
* @param class-string<object> $repoFqcn
* @param array<string, RepositoryMethod> $methods * @param array<string, RepositoryMethod> $methods
*/ */
public function __construct( public function __construct(
public string $repoFqcn,
public array $methods public array $methods
) {} ) {}
} }

@ -23,8 +23,7 @@ readonly class Repository
*/ */
public function ofType(string $clazz): object public function ofType(string $clazz): object
{ {
$resolutionStrategyFactory = new ResolutionStrategyFactory(); $repoResult = (new RepositoryAnalyzer())->analyze($clazz);
$repoResult = (new RepositoryAnalyzer($resolutionStrategyFactory))->analyze($clazz);
/** /**
* @var R $proxy * @var R $proxy
@ -46,7 +45,11 @@ readonly class Repository
$repoMethod = $this->repoResult->methods[$methodName]; $repoMethod = $this->repoResult->methods[$methodName];
$queryArgs = $this->callArgsToQueryArgs($repoMethod, $arguments); $queryArgs = $this->callArgsToQueryArgs($repoMethod, $arguments);
$query = $repoMethod->createQuery($queryArgs); $strategy = (new ResolutionStrategyFactory())->forRepositoryMethod(
$this->repoResult,
$repoMethod
);
$query = $strategy->createQuery($repoMethod, $queryArgs);
return $query->execute($this->pdo); return $query->execute($this->pdo);
} }

@ -5,6 +5,8 @@ declare(strict_types=1);
namespace Kartierung\Repository\ResolutionStrategy; namespace Kartierung\Repository\ResolutionStrategy;
use Kartierung\Analyze\Exception\InvalidRepository; use Kartierung\Analyze\Exception\InvalidRepository;
use Kartierung\Analyze\Result\RepositoryMethod;
use Kartierung\Analyze\Result\RepositoryResult;
class ResolutionStrategyFactory class ResolutionStrategyFactory
{ {
@ -13,17 +15,20 @@ class ResolutionStrategyFactory
* @param class-string|null $listType * @param class-string|null $listType
*/ */
public function forRepositoryMethod( public function forRepositoryMethod(
string $repName, RepositoryResult $repositoryResult,
string $methodName, RepositoryMethod $method,
?string $query,
string $returnType,
bool $returnsNullable,
?string $listType,
array $params
): ResolutionStrategy ): ResolutionStrategy
{ {
$params = $method->parameters;
$oneParam = count($params) === 1; $oneParam = count($params) === 1;
$query = $method->query;
$methodName = $method->name;
$returnType = $method->returnType;
$returnsNullable = $method->returnsNullable;
$listType = $method->returnListType;
$repName = $repositoryResult->repoFqcn;
return match (true) { return match (true) {
$query !== null => new UserDefinedQuery(), $query !== null => new UserDefinedQuery(),

@ -37,10 +37,9 @@ class FindAllTest extends SqliteBaseCase
returnsNullable: true, returnsNullable: true,
returnListType: SimpleEntity::class, returnListType: SimpleEntity::class,
name: '', name: '',
parameters: [], parameters: []
resolutionStrategy: new FindAll()
); );
$query = $method->createQuery([]); $query = (new FindAll())->createQuery($method, []);
// When // When
$result = $query->execute($this->getPdo()); $result = $query->execute($this->getPdo());

@ -39,9 +39,8 @@ class FindByIdTest extends SqliteBaseCase
returnListType: '', returnListType: '',
name: '', name: '',
parameters: [], parameters: [],
resolutionStrategy: $findBy
); );
$query = $method->createQuery([1]); $query = $findBy->createQuery($method, [1]);
// When // When
$result = $query->execute($this->getPdo()); $result = $query->execute($this->getPdo());
@ -65,9 +64,8 @@ class FindByIdTest extends SqliteBaseCase
returnListType: '', returnListType: '',
name: '', name: '',
parameters: [], parameters: [],
resolutionStrategy: $findBy
); );
$query = $method->createQuery([3]); $query = $findBy->createQuery($method, [3]);
// When // When
$result = $query->execute($this->getPdo()); $result = $query->execute($this->getPdo());
@ -91,9 +89,8 @@ class FindByIdTest extends SqliteBaseCase
returnListType: '', returnListType: '',
name: '', name: '',
parameters: [], parameters: [],
resolutionStrategy: $findBy
); );
$query = $method->createQuery([4]); $query = $findBy->createQuery($method, [4]);
// When // When
$result = $query->execute($this->getPdo()); $result = $query->execute($this->getPdo());

@ -4,6 +4,8 @@ declare(strict_types=1);
namespace Kartierung\Repository\ResolutionStrategy; namespace Kartierung\Repository\ResolutionStrategy;
use Kartierung\Analyze\Result\RepositoryMethod;
use Kartierung\Analyze\Result\RepositoryResult;
use Kartierung\FullEntity; use Kartierung\FullEntity;
use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@ -33,15 +35,24 @@ class ResolutionStrategyFactoryTest extends TestCase
string $strategyClass string $strategyClass
): void ): void
{ {
// When // Given
$function = (new ResolutionStrategyFactory())->forRepositoryMethod( $method = new RepositoryMethod(
repName: $repName,
methodName: $name,
query: $query, query: $query,
returnType: $returnType, returnType: $returnType,
returnsNullable: $returnsNullable, returnsNullable: $returnsNullable,
listType: $listType, returnListType: $listType,
params: $params name: $name,
parameters: $params
);
$repositoryResult = new RepositoryResult(
'',
[$method]
);
// When
$function = (new ResolutionStrategyFactory())->forRepositoryMethod(
$repositoryResult,
$method
); );
// Then // Then
@ -69,15 +80,24 @@ class ResolutionStrategyFactoryTest extends TestCase
string $strategyClass string $strategyClass
): void ): void
{ {
// When // Given
$function = (new ResolutionStrategyFactory())->forRepositoryMethod( $method = new RepositoryMethod(
repName: $repName,
methodName: $name,
query: $query, query: $query,
returnType: $returnType, returnType: $returnType,
returnsNullable: false, returnsNullable: true,
listType: $listType, returnListType: $listType,
params: $params name: $name,
parameters: $params
);
$repositoryResult = new RepositoryResult(
'',
[$method]
);
// When
$function = (new ResolutionStrategyFactory())->forRepositoryMethod(
$repositoryResult,
$method
); );
// Then // Then

@ -47,10 +47,9 @@ class SaveEntityTest extends SqliteBaseCase
function: ParameterFunction::STATEMENT_PARAMETER function: ParameterFunction::STATEMENT_PARAMETER
) )
], ],
resolutionStrategy: $strategy
); );
$entity = new SimpleEntity(null, 'foobar'); $entity = new SimpleEntity(null, 'foobar');
$query = $method->createQuery([$entity]); $query = $strategy->createQuery($method, [$entity]);
// When // When
$result = $query->execute($this->getPdo()); $result = $query->execute($this->getPdo());
@ -83,10 +82,9 @@ class SaveEntityTest extends SqliteBaseCase
function: ParameterFunction::STATEMENT_PARAMETER function: ParameterFunction::STATEMENT_PARAMETER
) )
], ],
resolutionStrategy: $strategy
); );
$entity = new SimpleEntity(1, 'foobar'); $entity = new SimpleEntity(1, 'foobar');
$query = $method->createQuery([$entity]); $query = $strategy->createQuery($method, [$entity]);
// When // When
$result = $query->execute($this->getPdo()); $result = $query->execute($this->getPdo());

Loading…
Cancel
Save