From 971df33e8f9c541aa4311183c269834e06f5d618 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Fri, 14 Aug 2026 12:38:09 +0530 Subject: [PATCH] refactor: flatten the schema namespace Every schema class sat under Model\Schema, which stuttered on the base class and repeated itself on the kinds: Utopia\OpenAPI\Model\Schema\Schema Utopia\OpenAPI\Model\Schema\ArraySchema Utopia\OpenAPI\Model\Schema\ObjectSchema The segment carried no information the class names did not already carry, and a consumer importing a base type and two kinds read Schema three times per line. The classes move up beside the models they are part of, so the base is Model\Schema and a kind is Model\ArraySchema. Dropping the suffix instead is not possible. Array, Object, String and Never are reserved and cannot name a class in PHP, so Model\Schema\Array and its neighbours cannot exist, and dropping the suffix only where the language allows would leave Schema\Integer beside Schema\ArraySchema. Removing the namespace segment keeps every kind named consistently while taking the redundancy out of the path. Model is a flat namespace of value objects, so schemas sit naturally next to Parameter, Response and MediaType rather than one level below them. No behaviour changes: the classes, their properties and their relationships are untouched. --- README.md | 4 ++-- src/Model/{Schema => }/AnySchema.php | 2 +- src/Model/{Schema => }/ArraySchema.php | 2 +- src/Model/{Schema => }/BooleanSchema.php | 2 +- src/Model/{Schema => }/CompositeSchema.php | 2 +- src/Model/{Schema => }/Composition.php | 2 +- src/Model/{Schema => }/Discriminator.php | 2 +- src/Model/Header.php | 2 -- src/Model/{Schema => }/IntegerSchema.php | 2 +- src/Model/MediaType.php | 2 -- src/Model/{Schema => }/NeverSchema.php | 2 +- src/Model/{Schema => }/NumberSchema.php | 2 +- src/Model/{Schema => }/ObjectSchema.php | 2 +- src/Model/Parameter.php | 2 -- src/Model/{Schema => }/ReferenceSchema.php | 2 +- src/Model/{Schema => }/Schema.php | 2 +- src/Model/{Schema => }/StringSchema.php | 2 +- src/Parser/OpenAPI2.php | 2 +- src/Parser/Schema/Reader.php | 26 +++++++++++----------- src/Specification.php | 2 +- tests/CrossVersionFixtureTest.php | 8 +++---- tests/ParserTest.php | 8 +++---- tests/Schema/ReaderTest.php | 18 +++++++-------- 23 files changed, 47 insertions(+), 53 deletions(-) rename src/Model/{Schema => }/AnySchema.php (68%) rename src/Model/{Schema => }/ArraySchema.php (95%) rename src/Model/{Schema => }/BooleanSchema.php (69%) rename src/Model/{Schema => }/CompositeSchema.php (95%) rename src/Model/{Schema => }/Composition.php (78%) rename src/Model/{Schema => }/Discriminator.php (89%) rename src/Model/{Schema => }/IntegerSchema.php (95%) rename src/Model/{Schema => }/NeverSchema.php (76%) rename src/Model/{Schema => }/NumberSchema.php (95%) rename src/Model/{Schema => }/ObjectSchema.php (96%) rename src/Model/{Schema => }/ReferenceSchema.php (94%) rename src/Model/{Schema => }/Schema.php (94%) rename src/Model/{Schema => }/StringSchema.php (95%) diff --git a/README.md b/README.md index f3643f1..3720894 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ The library models OpenAPI tags as tags. It does not assign SDK service or platf ### Schemas -Schemas are represented by typed classes under `Utopia\OpenAPI\Model\Schema`: +Schemas are represented by typed classes under `Utopia\OpenAPI\Model`, with `Schema` as their common base: - `AnySchema` and `NeverSchema` - `StringSchema` @@ -147,7 +147,7 @@ The model preserves: Schema references remain references rather than being recursively expanded: ```php -use Utopia\OpenAPI\Model\Schema\ReferenceSchema; +use Utopia\OpenAPI\Model\ReferenceSchema; $schema = $specification->schemas['Pet']; diff --git a/src/Model/Schema/AnySchema.php b/src/Model/AnySchema.php similarity index 68% rename from src/Model/Schema/AnySchema.php rename to src/Model/AnySchema.php index 5f42013..007d6a7 100644 --- a/src/Model/Schema/AnySchema.php +++ b/src/Model/AnySchema.php @@ -2,6 +2,6 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class AnySchema extends Schema {} diff --git a/src/Model/Schema/ArraySchema.php b/src/Model/ArraySchema.php similarity index 95% rename from src/Model/Schema/ArraySchema.php rename to src/Model/ArraySchema.php index 600b097..b257c6b 100644 --- a/src/Model/Schema/ArraySchema.php +++ b/src/Model/ArraySchema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class ArraySchema extends Schema { diff --git a/src/Model/Schema/BooleanSchema.php b/src/Model/BooleanSchema.php similarity index 69% rename from src/Model/Schema/BooleanSchema.php rename to src/Model/BooleanSchema.php index a191a67..15b3a64 100644 --- a/src/Model/Schema/BooleanSchema.php +++ b/src/Model/BooleanSchema.php @@ -2,6 +2,6 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class BooleanSchema extends Schema {} diff --git a/src/Model/Schema/CompositeSchema.php b/src/Model/CompositeSchema.php similarity index 95% rename from src/Model/Schema/CompositeSchema.php rename to src/Model/CompositeSchema.php index aa2f9ec..412f4c6 100644 --- a/src/Model/Schema/CompositeSchema.php +++ b/src/Model/CompositeSchema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class CompositeSchema extends Schema { diff --git a/src/Model/Schema/Composition.php b/src/Model/Composition.php similarity index 78% rename from src/Model/Schema/Composition.php rename to src/Model/Composition.php index 7ac471c..725e5ca 100644 --- a/src/Model/Schema/Composition.php +++ b/src/Model/Composition.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; enum Composition: string { diff --git a/src/Model/Schema/Discriminator.php b/src/Model/Discriminator.php similarity index 89% rename from src/Model/Schema/Discriminator.php rename to src/Model/Discriminator.php index 9182c8f..ae9f281 100644 --- a/src/Model/Schema/Discriminator.php +++ b/src/Model/Discriminator.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class Discriminator { diff --git a/src/Model/Header.php b/src/Model/Header.php index cd09459..358c76f 100644 --- a/src/Model/Header.php +++ b/src/Model/Header.php @@ -4,8 +4,6 @@ namespace Utopia\OpenAPI\Model; -use Utopia\OpenAPI\Model\Schema\Schema; - final readonly class Header { /** diff --git a/src/Model/Schema/IntegerSchema.php b/src/Model/IntegerSchema.php similarity index 95% rename from src/Model/Schema/IntegerSchema.php rename to src/Model/IntegerSchema.php index cb6f20b..a765742 100644 --- a/src/Model/Schema/IntegerSchema.php +++ b/src/Model/IntegerSchema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class IntegerSchema extends Schema { diff --git a/src/Model/MediaType.php b/src/Model/MediaType.php index 7fd818f..d192bcd 100644 --- a/src/Model/MediaType.php +++ b/src/Model/MediaType.php @@ -4,8 +4,6 @@ namespace Utopia\OpenAPI\Model; -use Utopia\OpenAPI\Model\Schema\Schema; - final readonly class MediaType { /** diff --git a/src/Model/Schema/NeverSchema.php b/src/Model/NeverSchema.php similarity index 76% rename from src/Model/Schema/NeverSchema.php rename to src/Model/NeverSchema.php index 235054a..ee3a072 100644 --- a/src/Model/Schema/NeverSchema.php +++ b/src/Model/NeverSchema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; /** A JSON Schema boolean false schema. */ final readonly class NeverSchema extends Schema {} diff --git a/src/Model/Schema/NumberSchema.php b/src/Model/NumberSchema.php similarity index 95% rename from src/Model/Schema/NumberSchema.php rename to src/Model/NumberSchema.php index fe0ce41..7cc1b4d 100644 --- a/src/Model/Schema/NumberSchema.php +++ b/src/Model/NumberSchema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class NumberSchema extends Schema { diff --git a/src/Model/Schema/ObjectSchema.php b/src/Model/ObjectSchema.php similarity index 96% rename from src/Model/Schema/ObjectSchema.php rename to src/Model/ObjectSchema.php index e323b0e..8ae9e4f 100644 --- a/src/Model/Schema/ObjectSchema.php +++ b/src/Model/ObjectSchema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class ObjectSchema extends Schema { diff --git a/src/Model/Parameter.php b/src/Model/Parameter.php index 5160ad7..86c74fc 100644 --- a/src/Model/Parameter.php +++ b/src/Model/Parameter.php @@ -4,8 +4,6 @@ namespace Utopia\OpenAPI\Model; -use Utopia\OpenAPI\Model\Schema\Schema; - final readonly class Parameter { /** diff --git a/src/Model/Schema/ReferenceSchema.php b/src/Model/ReferenceSchema.php similarity index 94% rename from src/Model/Schema/ReferenceSchema.php rename to src/Model/ReferenceSchema.php index 2577b48..508ecdd 100644 --- a/src/Model/Schema/ReferenceSchema.php +++ b/src/Model/ReferenceSchema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class ReferenceSchema extends Schema { diff --git a/src/Model/Schema/Schema.php b/src/Model/Schema.php similarity index 94% rename from src/Model/Schema/Schema.php rename to src/Model/Schema.php index dfd0c65..db04e10 100644 --- a/src/Model/Schema/Schema.php +++ b/src/Model/Schema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; abstract readonly class Schema { diff --git a/src/Model/Schema/StringSchema.php b/src/Model/StringSchema.php similarity index 95% rename from src/Model/Schema/StringSchema.php rename to src/Model/StringSchema.php index dbd0a6f..906b554 100644 --- a/src/Model/Schema/StringSchema.php +++ b/src/Model/StringSchema.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Utopia\OpenAPI\Model\Schema; +namespace Utopia\OpenAPI\Model; final readonly class StringSchema extends Schema { diff --git a/src/Parser/OpenAPI2.php b/src/Parser/OpenAPI2.php index cce70d2..3b5ded8 100644 --- a/src/Parser/OpenAPI2.php +++ b/src/Parser/OpenAPI2.php @@ -9,13 +9,13 @@ use Utopia\OpenAPI\Model\Example; use Utopia\OpenAPI\Model\HttpMethod; use Utopia\OpenAPI\Model\MediaType; +use Utopia\OpenAPI\Model\ObjectSchema; use Utopia\OpenAPI\Model\Operation; use Utopia\OpenAPI\Model\Parameter; use Utopia\OpenAPI\Model\ParameterLocation; use Utopia\OpenAPI\Model\PathItem; use Utopia\OpenAPI\Model\RequestBody; use Utopia\OpenAPI\Model\Response; -use Utopia\OpenAPI\Model\Schema\ObjectSchema; use Utopia\OpenAPI\Model\Server; use Utopia\OpenAPI\Specification; diff --git a/src/Parser/Schema/Reader.php b/src/Parser/Schema/Reader.php index 70ba9bc..1634b59 100644 --- a/src/Parser/Schema/Reader.php +++ b/src/Parser/Schema/Reader.php @@ -5,19 +5,19 @@ namespace Utopia\OpenAPI\Parser\Schema; use Utopia\OpenAPI\Exception\InvalidSpecification; -use Utopia\OpenAPI\Model\Schema\AnySchema; -use Utopia\OpenAPI\Model\Schema\ArraySchema; -use Utopia\OpenAPI\Model\Schema\BooleanSchema; -use Utopia\OpenAPI\Model\Schema\CompositeSchema; -use Utopia\OpenAPI\Model\Schema\Composition; -use Utopia\OpenAPI\Model\Schema\Discriminator; -use Utopia\OpenAPI\Model\Schema\IntegerSchema; -use Utopia\OpenAPI\Model\Schema\NeverSchema; -use Utopia\OpenAPI\Model\Schema\NumberSchema; -use Utopia\OpenAPI\Model\Schema\ObjectSchema; -use Utopia\OpenAPI\Model\Schema\ReferenceSchema; -use Utopia\OpenAPI\Model\Schema\Schema; -use Utopia\OpenAPI\Model\Schema\StringSchema; +use Utopia\OpenAPI\Model\AnySchema; +use Utopia\OpenAPI\Model\ArraySchema; +use Utopia\OpenAPI\Model\BooleanSchema; +use Utopia\OpenAPI\Model\CompositeSchema; +use Utopia\OpenAPI\Model\Composition; +use Utopia\OpenAPI\Model\Discriminator; +use Utopia\OpenAPI\Model\IntegerSchema; +use Utopia\OpenAPI\Model\NeverSchema; +use Utopia\OpenAPI\Model\NumberSchema; +use Utopia\OpenAPI\Model\ObjectSchema; +use Utopia\OpenAPI\Model\ReferenceSchema; +use Utopia\OpenAPI\Model\Schema; +use Utopia\OpenAPI\Model\StringSchema; use Utopia\OpenAPI\Parser\Value; /** diff --git a/src/Specification.php b/src/Specification.php index 2a58463..fdb7c0d 100644 --- a/src/Specification.php +++ b/src/Specification.php @@ -8,7 +8,7 @@ use Utopia\OpenAPI\Model\Info; use Utopia\OpenAPI\Model\Operation; use Utopia\OpenAPI\Model\PathItem; -use Utopia\OpenAPI\Model\Schema\Schema; +use Utopia\OpenAPI\Model\Schema; use Utopia\OpenAPI\Model\SecurityRequirement; use Utopia\OpenAPI\Model\SecurityScheme; use Utopia\OpenAPI\Model\Server; diff --git a/tests/CrossVersionFixtureTest.php b/tests/CrossVersionFixtureTest.php index 9afe262..6a50bb7 100644 --- a/tests/CrossVersionFixtureTest.php +++ b/tests/CrossVersionFixtureTest.php @@ -7,16 +7,16 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Utopia\OpenAPI\Model\HttpMethod; +use Utopia\OpenAPI\Model\IntegerSchema; +use Utopia\OpenAPI\Model\ObjectSchema; use Utopia\OpenAPI\Model\Operation; use Utopia\OpenAPI\Model\ParameterLocation; -use Utopia\OpenAPI\Model\Schema\IntegerSchema; -use Utopia\OpenAPI\Model\Schema\ObjectSchema; -use Utopia\OpenAPI\Model\Schema\ReferenceSchema; -use Utopia\OpenAPI\Model\Schema\StringSchema; +use Utopia\OpenAPI\Model\ReferenceSchema; use Utopia\OpenAPI\Model\SecurityRequirement; use Utopia\OpenAPI\Model\SecurityScheme; use Utopia\OpenAPI\Model\SecuritySchemeType; use Utopia\OpenAPI\Model\Server; +use Utopia\OpenAPI\Model\StringSchema; use Utopia\OpenAPI\Parser; use Utopia\OpenAPI\Specification; use Utopia\OpenAPI\Version; diff --git a/tests/ParserTest.php b/tests/ParserTest.php index 3aa101f..c672658 100644 --- a/tests/ParserTest.php +++ b/tests/ParserTest.php @@ -8,11 +8,11 @@ use Utopia\OpenAPI\Exception\CircularReference; use Utopia\OpenAPI\Exception\InvalidSpecification; use Utopia\OpenAPI\Exception\ParseException; +use Utopia\OpenAPI\Model\CompositeSchema; use Utopia\OpenAPI\Model\HttpMethod; -use Utopia\OpenAPI\Model\Schema\CompositeSchema; -use Utopia\OpenAPI\Model\Schema\ObjectSchema; -use Utopia\OpenAPI\Model\Schema\ReferenceSchema; -use Utopia\OpenAPI\Model\Schema\StringSchema; +use Utopia\OpenAPI\Model\ObjectSchema; +use Utopia\OpenAPI\Model\ReferenceSchema; +use Utopia\OpenAPI\Model\StringSchema; use Utopia\OpenAPI\Parser; use Utopia\OpenAPI\Reference\LocalResolver; use Utopia\OpenAPI\Version; diff --git a/tests/Schema/ReaderTest.php b/tests/Schema/ReaderTest.php index 228edda..54ae311 100644 --- a/tests/Schema/ReaderTest.php +++ b/tests/Schema/ReaderTest.php @@ -6,15 +6,15 @@ use PHPUnit\Framework\TestCase; use Utopia\OpenAPI\Exception\InvalidSpecification; -use Utopia\OpenAPI\Model\Schema\AnySchema; -use Utopia\OpenAPI\Model\Schema\ArraySchema; -use Utopia\OpenAPI\Model\Schema\CompositeSchema; -use Utopia\OpenAPI\Model\Schema\Composition; -use Utopia\OpenAPI\Model\Schema\IntegerSchema; -use Utopia\OpenAPI\Model\Schema\NeverSchema; -use Utopia\OpenAPI\Model\Schema\ObjectSchema; -use Utopia\OpenAPI\Model\Schema\ReferenceSchema; -use Utopia\OpenAPI\Model\Schema\StringSchema; +use Utopia\OpenAPI\Model\AnySchema; +use Utopia\OpenAPI\Model\ArraySchema; +use Utopia\OpenAPI\Model\CompositeSchema; +use Utopia\OpenAPI\Model\Composition; +use Utopia\OpenAPI\Model\IntegerSchema; +use Utopia\OpenAPI\Model\NeverSchema; +use Utopia\OpenAPI\Model\ObjectSchema; +use Utopia\OpenAPI\Model\ReferenceSchema; +use Utopia\OpenAPI\Model\StringSchema; use Utopia\OpenAPI\Parser\Schema\Dialect; use Utopia\OpenAPI\Parser\Schema\Reader; use Utopia\OpenAPI\Version;