From 2ec5c1e2fd41bf98c2d21e544b74c8aaba3b4262 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pudil?= <me@jiripudil.cz>
Date: Wed, 24 Nov 2021 15:56:20 +0100
Subject: [PATCH] update to grifart/scaffolder dev-master

---
 composer.json                                 |  2 +-
 src/Scaffolding/Builders.php                  | 56 -------------------
 src/Scaffolding/Definitions.php               | 55 ++++++++++++++++++
 ...or.php => ModificationsImplementation.php} | 16 ++++--
 .../PrivateConstructorDecorator.php           | 17 ------
 src/Scaffolding/ReconstituteConstructor.php   | 32 +++++++++++
 .../ReconstituteConstructorDecorator.php      | 30 ----------
 src/Scaffolding/Scaffolding.php               | 46 +++++++--------
 ...eDecorator.php => TableImplementation.php} | 16 ++++--
 9 files changed, 133 insertions(+), 137 deletions(-)
 delete mode 100644 src/Scaffolding/Builders.php
 create mode 100644 src/Scaffolding/Definitions.php
 rename src/Scaffolding/{ModificationsDecorator.php => ModificationsImplementation.php} (87%)
 delete mode 100644 src/Scaffolding/PrivateConstructorDecorator.php
 create mode 100644 src/Scaffolding/ReconstituteConstructor.php
 delete mode 100644 src/Scaffolding/ReconstituteConstructorDecorator.php
 rename src/Scaffolding/{TableDecorator.php => TableImplementation.php} (95%)

diff --git a/composer.json b/composer.json
index 78456e1..dbba9aa 100644
--- a/composer.json
+++ b/composer.json
@@ -24,7 +24,7 @@
     "require": {
         "php": "^8.0",
         "dibi/dibi": "^4.0.2",
-        "grifart/scaffolder": "^0.5.3",
+        "grifart/scaffolder": "^0.6.0",
         "nette/utils": "^3.0.1"
     },
     "require-dev": {
diff --git a/src/Scaffolding/Builders.php b/src/Scaffolding/Builders.php
deleted file mode 100644
index 439104d..0000000
--- a/src/Scaffolding/Builders.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php declare(strict_types = 1);
-
-namespace Grifart\Tables\Scaffolding;
-
-use Grifart\ClassScaffolder\Definition\ClassDefinition;
-use Grifart\ClassScaffolder\Definition\ClassDefinitionBuilder;
-
-
-/**
- * @implements \IteratorAggregate<ClassDefinition>
- */
-final class Builders implements \IteratorAggregate
-{
-	private function __construct(
-		private ClassDefinitionBuilder $rowClass,
-		private ClassDefinitionBuilder $modificationsClass,
-		private ClassDefinitionBuilder $tableClass,
-	) {}
-
-	public static function from(
-		ClassDefinitionBuilder $rowClass,
-		ClassDefinitionBuilder $modificationsClass,
-		ClassDefinitionBuilder $tableClass,
-	): self
-	{
-		return new self(
-			$rowClass,
-			$modificationsClass,
-			$tableClass,
-		);
-	}
-
-	public function getRowClass(): ClassDefinitionBuilder
-	{
-		return $this->rowClass;
-	}
-
-	public function getModificationsClass(): ClassDefinitionBuilder
-	{
-		return $this->modificationsClass;
-	}
-
-	public function getTableClass(): ClassDefinitionBuilder
-	{
-		return $this->tableClass;
-	}
-
-
-	public function getIterator(): \Traversable
-	{
-		yield $this->rowClass->build();
-		yield $this->modificationsClass->build();
-		yield $this->tableClass->build();
-	}
-
-}
diff --git a/src/Scaffolding/Definitions.php b/src/Scaffolding/Definitions.php
new file mode 100644
index 0000000..9b22139
--- /dev/null
+++ b/src/Scaffolding/Definitions.php
@@ -0,0 +1,55 @@
+<?php declare(strict_types = 1);
+
+namespace Grifart\Tables\Scaffolding;
+
+use Grifart\ClassScaffolder\Definition\ClassDefinition;
+
+
+/**
+ * @implements \IteratorAggregate<ClassDefinition>
+ */
+final class Definitions implements \IteratorAggregate
+{
+	private function __construct(
+		private ClassDefinition $rowClass,
+		private ClassDefinition $modificationsClass,
+		private ClassDefinition $tableClass,
+	) {}
+
+	public static function from(
+		ClassDefinition $rowClass,
+		ClassDefinition $modificationsClass,
+		ClassDefinition $tableClass,
+	): self
+	{
+		return new self(
+			$rowClass,
+			$modificationsClass,
+			$tableClass,
+		);
+	}
+
+	public function getRowClass(): ClassDefinition
+	{
+		return $this->rowClass;
+	}
+
+	public function getModificationsClass(): ClassDefinition
+	{
+		return $this->modificationsClass;
+	}
+
+	public function getTableClass(): ClassDefinition
+	{
+		return $this->tableClass;
+	}
+
+
+	public function getIterator(): \Traversable
+	{
+		yield $this->rowClass;
+		yield $this->modificationsClass;
+		yield $this->tableClass;
+	}
+
+}
diff --git a/src/Scaffolding/ModificationsDecorator.php b/src/Scaffolding/ModificationsImplementation.php
similarity index 87%
rename from src/Scaffolding/ModificationsDecorator.php
rename to src/Scaffolding/ModificationsImplementation.php
index ea97881..43e578d 100644
--- a/src/Scaffolding/ModificationsDecorator.php
+++ b/src/Scaffolding/ModificationsImplementation.php
@@ -3,16 +3,15 @@
 
 namespace Grifart\Tables\Scaffolding;
 
-use Grifart\ClassScaffolder\Decorators\ClassDecorator;
+use Grifart\ClassScaffolder\Capabilities\Capability;
+use Grifart\ClassScaffolder\ClassInNamespace;
 use Grifart\ClassScaffolder\Definition\ClassDefinition;
 use Grifart\Tables\Modifications;
 use Grifart\Tables\ModificationsTrait;
-use Nette\PhpGenerator\ClassType;
 use Nette\PhpGenerator\Parameter;
 use Nette\PhpGenerator\PhpLiteral;
-use Nette\PhpGenerator\PhpNamespace;
 
-final class ModificationsDecorator implements ClassDecorator
+final class ModificationsImplementation implements Capability
 {
 
 	private string $modificationsStorage;
@@ -29,8 +28,15 @@ final class ModificationsDecorator implements ClassDecorator
 	}
 
 
-	public function decorate(PhpNamespace $namespace, ClassType $classType, ClassDefinition $definition): void
+	public function applyTo(
+		ClassDefinition $definition,
+		ClassInNamespace $draft,
+		?ClassInNamespace $current,
+	): void
 	{
+		$namespace = $draft->getNamespace();
+		$classType = $draft->getClassType();
+
 		$namespace->addUse(ModificationsTrait::class);
 		$classType->addTrait(ModificationsTrait::class);
 
diff --git a/src/Scaffolding/PrivateConstructorDecorator.php b/src/Scaffolding/PrivateConstructorDecorator.php
deleted file mode 100644
index 10a36db..0000000
--- a/src/Scaffolding/PrivateConstructorDecorator.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php declare(strict_types=1);
-
-namespace Grifart\Tables\Scaffolding;
-
-use Grifart\ClassScaffolder\Decorators\ClassDecorator;
-use Grifart\ClassScaffolder\Definition\ClassDefinition;
-use Nette\PhpGenerator\ClassType;
-use Nette\PhpGenerator\PhpNamespace;
-
-final class PrivateConstructorDecorator implements ClassDecorator
-{
-
-	public function decorate(PhpNamespace $namespace, ClassType $classType, ClassDefinition $definition): void
-	{
-		$classType->getMethod('__construct')->setPrivate();
-	}
-}
diff --git a/src/Scaffolding/ReconstituteConstructor.php b/src/Scaffolding/ReconstituteConstructor.php
new file mode 100644
index 0000000..8059191
--- /dev/null
+++ b/src/Scaffolding/ReconstituteConstructor.php
@@ -0,0 +1,32 @@
+<?php declare(strict_types=1);
+
+namespace Grifart\Tables\Scaffolding;
+
+use Grifart\ClassScaffolder\Capabilities\Capability;
+use Grifart\ClassScaffolder\ClassInNamespace;
+use Grifart\ClassScaffolder\Definition\ClassDefinition;
+use Grifart\ClassScaffolder\Definition\Field;
+use Nette\PhpGenerator as Code;
+
+final class ReconstituteConstructor implements Capability
+{
+	public function applyTo(
+		ClassDefinition $definition,
+		ClassInNamespace $draft,
+		?ClassInNamespace $current,
+	): void
+	{
+		$classType = $draft->getClassType();
+
+		$reconstitute = $classType->addMethod('reconstitute')
+			->setReturnType('static')
+			->setParameters([(new Code\Parameter('values'))->setTypeHint('array')])
+			->setStatic();
+
+		$fields = $definition->getFields();
+		$questionMarks = \implode(', ', array_fill(0, \count($fields), '?'));
+		$literals = \array_map(function(Field $field): Code\PhpLiteral {return new Code\PhpLiteral("\$values['" . $field->getName() . "']");}, $fields);
+
+		$reconstitute->addBody("return new static($questionMarks);", \array_values($literals));
+	}
+}
diff --git a/src/Scaffolding/ReconstituteConstructorDecorator.php b/src/Scaffolding/ReconstituteConstructorDecorator.php
deleted file mode 100644
index b2c2fb6..0000000
--- a/src/Scaffolding/ReconstituteConstructorDecorator.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php declare(strict_types=1);
-
-namespace Grifart\Tables\Scaffolding;
-
-use Grifart\ClassScaffolder\Decorators\ClassDecorator;
-use Grifart\ClassScaffolder\Definition\ClassDefinition;
-use Nette\PhpGenerator as Code;
-use Nette\PhpGenerator\ClassType;
-use Nette\PhpGenerator\Property;
-
-final class ReconstituteConstructorDecorator implements ClassDecorator
-{
-
-	public function decorate(Code\PhpNamespace $namespace, ClassType $classType, ClassDefinition $definition): void
-	{
-		$reconstitute = $classType->addMethod('reconstitute')
-			->setReturnType('static')
-			->setParameters([(new Code\Parameter('values'))->setTypeHint('array')])
-			->setStatic();
-
-		// todo use class definition instead when https://gitlab.grifart.cz/grifart/class-scaffolder/issues/5 is resolved
-		$properties = \array_map(function(Property $property): string {return $property->getName();}, $classType->getProperties());
-		$questionMarks = \implode(', ', array_fill(0, \count($properties), '?'));
-		$literals = \array_map(function(string $property): Code\PhpLiteral {return new Code\PhpLiteral("\$values['" . $property . "']");}, $properties);
-
-		// todo: add array_keys that it contains just keys that are necessary
-
-		$reconstitute->addBody("return new static($questionMarks);", \array_values($literals));
-	}
-}
diff --git a/src/Scaffolding/Scaffolding.php b/src/Scaffolding/Scaffolding.php
index b6a8367..6d971b3 100644
--- a/src/Scaffolding/Scaffolding.php
+++ b/src/Scaffolding/Scaffolding.php
@@ -2,13 +2,14 @@
 
 namespace Grifart\Tables\Scaffolding;
 
-use Grifart\ClassScaffolder\Decorators\GettersDecorator;
-use Grifart\ClassScaffolder\Decorators\InitializingConstructorDecorator;
-use Grifart\ClassScaffolder\Decorators\PropertiesDecorator;
 use Grifart\ClassScaffolder\Definition\ClassDefinition;
-use Grifart\ClassScaffolder\Definition\ClassDefinitionBuilder;
 use Grifart\Tables\Row;
 use Grifart\Tables\TypeMapper;
+use function Grifart\ClassScaffolder\Capabilities\getters;
+use function Grifart\ClassScaffolder\Capabilities\implementedInterface;
+use function Grifart\ClassScaffolder\Capabilities\initializingConstructor;
+use function Grifart\ClassScaffolder\Capabilities\privatizedConstructor;
+use function Grifart\ClassScaffolder\Capabilities\properties;
 use function Grifart\ClassScaffolder\Definition\Types\nullable;
 use function Grifart\ClassScaffolder\Definition\Types\resolve;
 
@@ -37,7 +38,7 @@ final class Scaffolding
 		string $modificationsClassName,
 		string $tableClassName,
 		string $primaryKeyClass
-	): Builders
+	): Definitions
 	{
 		return self::buildersForPgTable(
 			$pgReflector,
@@ -69,7 +70,7 @@ final class Scaffolding
 		string $modificationsClassName,
 		string $tableClassName,
 		string $primaryKeyClass
-	): Builders
+	): Definitions
 	{
 		$columnsNativeTypes = $pgReflector->retrieveColumnInfo($schema, $tableClass);
 		if (\count($columnsNativeTypes) === 0) {
@@ -86,30 +87,29 @@ final class Scaffolding
 			$columnsPhpTypes[$column->getName()] = $column->isNullable() ? nullable($phpType) : $phpType;
 		}
 
-		$addTableFields = function (ClassDefinitionBuilder $builder) use ($columnsPhpTypes): ClassDefinitionBuilder {
-			foreach ($columnsPhpTypes as $name => $type) {
-				$builder->field($name, $type);
-			}
-			return $builder;
+		$addTableFields = function (ClassDefinition $definition) use ($columnsPhpTypes): ClassDefinition {
+			return $definition->withFields($columnsPhpTypes);
 		};
 
 
 		// row class
-		$rowClass = $addTableFields(new ClassDefinitionBuilder($rowClassName))
-			->implement(Row::class)
-			->decorate(new PropertiesDecorator())
-			->decorate(new InitializingConstructorDecorator())
-			->decorate(new GettersDecorator())
-			->decorate(new PrivateConstructorDecorator())
-			->decorate(new ReconstituteConstructorDecorator());
+		$rowClass = $addTableFields(new ClassDefinition($rowClassName))
+			->with(
+				implementedInterface(Row::class),
+				properties(),
+				initializingConstructor(),
+				privatizedConstructor(),
+				getters(),
+				new ReconstituteConstructor(),
+			);
 
 		// row modification class
-		$modificationsClass = $addTableFields(new ClassDefinitionBuilder($modificationsClassName))
-			->decorate(new ModificationsDecorator($tableClassName, $primaryKeyClass));
+		$modificationsClass = $addTableFields(new ClassDefinition($modificationsClassName))
+			->with(new ModificationsImplementation($tableClassName, $primaryKeyClass));
 
 		// table class
-		$tableClass = (new ClassDefinitionBuilder($tableClassName))
-			->decorate(new TableDecorator(
+		$tableClass = (new ClassDefinition($tableClassName))
+			->with(new TableImplementation(
 				$schema,
 				$tableClass,
 				$primaryKeyClass,
@@ -119,7 +119,7 @@ final class Scaffolding
 				$columnsPhpTypes,
 			));
 
-		return Builders::from($rowClass, $modificationsClass, $tableClass);
+		return Definitions::from($rowClass, $modificationsClass, $tableClass);
 	}
 
 }
diff --git a/src/Scaffolding/TableDecorator.php b/src/Scaffolding/TableImplementation.php
similarity index 95%
rename from src/Scaffolding/TableDecorator.php
rename to src/Scaffolding/TableImplementation.php
index 0615f55..f84aeb9 100644
--- a/src/Scaffolding/TableDecorator.php
+++ b/src/Scaffolding/TableImplementation.php
@@ -4,7 +4,8 @@
 namespace Grifart\Tables\Scaffolding;
 
 
-use Grifart\ClassScaffolder\Decorators\ClassDecorator;
+use Grifart\ClassScaffolder\Capabilities\Capability;
+use Grifart\ClassScaffolder\ClassInNamespace;
 use Grifart\ClassScaffolder\Definition\ClassDefinition;
 use Grifart\ClassScaffolder\Definition\Types\Type;
 use Grifart\Tables\CaseConvertion;
@@ -12,9 +13,8 @@ use Grifart\Tables\RowNotFound;
 use Grifart\Tables\Table;
 use Grifart\Tables\TableManager;
 use Nette\PhpGenerator as Code;
-use Webmozart\Assert\Assert;
 
-final class TableDecorator implements ClassDecorator
+final class TableImplementation implements Capability
 {
 
 	private string $schema;
@@ -46,14 +46,20 @@ final class TableDecorator implements ClassDecorator
 		$this->rowClass = $rowClass;
 		$this->modificationClass = $modificationClass;
 
-		Assert::allIsInstanceOf($columnInfo, Column::class);
 		$this->columnInfo = $columnInfo;
 		$this->columnPhpTypes = $columnPhpTypes;
 	}
 
 
-	public function decorate(Code\PhpNamespace $namespace, Code\ClassType $classType, ClassDefinition $definition): void
+	public function applyTo(
+		ClassDefinition $definition,
+		ClassInNamespace $draft,
+		?ClassInNamespace $current,
+	): void
 	{
+		$namespace = $draft->getNamespace();
+		$classType = $draft->getClassType();
+
 		// implements table
 		$namespace->addUse(Table::class);
 		$classType->addImplement(Table::class);
-- 
GitLab