Skip to content

Commit f63d641

Browse files
committed
Merge remote-tracking branch 'origin/master' into extra-field-validations
2 parents cc65b9a + 36496bb commit f63d641

File tree

9 files changed

+111
-51
lines changed

9 files changed

+111
-51
lines changed

.php_cs.php

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
'array_syntax' => ['syntax' => 'short'],
1414
'no_multiline_whitespace_before_semicolons' => true,
1515
'no_short_echo_tag' => true,
16+
'no_unused_imports' => true,
1617
'not_operator_with_successor_space' => true,
1718
'no_useless_else' => true,
1819
'ordered_imports' => [

CHANGELOG.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

77

8-
## [5.1.0] - 2021-04-01
8+
## [5.2.0] - 2021-04-06
99
### Added
1010
- Support for `minimum`, `maximum`, `exclusiveMinimum`, `exclusiveMaximum`, `minItems`, `maxItems`, `pattern`, `maxLength`, `minLength` validations
1111

1212
### Changed
1313
- Example generated with 7.4
1414

15+
## [5.1.0] - 2021-04-02
16+
### Changed
17+
- Only content type serializers which are used are included
18+
1519
## [5.0.0] - 2021-02-15
1620
### Changed
1721
- By default, the PHP version used in the generated client is 7.4.

src/Application.php

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace DoclerLabs\ApiClientGenerator;
44

55
use DoclerLabs\ApiClientGenerator\Command\GenerateCommand;
6-
use DoclerLabs\ApiClientGenerator\Output\WarningFormatter;
76
use Pimple\Container;
87
use Symfony\Component\Console\Application as BaseApplication;
98

src/Command/GenerateCommand.php

+40-13
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@
1010
use DoclerLabs\ApiClientGenerator\Input\Parser;
1111
use DoclerLabs\ApiClientGenerator\Input\Specification;
1212
use DoclerLabs\ApiClientGenerator\MetaTemplateFacade;
13+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\ContentType\FormUrlencodedContentTypeSerializer;
14+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\ContentType\JsonContentTypeSerializer;
15+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\ContentType\XmlContentTypeSerializer;
1316
use DoclerLabs\ApiClientGenerator\Output\Meta\MetaFileCollection;
1417
use DoclerLabs\ApiClientGenerator\Output\MetaFilePrinter;
1518
use DoclerLabs\ApiClientGenerator\Output\Php\PhpFileCollection;
1619
use DoclerLabs\ApiClientGenerator\Output\PhpFilePrinter;
1720
use DoclerLabs\ApiClientGenerator\Output\StaticPhpFileCopier;
1821
use DoclerLabs\ApiClientGenerator\Output\WarningFormatter;
22+
use ReflectionClass;
1923
use Symfony\Component\Console\Command\Command;
2024
use Symfony\Component\Console\Input\InputInterface;
2125
use Symfony\Component\Console\Output\OutputInterface;
@@ -89,7 +93,7 @@ public function execute(InputInterface $input, OutputInterface $output): int
8993
$this->generatePhpFiles($ss, $specification);
9094
$this->copySpecification($ss);
9195
$this->generateMetaFiles($ss, $specification);
92-
$this->copyStaticPhpFiles($ss);
96+
$this->copyStaticPhpFiles($ss, $specification);
9397

9498
return Command::SUCCESS;
9599
}
@@ -137,9 +141,10 @@ private function generateMetaFiles(StyleInterface $ss, Specification $specificat
137141
$ss->progressFinish();
138142
}
139143

140-
private function copyStaticPhpFiles(StyleInterface $ss): void
144+
private function copyStaticPhpFiles(StyleInterface $ss, Specification $specification): void
141145
{
142-
$originalFiles = $this->fileFinder
146+
$blacklistedFiles = $this->getBlacklistedFiles($specification);
147+
$originalFiles = $this->fileFinder
143148
->files()
144149
->name('*.php')
145150
->in(Configuration::STATIC_PHP_FILE_DIRECTORY);
@@ -149,17 +154,19 @@ private function copyStaticPhpFiles(StyleInterface $ss): void
149154

150155
$ss->progressStart($originalFiles->count());
151156
foreach ($originalFiles as $originalFile) {
152-
$destinationPath = sprintf(
153-
'%s/%s/%s',
154-
$this->configuration->getOutputDirectory(),
155-
$this->configuration->getSourceDirectory(),
156-
$originalFile->getRelativePathname()
157-
);
157+
if (empty($blacklistedFiles[$originalFile->getBasename()])) {
158+
$destinationPath = sprintf(
159+
'%s/%s/%s',
160+
$this->configuration->getOutputDirectory(),
161+
$this->configuration->getSourceDirectory(),
162+
$originalFile->getRelativePathname()
163+
);
158164

159-
$this->staticPhpPrinter->copy(
160-
$destinationPath,
161-
$originalFile
162-
);
165+
$this->staticPhpPrinter->copy(
166+
$destinationPath,
167+
$originalFile
168+
);
169+
}
163170

164171
$ss->progressAdvance();
165172
}
@@ -195,4 +202,24 @@ static function (): bool {
195202
set_error_handler($this->warningFormatter, E_USER_WARNING);
196203
}
197204
}
205+
206+
private function getBlacklistedFiles(Specification $specification): array
207+
{
208+
$contentTypeMapping = [
209+
XmlContentTypeSerializer::MIME_TYPE => XmlContentTypeSerializer::class,
210+
FormUrlencodedContentTypeSerializer::MIME_TYPE => FormUrlencodedContentTypeSerializer::class,
211+
JsonContentTypeSerializer::MIME_TYPE => JsonContentTypeSerializer::class,
212+
];
213+
214+
$allContentTypes = $specification->getAllContentTypes();
215+
216+
return array_flip(array_map(
217+
fn ($class) => basename((string)(new ReflectionClass($class))->getFileName()),
218+
array_filter(
219+
$contentTypeMapping,
220+
fn ($key) => !in_array($key, $allContentTypes),
221+
ARRAY_FILTER_USE_KEY
222+
)
223+
));
224+
}
198225
}

src/Generator/ServiceProviderGenerator.php

+41-27
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use DoclerLabs\ApiClientException\Factory\ResponseExceptionFactory;
66
use DoclerLabs\ApiClientGenerator\Ast\Builder\CodeBuilder;
77
use DoclerLabs\ApiClientGenerator\Entity\Field;
8+
use DoclerLabs\ApiClientGenerator\Entity\Operation;
89
use DoclerLabs\ApiClientGenerator\Generator\Implementation\ContainerImplementationStrategy;
910
use DoclerLabs\ApiClientGenerator\Generator\Implementation\HttpMessageImplementationStrategy;
1011
use DoclerLabs\ApiClientGenerator\Input\Specification;
@@ -63,7 +64,7 @@ public function generate(Specification $specification, PhpFileCollection $fileRe
6364

6465
$classBuilder = $this->builder
6566
->class('ServiceProvider')
66-
->addStmt($this->generateRegisterMethod($compositeFields));
67+
->addStmt($this->generateRegisterMethod($specification, $compositeFields));
6768

6869
foreach ($this->containerImplementation->getContainerRegisterImports() as $import) {
6970
$this->addImport($import);
@@ -72,8 +73,10 @@ public function generate(Specification $specification, PhpFileCollection $fileRe
7273
$this->registerFile($fileRegistry, $classBuilder);
7374
}
7475

75-
public function generateRegisterMethod(array $compositeFields): ClassMethod
76-
{
76+
private function generateRegisterMethod(
77+
Specification $specification,
78+
array $compositeFields
79+
): ClassMethod {
7780
$statements = [];
7881

7982
$param = $this->builder
@@ -115,7 +118,7 @@ public function generateRegisterMethod(array $compositeFields): ClassMethod
115118
$statements[] = $this->containerImplementation->registerClosure(
116119
$containerVariable,
117120
$this->builder->classConstFetch('BodySerializer', 'class'),
118-
$this->generateBodySerializerClosure()
121+
$this->generateBodySerializerClosure($specification)
119122
);
120123
$statements[] = $this->containerImplementation->registerClosure(
121124
$containerVariable,
@@ -180,33 +183,44 @@ private function generateQuerySerializerClosure(): Closure
180183
);
181184
}
182185

183-
private function generateBodySerializerClosure(): Closure
186+
private function generateBodySerializerClosure(Specification $specification): Closure
184187
{
185-
$jsonSerializerInit = $this->builder->methodCall(
186-
$this->builder->new('BodySerializer'),
187-
'add',
188-
[
189-
$this->builder->new('JsonContentTypeSerializer'),
190-
]
191-
);
188+
$initialStatement = $this->builder->new('BodySerializer');
189+
$allContentTypes = $specification->getAllContentTypes();
192190

193-
$formEncodedSerializerInit = $this->builder->methodCall(
194-
$jsonSerializerInit,
195-
'add',
196-
[
197-
$this->builder->new('FormUrlencodedContentTypeSerializer'),
198-
]
199-
);
191+
if (in_array(JsonContentTypeSerializer::MIME_TYPE, $allContentTypes, true)) {
192+
$jsonSerializerInit = $this->builder->methodCall(
193+
$initialStatement,
194+
'add',
195+
[
196+
$this->builder->new('JsonContentTypeSerializer'),
197+
]
198+
);
199+
}
200200

201-
$xmlSerializerInit = $this->builder->methodCall(
202-
$formEncodedSerializerInit,
203-
'add',
204-
[
205-
$this->builder->new('XmlContentTypeSerializer'),
206-
]
207-
);
201+
if (in_array(FormUrlencodedContentTypeSerializer::MIME_TYPE, $allContentTypes, true)) {
202+
$formEncodedSerializerInit = $this->builder->methodCall(
203+
$jsonSerializerInit ?? $initialStatement,
204+
'add',
205+
[
206+
$this->builder->new('FormUrlencodedContentTypeSerializer'),
207+
]
208+
);
209+
}
210+
211+
if (in_array(XmlContentTypeSerializer::MIME_TYPE, $allContentTypes, true)) {
212+
$xmlSerializerInit = $this->builder->methodCall(
213+
$formEncodedSerializerInit ?? $jsonSerializerInit ?? $initialStatement,
214+
'add',
215+
[
216+
$this->builder->new('XmlContentTypeSerializer'),
217+
]
218+
);
219+
}
208220

209-
$registerBodySerializerClosureStatements[] = $this->builder->return($xmlSerializerInit);
221+
$registerBodySerializerClosureStatements[] = $this
222+
->builder
223+
->return($xmlSerializerInit ?? $formEncodedSerializerInit ?? $jsonSerializerInit ?? $initialStatement);
210224

211225
return $this->builder->closure(
212226
$registerBodySerializerClosureStatements,

src/Input/Specification.php

+22
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44

55
use cebe\openapi\spec\OpenApi;
66
use DoclerLabs\ApiClientGenerator\Entity\FieldCollection;
7+
use DoclerLabs\ApiClientGenerator\Entity\Operation;
78
use DoclerLabs\ApiClientGenerator\Entity\OperationCollection;
9+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\ContentType\FormUrlencodedContentTypeSerializer;
10+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\ContentType\JsonContentTypeSerializer;
11+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\ContentType\XmlContentTypeSerializer;
812

913
class Specification
1014
{
@@ -59,4 +63,22 @@ public function getCompositeResponseFields(): FieldCollection
5963
{
6064
return $this->compositeResponseFields;
6165
}
66+
67+
public function getAllContentTypes(): array
68+
{
69+
$allContentTypes = [
70+
XmlContentTypeSerializer::MIME_TYPE => false,
71+
FormUrlencodedContentTypeSerializer::MIME_TYPE => false,
72+
JsonContentTypeSerializer::MIME_TYPE => false,
73+
];
74+
75+
/** @var Operation $operation */
76+
foreach ($this->getOperations() as $operation) {
77+
foreach ($operation->getRequest()->getBodyContentTypes() as $contentType) {
78+
$allContentTypes[$contentType] = true;
79+
}
80+
}
81+
82+
return array_keys(array_filter($allContentTypes));
83+
}
6284
}

test/suite/functional/Generator/ServiceProvider/ServiceProviderPhp70.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,15 @@
1717
use Test\Schema\Mapper\PetCollectionMapper;
1818
use Test\Schema\Mapper\PetMapper;
1919
use Test\Serializer\BodySerializer;
20-
use Test\Serializer\ContentType\FormUrlencodedContentTypeSerializer;
2120
use Test\Serializer\ContentType\JsonContentTypeSerializer;
22-
use Test\Serializer\ContentType\XmlContentTypeSerializer;
2321
use Test\Serializer\QuerySerializer;
2422

2523
class ServiceProvider
2624
{
2725
public function register(Container $container): void
2826
{
2927
$container[BodySerializer::class] = static function (): BodySerializer {
30-
return (new BodySerializer())->add(new JsonContentTypeSerializer())->add(new FormUrlencodedContentTypeSerializer())->add(new XmlContentTypeSerializer());
28+
return (new BodySerializer())->add(new JsonContentTypeSerializer());
3129
};
3230
$container[QuerySerializer::class] = static function (): QuerySerializer {
3331
return new QuerySerializer();

test/suite/functional/Generator/ServiceProvider/ServiceProviderPhp72.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,15 @@
1717
use Test\Schema\Mapper\PetCollectionMapper;
1818
use Test\Schema\Mapper\PetMapper;
1919
use Test\Serializer\BodySerializer;
20-
use Test\Serializer\ContentType\FormUrlencodedContentTypeSerializer;
2120
use Test\Serializer\ContentType\JsonContentTypeSerializer;
22-
use Test\Serializer\ContentType\XmlContentTypeSerializer;
2321
use Test\Serializer\QuerySerializer;
2422

2523
class ServiceProvider
2624
{
2725
public function register(Container $container): void
2826
{
2927
$container[BodySerializer::class] = static function (): BodySerializer {
30-
return (new BodySerializer())->add(new JsonContentTypeSerializer())->add(new FormUrlencodedContentTypeSerializer())->add(new XmlContentTypeSerializer());
28+
return (new BodySerializer())->add(new JsonContentTypeSerializer());
3129
};
3230
$container[QuerySerializer::class] = static function (): QuerySerializer {
3331
return new QuerySerializer();

test/suite/functional/Meta/ReadmeMdTemplateTest.php

-3
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22

33
namespace DoclerLabs\ApiClientGenerator\Test\Functional\Meta;
44

5-
use DoclerLabs\ApiClientGenerator\Generator\SchemaGenerator;
65
use DoclerLabs\ApiClientGenerator\Input\Configuration;
7-
use DoclerLabs\ApiClientGenerator\Meta\ComposerJsonTemplate;
86
use DoclerLabs\ApiClientGenerator\Meta\ReadmeMdTemplate;
97
use DoclerLabs\ApiClientGenerator\Meta\Template\TwigExtension;
108
use DoclerLabs\ApiClientGenerator\Meta\TemplateInterface;
119
use DoclerLabs\ApiClientGenerator\Test\Functional\ConfigurationBuilder;
12-
use Pimple\Container;
1310
use Twig\Environment;
1411
use Twig\Loader\FilesystemLoader;
1512

0 commit comments

Comments
 (0)