diff --git a/AGENTS.md b/AGENTS.md index 0ce499e0..cc146b90 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,8 +4,8 @@ Purpose This file is the project index for "agents": - the modules that generate or use PHP transfer objects -- the IDE plugins that helps to develop the project -- the IDE plugins that helps to integrate PHP transfer object into application +- the IDE plugins that help to develop the project +- the IDE plugins that help to integrate PHP transfer objects into the application It is intentionally short and only contains agent-specific facts and a concise inventory. Full how-to and contribution guides are in the canonical destinations: @@ -26,9 +26,14 @@ $ composer require picamator/transfer-object Directory Structure ------------------- -### Endpoints +### Console commands -- `bin`: project's endpoints, include transfer object's console commands +- `bin`: project's console commands: + * `transfer-generate`: generate transfer objects from configuration files + * `transfer-generate-bulk`: generate transfer objects by the list of configuration files + * `definition-generate`: generate definition files + +> Installing the project by composer, the console commands are available in the vendor's bin directory. ### Config @@ -51,7 +56,7 @@ Directory Structure * each transfer object generator run will overwrite all the files in the directory * can be used across modules - `src/Generated/_tmp`: temporary directory includes newly generated transfer objects before they are finally moved to the `src/Generated` - * in case of an unexpected error, it is possible that directory is not deleted + * in case of an unexpected error, the directory might not be deleted - `src/Shared`: contains code shared across modules * can be used across modules - `src/Transfer`: transfer object module @@ -74,9 +79,9 @@ Directory Structure Code Style ---------- -- code style should follow [PSR12](https://www.php-fig.org/psr/psr-12/) +- code style should follow [PER Coding Style 3.0](https://www.php-fig.org/per/coding-style/) - each exception should implement `Picamator\TransferObject\Shared\Exception\TransferExceptionInterface` -- exception messages should follow the same text style and structure across modules +- exception messages should follow the same text and structure across all modules ### Classes @@ -125,15 +130,95 @@ Unit and Integration Tests - use `PHPUnit` attributes - use [PHP generator](https://www.php.net/manual/en/class.generator.php) for the data providers +How To Build/Start/Stop Docker Environment +------------------------------------------- + +Docker Environment can be built by running the following command: +```console +docker/sdk build +``` + +Docker Environment can be started by running the following command: +```console +docker/sdk start +``` + +Docker Environment can be stopped by running the following command: +```console +docker/sdk stop +``` + +How to Generate Internal Transfer Objects +----------------------------------------- + +The all project transfer objects (generator's, examples, tests) can be generated with the following command: +```console +docker/sdk to-generate-bulk +``` + +To generate only generator's transfer objects, please run the following command: +```console +docker/sdk to-generate +``` + +How to Generate Transfer Objects By Configuration File +------------------------------------------------------ + +Transfer Objects can be generated by configuration file path, relative from the project's root, by running the following command: +```console +docker/sdk to-generate [path-to-configuration-file] +``` + How To Run PHPUnit Tests ------------------------ +### All Tests + All tests can be run with the following command: ```console docker/sdk phpunit ``` -A Specific test group can be run with the following command: +### Specific Group + +A test group can be run with the following command: ```console docker/sdk phpunit-group ``` + +### Specific Test Case + +A test case can be run with the following command: +```console +docker/sdk phpunit '' +``` + +For instance, the test case `Picamator\Tests\Unit\TransferObject\Command\Helper\InputNormalizerTest` +can be run with the following command: +```console +docker/sdk phpunit 'Picamator\\Tests\\Unit\\TransferObject\\Command\\Helper\\InputNormalizerTest' +``` + +How To Run PHPStan +------------------ + +PHPStan can be run with the following command: +```console +docker/sdk phpstan +``` + +How To Run PHP CodeSniffer +-------------------------- + +PHP CodeSniffer can be run with the following command: +```console +docker/sdk phpcs +``` + +How To Run Composer +------------------- + +PHPStan can be run with the following command: +```console +docker/sdk composer +``` diff --git a/composer.lock b/composer.lock index 3aa98db8..e0476549 100644 --- a/composer.lock +++ b/composer.lock @@ -288,16 +288,16 @@ }, { "name": "symfony/finder", - "version": "v8.0.4", + "version": "v8.0.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "42e48eb02e07d5f3771d194d67da117eb824c8c1" + "reference": "8bd576e97c67d45941365bf824e18dc8538e6eb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/42e48eb02e07d5f3771d194d67da117eb824c8c1", - "reference": "42e48eb02e07d5f3771d194d67da117eb824c8c1", + "url": "https://api.github.com/repos/symfony/finder/zipball/8bd576e97c67d45941365bf824e18dc8538e6eb0", + "reference": "8bd576e97c67d45941365bf824e18dc8538e6eb0", "shasum": "" }, "require": { @@ -332,7 +332,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.0.4" + "source": "https://github.com/symfony/finder/tree/v8.0.5" }, "funding": [ { @@ -352,7 +352,7 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:37:40+00:00" + "time": "2026-01-26T15:08:38+00:00" }, { "name": "symfony/polyfill-ctype", @@ -945,16 +945,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.27.4", + "version": "5.27.5", "source": { "type": "git", "url": "https://github.com/captainhook-git/captainhook.git", - "reference": "f4485d2a5db16a37053ffe7916f0808f619b430d" + "reference": "ed04a64bbeb0da94865a15e74e8d0c97dcc0b987" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhook-git/captainhook/zipball/f4485d2a5db16a37053ffe7916f0808f619b430d", - "reference": "f4485d2a5db16a37053ffe7916f0808f619b430d", + "url": "https://api.github.com/repos/captainhook-git/captainhook/zipball/ed04a64bbeb0da94865a15e74e8d0c97dcc0b987", + "reference": "ed04a64bbeb0da94865a15e74e8d0c97dcc0b987", "shasum": "" }, "require": { @@ -965,7 +965,7 @@ "php": ">=8.0", "sebastianfeldmann/camino": "^0.9.2", "sebastianfeldmann/cli": "^3.3", - "sebastianfeldmann/git": "^3.15.3", + "sebastianfeldmann/git": "^3.16.0", "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0" @@ -1017,7 +1017,7 @@ ], "support": { "issues": "https://github.com/captainhook-git/captainhook/issues", - "source": "https://github.com/captainhook-git/captainhook/tree/5.27.4" + "source": "https://github.com/captainhook-git/captainhook/tree/5.27.5" }, "funding": [ { @@ -1025,7 +1025,7 @@ "type": "github" } ], - "time": "2025-12-12T10:35:01+00:00" + "time": "2026-01-26T21:55:28+00:00" }, { "name": "captainhook/secrets", @@ -1464,11 +1464,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.37", + "version": "2.1.38", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/28cd424c5ea984128c95cfa7ea658808e8954e49", - "reference": "28cd424c5ea984128c95cfa7ea658808e8954e49", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dfaf1f530e1663aa167bc3e52197adb221582629", + "reference": "dfaf1f530e1663aa167bc3e52197adb221582629", "shasum": "" }, "require": { @@ -1513,20 +1513,20 @@ "type": "github" } ], - "time": "2026-01-24T08:21:55+00:00" + "time": "2026-01-30T17:12:46+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "2.0.7", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "d6211c46213d4181054b3d77b10a5c5cb0d59538" + "reference": "1ed9e626a37f7067b594422411539aa807190573" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/d6211c46213d4181054b3d77b10a5c5cb0d59538", - "reference": "d6211c46213d4181054b3d77b10a5c5cb0d59538", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/1ed9e626a37f7067b594422411539aa807190573", + "reference": "1ed9e626a37f7067b594422411539aa807190573", "shasum": "" }, "require": { @@ -1559,9 +1559,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.7" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.8" }, - "time": "2025-09-26T11:19:08+00:00" + "time": "2026-01-27T08:10:25+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1899,16 +1899,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.7", + "version": "12.5.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "79dee3d2685b80518e94b9ea741b3f822b213a5e" + "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/79dee3d2685b80518e94b9ea741b3f822b213a5e", - "reference": "79dee3d2685b80518e94b9ea741b3f822b213a5e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889", + "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889", "shasum": "" }, "require": { @@ -1976,7 +1976,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.7" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8" }, "funding": [ { @@ -2000,7 +2000,7 @@ "type": "tidelift" } ], - "time": "2026-01-24T16:12:53+00:00" + "time": "2026-01-27T06:12:29+00:00" }, { "name": "sebastian/cli-parser", @@ -3015,16 +3015,16 @@ }, { "name": "sebastianfeldmann/git", - "version": "3.15.3", + "version": "3.16.0", "source": { "type": "git", "url": "https://github.com/sebastianfeldmann/git.git", - "reference": "601fd0fbb7d1a784e009a4f8f40975e777ad334a" + "reference": "40a5cc043f0957228767f639e370ec92590e940f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/601fd0fbb7d1a784e009a4f8f40975e777ad334a", - "reference": "601fd0fbb7d1a784e009a4f8f40975e777ad334a", + "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/40a5cc043f0957228767f639e370ec92590e940f", + "reference": "40a5cc043f0957228767f639e370ec92590e940f", "shasum": "" }, "require": { @@ -3065,7 +3065,7 @@ ], "support": { "issues": "https://github.com/sebastianfeldmann/git/issues", - "source": "https://github.com/sebastianfeldmann/git/tree/3.15.3" + "source": "https://github.com/sebastianfeldmann/git/tree/3.16.0" }, "funding": [ { @@ -3073,7 +3073,7 @@ "type": "github" } ], - "time": "2025-11-20T21:33:45+00:00" + "time": "2026-01-26T20:59:18+00:00" }, { "name": "slevomat/coding-standard", @@ -3273,16 +3273,16 @@ }, { "name": "symfony/process", - "version": "v8.0.4", + "version": "v8.0.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "10df72602d88c0a3fa685b822976a052611dd607" + "reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/10df72602d88c0a3fa685b822976a052611dd607", - "reference": "10df72602d88c0a3fa685b822976a052611dd607", + "url": "https://api.github.com/repos/symfony/process/zipball/b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674", + "reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674", "shasum": "" }, "require": { @@ -3314,7 +3314,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.0.4" + "source": "https://github.com/symfony/process/tree/v8.0.5" }, "funding": [ { @@ -3334,7 +3334,7 @@ "type": "tidelift" } ], - "time": "2026-01-23T11:07:10+00:00" + "time": "2026-01-26T15:08:38+00:00" }, { "name": "symfony/translation-contracts", @@ -3420,16 +3420,16 @@ }, { "name": "symfony/validator", - "version": "v8.0.4", + "version": "v8.0.5", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "8063167d06bdbea8ded3b3c9714f838cc5c618e2" + "reference": "ba171e89ee2d01c24c1d8201d59ec595ef4adba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/8063167d06bdbea8ded3b3c9714f838cc5c618e2", - "reference": "8063167d06bdbea8ded3b3c9714f838cc5c618e2", + "url": "https://api.github.com/repos/symfony/validator/zipball/ba171e89ee2d01c24c1d8201d59ec595ef4adba1", + "reference": "ba171e89ee2d01c24c1d8201d59ec595ef4adba1", "shasum": "" }, "require": { @@ -3490,7 +3490,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v8.0.4" + "source": "https://github.com/symfony/validator/tree/v8.0.5" }, "funding": [ { @@ -3510,7 +3510,7 @@ "type": "tidelift" } ], - "time": "2026-01-08T22:36:47+00:00" + "time": "2026-01-27T09:06:10+00:00" }, { "name": "symfony/var-dumper", diff --git a/config/definition/transfer-generator-template.transfer.yml b/config/definition/transfer-generator-template.transfer.yml index fce5837a..1e09cf9a 100644 --- a/config/definition/transfer-generator-template.transfer.yml +++ b/config/definition/transfer-generator-template.transfer.yml @@ -25,7 +25,7 @@ Template: type: ArrayObject docBlocks: type: ArrayObject - nullables: - type: ArrayObject + requires: + type: ArrayObject protects: - type: ArrayObject + type: ArrayObject diff --git a/config/definition/transfer-generator.transfer.yml b/config/definition/transfer-generator.transfer.yml index 1235af5e..21aa3f09 100644 --- a/config/definition/transfer-generator.transfer.yml +++ b/config/definition/transfer-generator.transfer.yml @@ -55,7 +55,7 @@ DefinitionProperty: type: DefinitionEmbeddedType numberType: type: DefinitionEmbeddedType - isNullable: + isRequired: type: bool required: isProtected: diff --git a/docker/sdk b/docker/sdk index f4119c26..acdd671c 100755 --- a/docker/sdk +++ b/docker/sdk @@ -29,14 +29,14 @@ function show_usage() { echo -e " $(wrap_in_yellow "cli") Open container shell" echo -e " $(wrap_in_yellow "composer ") Run composer command" echo -e " $(wrap_in_yellow "phpstan") Run PHPStan" - echo -e " $(wrap_in_yellow "phpunit") Run PHPUnit" + echo -e " $(wrap_in_yellow "phpunit") Run all PHPUnit tests or concrete test case when full qualified name provided as an argument" echo -e " $(wrap_in_yellow "phpunit-group ") Run PHPUnit tests assigned to the group" echo -e " $(wrap_in_yellow "phpcs") Run PHP CodeSniffer" echo -e " $(wrap_in_yellow "phpcbf") Run PHP Code Beautifier and Fixer" echo -e " $(wrap_in_yellow "hook-install") Install CaptainHook" echo -e " $(wrap_in_yellow "hook ") Run CaptainHook command" - echo -e " $(wrap_in_yellow "to-generate") Generate internal transfer objects" - echo -e " $(wrap_in_yellow "to-generate-bulk") Generate bulk internal transfer objects" + echo -e " $(wrap_in_yellow "to-generate") Generate internal transfer objects or externals when configuration path provided as an argument" + echo -e " $(wrap_in_yellow "to-generate-bulk") Generate bulk internal transfer objects or externals when configuration path provided as an argument" echo -e " $(wrap_in_yellow "df-generate") Generate definition" echo echo "Examples:" @@ -101,7 +101,11 @@ case $1 in $DOCKER_EXEC composer phpstan ;; phpunit) - $DOCKER_EXEC composer phpunit + if [ -n "$2" ]; then + $DOCKER_EXEC composer phpunit -- --filter $2 + else + $DOCKER_EXEC composer phpunit + fi ;; phpunit-group) $DOCKER_EXEC composer phpunit-group $2 diff --git a/schema/definition.schema.json b/schema/definition.schema.json index 8bebb3ec..95f3ba3e 100644 --- a/schema/definition.schema.json +++ b/schema/definition.schema.json @@ -96,7 +96,88 @@ "attributes": { "description": "List of attribute strings to be attached to the property (fully qualified attribute invocation).", "type": "array", - "items": { "type": "string" } + "items": { + "type": "string", + "anyOf": [ + { "const": "sf-assert:All" }, + { "const": "sf-assert:AtLeastOneOf" }, + { "const": "sf-assert:Bic" }, + { "const": "sf-assert:Blank" }, + { "const": "sf-assert:Callback" }, + { "const": "sf-assert:CardScheme" }, + { "const": "sf-assert:Cascade" }, + { "const": "sf-assert:Charset" }, + { "const": "sf-assert:Choice" }, + { "const": "sf-assert:Cidr" }, + { "const": "sf-assert:Collection" }, + { "const": "sf-assert:Count" }, + { "const": "sf-assert:Country" }, + { "const": "sf-assert:CssColor" }, + { "const": "sf-assert:Currency" }, + { "const": "sf-assert:Date" }, + { "const": "sf-assert:DateTime" }, + { "const": "sf-assert:DisableAutoMapping" }, + { "const": "sf-assert:DivisibleBy" }, + { "const": "sf-assert:Email" }, + { "const": "sf-assert:EnableAutoMapping" }, + { "const": "sf-assert:EqualTo" }, + { "const": "sf-assert:Expression" }, + { "const": "sf-assert:ExpressionSyntax" }, + { "const": "sf-assert:File" }, + { "const": "sf-assert:GreaterThan" }, + { "const": "sf-assert:GreaterThanOrEqual" }, + { "const": "sf-assert:GroupSequence" }, + { "const": "sf-assert:GroupSequenceProvider" }, + { "const": "sf-assert:Hostname" }, + { "const": "sf-assert:Iban" }, + { "const": "sf-assert:IdenticalTo" }, + { "const": "sf-assert:Image" }, + { "const": "sf-assert:Ip" }, + { "const": "sf-assert:IsFalse" }, + { "const": "sf-assert:IsNull" }, + { "const": "sf-assert:IsTrue" }, + { "const": "sf-assert:Isbn" }, + { "const": "sf-assert:Isin" }, + { "const": "sf-assert:Issn" }, + { "const": "sf-assert:Json" }, + { "const": "sf-assert:Language" }, + { "const": "sf-assert:Length" }, + { "const": "sf-assert:LessThan" }, + { "const": "sf-assert:LessThanOrEqual" }, + { "const": "sf-assert:Locale" }, + { "const": "sf-assert:Luhn" }, + { "const": "sf-assert:MacAddress" }, + { "const": "sf-assert:Negative" }, + { "const": "sf-assert:NegativeOrZero" }, + { "const": "sf-assert:NoSuspiciousCharacters" }, + { "const": "sf-assert:NotBlank" }, + { "const": "sf-assert:NotCompromisedPassword" }, + { "const": "sf-assert:NotEqualTo" }, + { "const": "sf-assert:NotIdenticalTo" }, + { "const": "sf-assert:NotNull" }, + { "const": "sf-assert:PasswordStrength" }, + { "const": "sf-assert:Positive" }, + { "const": "sf-assert:PositiveOrZero" }, + { "const": "sf-assert:Range" }, + { "const": "sf-assert:Regex" }, + { "const": "sf-assert:Sequentially" }, + { "const": "sf-assert:Time" }, + { "const": "sf-assert:Timezone" }, + { "const": "sf-assert:Traverse" }, + { "const": "sf-assert:Type" }, + { "const": "sf-assert:Ulid" }, + { "const": "sf-assert:Unique" }, + { "const": "sf-assert:Url" }, + { "const": "sf-assert:Uuid" }, + { "const": "sf-assert:Valid" }, + { "const": "sf-assert:Video" }, + { "const": "sf-assert:Week" }, + { "const": "sf-assert:When" }, + { "const": "sf-assert:WordCount" }, + { "const": "sf-assert:Yaml" }, + { "pattern": ".*" } + ] + } } }, "oneOf": [ diff --git a/src/Command/DefinitionGeneratorCommand.php b/src/Command/DefinitionGeneratorCommand.php index f109c006..e82de384 100644 --- a/src/Command/DefinitionGeneratorCommand.php +++ b/src/Command/DefinitionGeneratorCommand.php @@ -19,7 +19,7 @@ name: 'picamator:definition:generate|p:d:g', description: 'Generates Transfer Object definition files from a JSON blueprint.', // phpcs:disable Generic.Files.LineLength - help: <<%command.name% command generates Transfer Object definition files based on a JSON blueprint. Interactive prompt options: diff --git a/src/Command/TransferGeneratorBulkCommand.php b/src/Command/TransferGeneratorBulkCommand.php index b0158c5c..c958d922 100644 --- a/src/Command/TransferGeneratorBulkCommand.php +++ b/src/Command/TransferGeneratorBulkCommand.php @@ -19,11 +19,11 @@ name: 'picamator:transfer:generate:bulk|p:t:g:b', description: 'Generates Transfer Objects based on multiple configurations and their definition files.', // phpcs:disable Generic.Files.LineLength - help: <<%command.name% command generates Transfer Objects from definition files specified by multiple configuration files listed in a TXT file.. + help: <<<'HELP' +The %command.name% command generates Transfer Objects from definition files specified by multiple configuration files listed in a TXT file. The configuration list specifies: - - Each line contains the path to a configuration file in YML format. + - Each line contains the path to a configuration file in YML format. Documentation: For more details, please visit "project's Wiki". diff --git a/src/Command/TransferGeneratorCommand.php b/src/Command/TransferGeneratorCommand.php index c4870d5d..c6fad108 100644 --- a/src/Command/TransferGeneratorCommand.php +++ b/src/Command/TransferGeneratorCommand.php @@ -18,8 +18,8 @@ name: 'picamator:transfer:generate|p:t:g', description: 'Generates Transfer Objects from definition files specified by configuration.', // phpcs:disable Generic.Files.LineLength - help: <<%command.name% command generates Transfer Objects based on configuration file in YML format. + help: <<<'HELP' +The %command.name% command generates Transfer Objects based on the configuration file in YML format. The configuration specifies: - The directory containing the definition files. diff --git a/src/DefinitionGenerator/Content/Expander/BuildInTypeBuilderExpander.php b/src/DefinitionGenerator/Content/Expander/BuildInTypeBuilderExpander.php index 0b7a0a83..742c40a8 100644 --- a/src/DefinitionGenerator/Content/Expander/BuildInTypeBuilderExpander.php +++ b/src/DefinitionGenerator/Content/Expander/BuildInTypeBuilderExpander.php @@ -124,7 +124,7 @@ private function createDateTimePropertyTransfer(string $propertyName): Definitio $propertyTransfer = new DefinitionPropertyTransfer(); $propertyTransfer->propertyName = $propertyName; $propertyTransfer->dateTimeType = $typeTransfer; - $propertyTransfer->isNullable = true; + $propertyTransfer->isRequired = false; $propertyTransfer->isProtected = false; return $propertyTransfer; diff --git a/src/DefinitionGenerator/Content/Expander/CollectionTypeBuilderExpander.php b/src/DefinitionGenerator/Content/Expander/CollectionTypeBuilderExpander.php index b3f4adf3..4bd28f2d 100644 --- a/src/DefinitionGenerator/Content/Expander/CollectionTypeBuilderExpander.php +++ b/src/DefinitionGenerator/Content/Expander/CollectionTypeBuilderExpander.php @@ -93,7 +93,7 @@ private function createPropertyTransfer(string $propertyName): DefinitionPropert $propertyTransfer = new DefinitionPropertyTransfer(); $propertyTransfer->propertyName = $propertyName; $propertyTransfer->collectionType = $typeTransfer; - $propertyTransfer->isNullable = true; + $propertyTransfer->isRequired = false; $propertyTransfer->isProtected = false; return $propertyTransfer; diff --git a/src/DefinitionGenerator/Content/Expander/TransferTypeBuilderExpander.php b/src/DefinitionGenerator/Content/Expander/TransferTypeBuilderExpander.php index a38df4f6..8983a51c 100644 --- a/src/DefinitionGenerator/Content/Expander/TransferTypeBuilderExpander.php +++ b/src/DefinitionGenerator/Content/Expander/TransferTypeBuilderExpander.php @@ -53,7 +53,7 @@ private function createPropertyTransfer(string $propertyName): DefinitionPropert $propertyTransfer = new DefinitionPropertyTransfer(); $propertyTransfer->propertyName = $propertyName; $propertyTransfer->transferType = $typeTransfer; - $propertyTransfer->isNullable = true; + $propertyTransfer->isRequired = false; $propertyTransfer->isProtected = false; return $propertyTransfer; diff --git a/src/Generated/DefinitionPropertyTransfer.php b/src/Generated/DefinitionPropertyTransfer.php index 045d610b..720b18c8 100644 --- a/src/Generated/DefinitionPropertyTransfer.php +++ b/src/Generated/DefinitionPropertyTransfer.php @@ -29,8 +29,8 @@ final class DefinitionPropertyTransfer extends AbstractTransfer self::COLLECTION_TYPE_PROP => self::COLLECTION_TYPE_INDEX, self::DATE_TIME_TYPE_PROP => self::DATE_TIME_TYPE_INDEX, self::ENUM_TYPE_PROP => self::ENUM_TYPE_INDEX, - self::IS_NULLABLE_PROP => self::IS_NULLABLE_INDEX, self::IS_PROTECTED_PROP => self::IS_PROTECTED_INDEX, + self::IS_REQUIRED_PROP => self::IS_REQUIRED_INDEX, self::NUMBER_TYPE_PROP => self::NUMBER_TYPE_INDEX, self::PROPERTY_NAME_PROP => self::PROPERTY_NAME_INDEX, self::TRANSFER_TYPE_PROP => self::TRANSFER_TYPE_INDEX, @@ -112,20 +112,9 @@ final class DefinitionPropertyTransfer extends AbstractTransfer } } - // isNullable - public const string IS_NULLABLE_PROP = 'isNullable'; - private const int IS_NULLABLE_INDEX = 5; - - public bool $isNullable { - get => $this->getData(self::IS_NULLABLE_INDEX); - set { - $this->setData(self::IS_NULLABLE_INDEX, $value); - } - } - // isProtected public const string IS_PROTECTED_PROP = 'isProtected'; - private const int IS_PROTECTED_INDEX = 6; + private const int IS_PROTECTED_INDEX = 5; public bool $isProtected { get => $this->getData(self::IS_PROTECTED_INDEX); @@ -134,6 +123,17 @@ final class DefinitionPropertyTransfer extends AbstractTransfer } } + // isRequired + public const string IS_REQUIRED_PROP = 'isRequired'; + private const int IS_REQUIRED_INDEX = 6; + + public bool $isRequired { + get => $this->getData(self::IS_REQUIRED_INDEX); + set { + $this->setData(self::IS_REQUIRED_INDEX, $value); + } + } + // numberType #[TransferTransformerAttribute(DefinitionEmbeddedTypeTransfer::class)] public const string NUMBER_TYPE_PROP = 'numberType'; diff --git a/src/Generated/TemplateTransfer.php b/src/Generated/TemplateTransfer.php index aef89008..b0cfdb30 100644 --- a/src/Generated/TemplateTransfer.php +++ b/src/Generated/TemplateTransfer.php @@ -32,10 +32,10 @@ final class TemplateTransfer extends AbstractTransfer self::META_CONSTANTS_PROP => self::META_CONSTANTS_INDEX, self::META_INITIATORS_PROP => self::META_INITIATORS_INDEX, self::META_TRANSFORMERS_PROP => self::META_TRANSFORMERS_INDEX, - self::NULLABLES_PROP => self::NULLABLES_INDEX, self::PROPERTIES_PROP => self::PROPERTIES_INDEX, self::PROPERTY_ATTRIBUTES_PROP => self::PROPERTY_ATTRIBUTES_INDEX, self::PROTECTS_PROP => self::PROTECTS_INDEX, + self::REQUIRES_PROP => self::REQUIRES_INDEX, ]; protected const array META_INITIATORS = [ @@ -45,10 +45,10 @@ final class TemplateTransfer extends AbstractTransfer self::META_CONSTANTS_PROP => 'META_CONSTANTS_PROP', self::META_INITIATORS_PROP => 'META_INITIATORS_PROP', self::META_TRANSFORMERS_PROP => 'META_TRANSFORMERS_PROP', - self::NULLABLES_PROP => 'NULLABLES_PROP', self::PROPERTIES_PROP => 'PROPERTIES_PROP', self::PROPERTY_ATTRIBUTES_PROP => 'PROPERTY_ATTRIBUTES_PROP', self::PROTECTS_PROP => 'PROTECTS_PROP', + self::REQUIRES_PROP => 'REQUIRES_PROP', ]; protected const array META_TRANSFORMERS = [ @@ -58,10 +58,10 @@ final class TemplateTransfer extends AbstractTransfer self::META_CONSTANTS_PROP => 'META_CONSTANTS_PROP', self::META_INITIATORS_PROP => 'META_INITIATORS_PROP', self::META_TRANSFORMERS_PROP => 'META_TRANSFORMERS_PROP', - self::NULLABLES_PROP => 'NULLABLES_PROP', self::PROPERTIES_PROP => 'PROPERTIES_PROP', self::PROPERTY_ATTRIBUTES_PROP => 'PROPERTY_ATTRIBUTES_PROP', self::PROTECTS_PROP => 'PROTECTS_PROP', + self::REQUIRES_PROP => 'REQUIRES_PROP', ]; // className @@ -181,25 +181,11 @@ final class TemplateTransfer extends AbstractTransfer } } - // nullables - #[ArrayObjectInitiatorAttribute] - #[ArrayObjectTransformerAttribute] - public const string NULLABLES_PROP = 'nullables'; - private const int NULLABLES_INDEX = 9; - - /** @var \ArrayObject */ - public ArrayObject $nullables { - get => $this->getData(self::NULLABLES_INDEX); - set { - $this->setData(self::NULLABLES_INDEX, $value); - } - } - // properties #[ArrayObjectInitiatorAttribute] #[ArrayObjectTransformerAttribute] public const string PROPERTIES_PROP = 'properties'; - private const int PROPERTIES_INDEX = 10; + private const int PROPERTIES_INDEX = 9; /** @var \ArrayObject */ public ArrayObject $properties { @@ -213,7 +199,7 @@ final class TemplateTransfer extends AbstractTransfer #[ArrayObjectInitiatorAttribute] #[ArrayObjectTransformerAttribute] public const string PROPERTY_ATTRIBUTES_PROP = 'propertyAttributes'; - private const int PROPERTY_ATTRIBUTES_INDEX = 11; + private const int PROPERTY_ATTRIBUTES_INDEX = 10; /** @var \ArrayObject> */ public ArrayObject $propertyAttributes { @@ -227,13 +213,27 @@ final class TemplateTransfer extends AbstractTransfer #[ArrayObjectInitiatorAttribute] #[ArrayObjectTransformerAttribute] public const string PROTECTS_PROP = 'protects'; - private const int PROTECTS_INDEX = 12; + private const int PROTECTS_INDEX = 11; - /** @var \ArrayObject */ + /** @var \ArrayObject */ public ArrayObject $protects { get => $this->getData(self::PROTECTS_INDEX); set { $this->setData(self::PROTECTS_INDEX, $value); } } + + // requires + #[ArrayObjectInitiatorAttribute] + #[ArrayObjectTransformerAttribute] + public const string REQUIRES_PROP = 'requires'; + private const int REQUIRES_INDEX = 12; + + /** @var \ArrayObject */ + public ArrayObject $requires { + get => $this->getData(self::REQUIRES_INDEX); + set { + $this->setData(self::REQUIRES_INDEX, $value); + } + } } diff --git a/src/TransferGenerator/Config/Parser/ConfigParser.php b/src/TransferGenerator/Config/Parser/ConfigParser.php index 7f491dd9..83c4c6fa 100644 --- a/src/TransferGenerator/Config/Parser/ConfigParser.php +++ b/src/TransferGenerator/Config/Parser/ConfigParser.php @@ -22,8 +22,8 @@ public function __construct( public function parseConfig(string $configPath): ConfigContentTransfer { $configData = $this->parser->parseFile($configPath); - $filteredConfigData = $this->normalizeConfig($configData); + $normalizedConfigData = $this->normalizeConfig($configData); - return $this->builder->createContentTransfer($filteredConfigData); + return $this->builder->createContentTransfer($normalizedConfigData); } } diff --git a/src/TransferGenerator/Config/Parser/Filter/ConfigNormalizerTrait.php b/src/TransferGenerator/Config/Parser/Filter/ConfigNormalizerTrait.php index ca7d63c7..0b06ea81 100644 --- a/src/TransferGenerator/Config/Parser/Filter/ConfigNormalizerTrait.php +++ b/src/TransferGenerator/Config/Parser/Filter/ConfigNormalizerTrait.php @@ -25,9 +25,12 @@ final protected function normalizeConfig(mixed $configData): array return $defaultConfig; } - $filteredData = array_intersect_key($sectionData, $defaultConfig); - $filteredData = array_filter($filteredData, 'is_string'); + $filteredData = []; + foreach ($defaultConfig as $key => $defaultValue) { + $sectionValue = $sectionData[$key] ?? null; + $filteredData[$key] = is_string($sectionValue) ? $sectionValue : $defaultValue; + } - return $filteredData + $defaultConfig; + return $filteredData; } } diff --git a/src/TransferGenerator/Definition/Parser/Expander/CollectionTypePropertyExpander.php b/src/TransferGenerator/Definition/Parser/Expander/CollectionTypePropertyExpander.php index 30b3c355..0ff456e9 100644 --- a/src/TransferGenerator/Definition/Parser/Expander/CollectionTypePropertyExpander.php +++ b/src/TransferGenerator/Definition/Parser/Expander/CollectionTypePropertyExpander.php @@ -27,5 +27,6 @@ protected function matchType(array $propertyType): ?string protected function handleExpander(string $matchedType, DefinitionPropertyTransfer $propertyTransfer): void { $propertyTransfer->collectionType = $this->typeBuilder->createPrefixTypeTransfer($matchedType); + $propertyTransfer->isRequired = true; } } diff --git a/src/TransferGenerator/Definition/Parser/Expander/NullablePropertyExpander.php b/src/TransferGenerator/Definition/Parser/Expander/NullablePropertyExpander.php deleted file mode 100644 index e65cedeb..00000000 --- a/src/TransferGenerator/Definition/Parser/Expander/NullablePropertyExpander.php +++ /dev/null @@ -1,22 +0,0 @@ -isNullable = $matchedType === '0'; - } -} diff --git a/src/TransferGenerator/Definition/Parser/Expander/RequiredPropertyExpander.php b/src/TransferGenerator/Definition/Parser/Expander/RequiredPropertyExpander.php new file mode 100644 index 00000000..8b88db05 --- /dev/null +++ b/src/TransferGenerator/Definition/Parser/Expander/RequiredPropertyExpander.php @@ -0,0 +1,43 @@ +isNullableAllowed($propertyTransfer)) { + $propertyTransfer->isRequired = true; + + return; + } + + $propertyTransfer->isRequired = $matchedType === '1'; + } + + private function isNullableAllowed(DefinitionPropertyTransfer $propertyTransfer): bool + { + $buildInType = $propertyTransfer->buildInType?->name; + if ($buildInType !== null && ($buildInType->isArray() || $buildInType->isArrayObject())) { + return false; + } + + // phpcs:disable SlevomatCodingStandard.ControlStructures.UselessIfConditionWithReturn + if ($propertyTransfer->collectionType !== null) { + return false; + } + + return true; + } +} diff --git a/src/TransferGenerator/Definition/Parser/Filter/PropertyNormalizerTrait.php b/src/TransferGenerator/Definition/Parser/Filter/PropertyNormalizerTrait.php index 76421834..16a0f8c4 100644 --- a/src/TransferGenerator/Definition/Parser/Filter/PropertyNormalizerTrait.php +++ b/src/TransferGenerator/Definition/Parser/Filter/PropertyNormalizerTrait.php @@ -17,13 +17,13 @@ final protected function normalizeProperties(mixed $properties): array return []; } - /** @var array> $filteredProperties */ - $filteredProperties = array_map( + /** @var array> $normalizedProperties */ + $normalizedProperties = array_map( fn(mixed $property): array => is_array($property) ? $this->normalizeProperty($property) : [], $properties, ); - return $filteredProperties; + return $normalizedProperties; } /** @@ -33,8 +33,8 @@ final protected function normalizeProperties(mixed $properties): array */ private function normalizeProperty(array $property): array { - /** @var array|null> $filteredProperty */ - $filteredProperty = []; + /** @var array|null> $normalizedProperty */ + $normalizedProperty = []; foreach ($property as $key => $value) { if (is_int($key)) { continue; @@ -45,9 +45,9 @@ private function normalizeProperty(array $property): array continue; } - $filteredProperty[$key] = $keyEnum->normalizeValue($value); + $normalizedProperty[$key] = $keyEnum->normalizeValue($value); } - return $filteredProperty; + return $normalizedProperty; } } diff --git a/src/TransferGenerator/Definition/Parser/ParserFactory.php b/src/TransferGenerator/Definition/Parser/ParserFactory.php index 3614c29e..e5beabd0 100644 --- a/src/TransferGenerator/Definition/Parser/ParserFactory.php +++ b/src/TransferGenerator/Definition/Parser/ParserFactory.php @@ -16,10 +16,10 @@ use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\CollectionTypePropertyExpander; use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\DateTimeTypePropertyExpander; use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\EnumTypePropertyExpander; -use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\NullablePropertyExpander; use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\NumberTypePropertyExpander; use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\PropertyExpanderInterface; use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\ProtectedPropertyExpander; +use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\RequiredPropertyExpander; use Picamator\TransferObject\TransferGenerator\Definition\Parser\Expander\TypePropertyExpander; class ParserFactory @@ -46,20 +46,25 @@ protected function createContentBuilder(): ContentBuilderInterface protected function createPropertyExpander(): PropertyExpanderInterface { - $propertyExpander = $this->createNullablePropertyExpander(); + $propertyExpander = $this->createProtectedPropertyExpander(); $propertyExpander ->setNextExpander($this->createCollectionTypePropertyExpander()) ->setNextExpander($this->createTypePropertyExpander()) ->setNextExpander($this->createEnumTypePropertyExpander()) - ->setNextExpander($this->createProtectedPropertyExpander()) ->setNextExpander($this->createDateTimeTypePropertyExpander()) ->setNextExpander($this->createNumberTypePropertyExpander()) - ->setNextExpander($this->createAttributesPropertyExpander()); + ->setNextExpander($this->createAttributesPropertyExpander()) + ->setNextExpander($this->createRequiredPropertyExpander()); return $propertyExpander; } + protected function createRequiredPropertyExpander(): PropertyExpanderInterface + { + return new RequiredPropertyExpander(); + } + protected function createAttributesPropertyExpander(): PropertyExpanderInterface { return new AttributesPropertyExpander($this->createAttributesNamespaceBuilder()); @@ -90,11 +95,6 @@ protected function createDateTimeTypePropertyExpander(): PropertyExpanderInterfa return new DateTimeTypePropertyExpander($this->createEmbeddedTypeBuilder()); } - protected function createProtectedPropertyExpander(): PropertyExpanderInterface - { - return new ProtectedPropertyExpander(); - } - protected function createEnumTypePropertyExpander(): PropertyExpanderInterface { return new EnumTypePropertyExpander($this->createEmbeddedTypeBuilder()); @@ -110,8 +110,8 @@ protected function createCollectionTypePropertyExpander(): PropertyExpanderInter return new CollectionTypePropertyExpander($this->createEmbeddedTypeBuilder()); } - protected function createNullablePropertyExpander(): PropertyExpanderInterface + protected function createProtectedPropertyExpander(): PropertyExpanderInterface { - return new NullablePropertyExpander(); + return new ProtectedPropertyExpander(); } } diff --git a/src/TransferGenerator/Generator/Render/Expander/BuildInTypeTemplateExpander.php b/src/TransferGenerator/Generator/Render/Expander/BuildInTypeTemplateExpander.php index d963464f..a2e20a18 100644 --- a/src/TransferGenerator/Generator/Render/Expander/BuildInTypeTemplateExpander.php +++ b/src/TransferGenerator/Generator/Render/Expander/BuildInTypeTemplateExpander.php @@ -29,7 +29,6 @@ protected function handleExpander( $propertyName = $propertyTransfer->propertyName; $templateTransfer->properties[$propertyName] = $buildInTypeTransfer->name->value; - $templateTransfer->nullables[$propertyName] = $propertyTransfer->isNullable; if ($buildInTypeTransfer->name->isArrayObject()) { $this->expandArrayObjectType($propertyTransfer, $templateTransfer); diff --git a/src/TransferGenerator/Generator/Render/Expander/ProtectedTemplateExpander.php b/src/TransferGenerator/Generator/Render/Expander/ProtectedTemplateExpander.php index 81e9f7a2..84f0b15d 100644 --- a/src/TransferGenerator/Generator/Render/Expander/ProtectedTemplateExpander.php +++ b/src/TransferGenerator/Generator/Render/Expander/ProtectedTemplateExpander.php @@ -9,18 +9,15 @@ final class ProtectedTemplateExpander extends AbstractTemplateExpander { - /** - * phpcs:disable SlevomatCodingStandard.Functions.UnusedParameter - */ - protected function isApplicable(DefinitionPropertyTransfer $propertyTransfer): true + protected function isApplicable(DefinitionPropertyTransfer $propertyTransfer): bool { - return true; + return $propertyTransfer->isProtected; } protected function handleExpander( DefinitionPropertyTransfer $propertyTransfer, TemplateTransfer $templateTransfer, ): void { - $templateTransfer->protects[$propertyTransfer->propertyName] = $propertyTransfer->isProtected; + $templateTransfer->protects[$propertyTransfer->propertyName] = true; } } diff --git a/src/TransferGenerator/Generator/Render/Expander/RequiredTemplateExpander.php b/src/TransferGenerator/Generator/Render/Expander/RequiredTemplateExpander.php new file mode 100644 index 00000000..f5598a41 --- /dev/null +++ b/src/TransferGenerator/Generator/Render/Expander/RequiredTemplateExpander.php @@ -0,0 +1,23 @@ +isRequired; + } + + protected function handleExpander( + DefinitionPropertyTransfer $propertyTransfer, + TemplateTransfer $templateTransfer, + ): void { + $templateTransfer->requires[$propertyTransfer->propertyName] = true; + } +} diff --git a/src/TransferGenerator/Generator/Render/Expander/TemplateExpanderTrait.php b/src/TransferGenerator/Generator/Render/Expander/TemplateExpanderTrait.php index 3ea15293..9bb755a6 100644 --- a/src/TransferGenerator/Generator/Render/Expander/TemplateExpanderTrait.php +++ b/src/TransferGenerator/Generator/Render/Expander/TemplateExpanderTrait.php @@ -33,7 +33,6 @@ final protected function expandEmbeddedType( $propertyName = $propertyTransfer->propertyName; $templateTransfer->properties[$propertyName] = $embeddedTypeTransfer->name; - $templateTransfer->nullables[$propertyName] = $propertyTransfer->isNullable; } final protected function expandInitiatorAttribute( @@ -46,8 +45,6 @@ final protected function expandInitiatorAttribute( $propertyName = $propertyTransfer->propertyName; $templateTransfer->metaAttributes[$propertyName][] = $initiatorEnum->value; $templateTransfer->metaInitiators[] = $propertyName; - - $templateTransfer->nullables[$propertyName] = false; } /** diff --git a/src/TransferGenerator/Generator/Render/Expander/TransferTypeTemplateExpander.php b/src/TransferGenerator/Generator/Render/Expander/TransferTypeTemplateExpander.php index 161ac5cb..48633e8e 100644 --- a/src/TransferGenerator/Generator/Render/Expander/TransferTypeTemplateExpander.php +++ b/src/TransferGenerator/Generator/Render/Expander/TransferTypeTemplateExpander.php @@ -27,7 +27,6 @@ protected function handleExpander( $propertyName = $propertyTransfer->propertyName; $templateTransfer->properties[$propertyName] = $this->getPropertyType($typeTransfer); - $templateTransfer->nullables[$propertyName] = $propertyTransfer->isNullable; $transformerEnum = TransformerAttributeTemplateEnum::TRANSFER; $this->expandTransformerAttribute( diff --git a/src/TransferGenerator/Generator/Render/RenderFactory.php b/src/TransferGenerator/Generator/Render/RenderFactory.php index 0cea9366..9cab60b7 100644 --- a/src/TransferGenerator/Generator/Render/RenderFactory.php +++ b/src/TransferGenerator/Generator/Render/RenderFactory.php @@ -16,6 +16,7 @@ use Picamator\TransferObject\TransferGenerator\Generator\Render\Expander\NamespaceTemplateExpander; use Picamator\TransferObject\TransferGenerator\Generator\Render\Expander\NumberTypeTemplateExpander; use Picamator\TransferObject\TransferGenerator\Generator\Render\Expander\ProtectedTemplateExpander; +use Picamator\TransferObject\TransferGenerator\Generator\Render\Expander\RequiredTemplateExpander; use Picamator\TransferObject\TransferGenerator\Generator\Render\Expander\TemplateExpanderInterface; use Picamator\TransferObject\TransferGenerator\Generator\Render\Expander\TransferTypeTemplateExpander; use Picamator\TransferObject\TransferGenerator\Generator\Render\Template\Helper\TemplateHelper; @@ -73,6 +74,7 @@ protected function createTemplateExpander(): TemplateExpanderInterface ->setNextExpander($this->createNamespaceTemplateExpander()) ->setNextExpander($this->createMetaConstantsTemplateExpander()) ->setNextExpander($this->createProtectedTemplateExpander()) + ->setNextExpander($this->createRequiredTemplateExpander()) ->setNextExpander($this->createDateTimeTypeTemplateExpander()) ->setNextExpander($this->createNumberTypeTemplateExpander()) ->setNextExpander($this->createAttributesTemplateExpander()); @@ -95,6 +97,11 @@ protected function createDateTimeTypeTemplateExpander(): TemplateExpanderInterfa return new DateTimeTypeTemplateExpander(); } + protected function createRequiredTemplateExpander(): TemplateExpanderInterface + { + return new RequiredTemplateExpander(); + } + protected function createProtectedTemplateExpander(): TemplateExpanderInterface { return new ProtectedTemplateExpander(); diff --git a/src/TransferGenerator/Generator/Render/Template/Helper/PropertyHelperTrait.php b/src/TransferGenerator/Generator/Render/Template/Helper/PropertyHelperTrait.php index 7b2411a0..9a32f0a2 100644 --- a/src/TransferGenerator/Generator/Render/Template/Helper/PropertyHelperTrait.php +++ b/src/TransferGenerator/Generator/Render/Template/Helper/PropertyHelperTrait.php @@ -18,16 +18,16 @@ public function renderPropertyDeclaration(string $property): string /** @var string $propertyType */ $propertyType = $this->templateTransfer->properties[$property]; - return "{$this->renderProtected($property)} {$this->renderNullable($property)}$propertyType"; + return "{$this->renderProtected($property)} {$this->renderRequired($property)}$propertyType"; } - public function renderNullable(string $property): string + public function renderRequired(string $property): string { /** @var string $propertyType */ $propertyType = $this->templateTransfer->properties[$property]; - $isNullable = $this->templateTransfer->nullables[$property]; + $isRequired = $this->templateTransfer->requires[$property] ?? false; - if (!$isNullable || str_contains($propertyType, '&')) { + if ($isRequired || str_contains($propertyType, '&')) { return ''; } @@ -40,6 +40,8 @@ public function renderNullable(string $property): string private function renderProtected(string $property): string { - return $this->templateTransfer->protects[$property] ? self::PROTECTED_SET : ''; + $isProtected = $this->templateTransfer->protects[$property] ?? false; + + return $isProtected ? self::PROTECTED_SET : ''; } } diff --git a/src/TransferGenerator/Generator/Render/Template/Helper/TemplateHelperInterface.php b/src/TransferGenerator/Generator/Render/Template/Helper/TemplateHelperInterface.php index 5615a7e9..b61630ad 100644 --- a/src/TransferGenerator/Generator/Render/Template/Helper/TemplateHelperInterface.php +++ b/src/TransferGenerator/Generator/Render/Template/Helper/TemplateHelperInterface.php @@ -26,5 +26,5 @@ public function renderPropertyAttributes(string $property): string; public function renderPropertyDeclaration(string $property): string; - public function renderNullable(string $property): string; + public function renderRequired(string $property): string; } diff --git a/tests/unit/DefinitionGenerator/Generator/Render/DefinitionRenderTest.php b/tests/unit/DefinitionGenerator/Generator/Render/DefinitionRenderTest.php index a6d463ae..c608f148 100644 --- a/tests/unit/DefinitionGenerator/Generator/Render/DefinitionRenderTest.php +++ b/tests/unit/DefinitionGenerator/Generator/Render/DefinitionRenderTest.php @@ -124,7 +124,7 @@ public function testPropertyTypeIsNotSetShouldThrowException(): void $propertyTransfer = new DefinitionPropertyTransfer(); $propertyTransfer->propertyName = ''; - $propertyTransfer->isNullable = true; + $propertyTransfer->isRequired = false; $propertyTransfer->isProtected = false; $contentTransfer->properties[] = $propertyTransfer; diff --git a/tests/unit/TransferGenerator/Generator/Render/Template/TemplateHelperTest.php b/tests/unit/TransferGenerator/Generator/Render/Template/TemplateHelperTest.php index ed9de027..a4edf028 100644 --- a/tests/unit/TransferGenerator/Generator/Render/Template/TemplateHelperTest.php +++ b/tests/unit/TransferGenerator/Generator/Render/Template/TemplateHelperTest.php @@ -18,16 +18,16 @@ class TemplateHelperTest extends TestCase /** * @param array $templateData */ - #[DataProvider('getNullableDataProvider')] - #[TestDoxFormatter('getNullableTestDoxFormatter')] - public function testGetNullable(array $templateData, string $property, string $expected): void + #[DataProvider('getRequiredDataProvider')] + #[TestDoxFormatter('getRequiredTestDoxFormatter')] + public function testGetRequired(array $templateData, string $property, string $expected): void { // Arrange $templateTransfer = new TemplateTransfer()->fromArray($templateData); $templateHelper = new TemplateHelper()->setTemplateTransfer($templateTransfer); // Act - $actual = $templateHelper->renderNullable($property); + $actual = $templateHelper->renderRequired($property); // Assert $this->assertSame($expected, $actual); @@ -36,10 +36,10 @@ public function testGetNullable(array $templateData, string $property, string $e /** * @param array $templateData */ - public static function getNullableTestDoxFormatter(array $templateData, string $property, string $expected): string + public static function getRequiredTestDoxFormatter(array $templateData, string $property, string $expected): string { return sprintf( - 'Template data "%s" expect property "%s" nullable rendered as "%s"', + 'Template data "%s" expect property "%s" required rendered as "%s"', json_encode($templateData), $property, $expected, @@ -49,15 +49,15 @@ public static function getNullableTestDoxFormatter(array $templateData, string $ /** * @return Generator */ - public static function getNullableDataProvider(): Generator + public static function getRequiredDataProvider(): Generator { - yield 'property is not nullable should return empty string' => [ + yield 'property is required should return empty string' => [ 'templateData' => [ TemplateTransfer::PROPERTIES_PROP => [ 'test' => 'TestTransfer', ], - TemplateTransfer::NULLABLES_PROP => [ - 'test' => false, + TemplateTransfer::REQUIRES_PROP => [ + 'test' => true, ], ], 'property' => 'test', @@ -69,8 +69,8 @@ public static function getNullableDataProvider(): Generator TemplateTransfer::PROPERTIES_PROP => [ 'test' => 'TestTransfer&TTransferInterface', ], - TemplateTransfer::NULLABLES_PROP => [ - 'test' => true, + TemplateTransfer::REQUIRES_PROP => [ + 'test' => false, ], ], 'property' => 'test', @@ -82,8 +82,8 @@ public static function getNullableDataProvider(): Generator TemplateTransfer::PROPERTIES_PROP => [ 'test' => 'TestTransfer|TransferInterface', ], - TemplateTransfer::NULLABLES_PROP => [ - 'test' => true, + TemplateTransfer::REQUIRES_PROP => [ + 'test' => false, ], ], 'property' => 'test', @@ -95,8 +95,8 @@ public static function getNullableDataProvider(): Generator TemplateTransfer::PROPERTIES_PROP => [ 'test' => 'TestTransfer', ], - TemplateTransfer::NULLABLES_PROP => [ - 'test' => true, + TemplateTransfer::REQUIRES_PROP => [ + 'test' => false, ], ], 'property' => 'test',