Skip to content

Commit 51ab421

Browse files
authored
Merge pull request #94 from DoclerLabs/fix-optional-nullable-datetime
fix optional nullable datetime
2 parents db7748a + f91ceaa commit 51ab421

File tree

8 files changed

+104
-4
lines changed

8 files changed

+104
-4
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
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

7+
## [10.1.4] - 2023.08.25
8+
### Fixed
9+
- Avoid new DateTimeImmutable(null) - adding support for nullable optional datetime
10+
711
## [10.1.3] - 2023.08.23
812
### Fixed
913
- OpenAPI spec copied forcefully to destination directory

src/Generator/SchemaMapperGenerator.php

+9-1
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,15 @@ protected function generateMapStatementsForObject(Field $root, Variable $payload
328328
);
329329
} elseif ($field->isDate()) {
330330
$this->addImport(DateTimeImmutable::class);
331-
$optionalVar = $this->builder->new('DateTimeImmutable', [$optionalResponseItems[$i]]);
331+
if ($field->isNullable()) {
332+
$optionalVar = $this->builder->ternary(
333+
$this->builder->notEquals($optionalResponseItems[$i], $this->builder->val(null)),
334+
$this->builder->new('DateTimeImmutable', [$optionalResponseItems[$i]]),
335+
$this->builder->val(null)
336+
);
337+
} else {
338+
$optionalVar = $this->builder->new('DateTimeImmutable', [$optionalResponseItems[$i]]);
339+
}
332340
} else {
333341
$optionalVar = $optionalResponseItems[$i];
334342
}

test/suite/functional/Generator/Schema/ItemPhp70.php

+31-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ class Item implements SerializableInterface, JsonSerializable
7979
/** @var DateTimeInterface|null */
8080
private $optionalDate;
8181

82+
/** @var DateTimeInterface|null */
83+
private $optionalNullableDate;
84+
8285
/** @var float|null */
8386
private $optionalFloat;
8487

@@ -125,7 +128,7 @@ class Item implements SerializableInterface, JsonSerializable
125128
private $optionalNullableStringWithMinMaxLength;
126129

127130
/** @var array */
128-
private $optionalPropertyChanged = ['optionalInteger' => false, 'optionalString' => false, 'optionalEnum' => false, 'optionalIntEnum' => false, 'optionalDate' => false, 'optionalFloat' => false, 'optionalBoolean' => false, 'optionalNullableBoolean' => false, 'optionalArray' => false, 'optionalNullableArray' => false, 'optionalMixedArray' => false, 'optionalArrayWithMinMaxItems' => false, 'optionalStringWithMinMaxLength' => false, 'optionalStringWithPattern' => false, 'optionalIntegerBetweenIncluded' => false, 'optionalIntegerBetweenExcluded' => false, 'optionalNumberBetweenIncluded' => false, 'optionalNumberBetweenExcluded' => false, 'optionalObject' => false, 'optionalNullableStringWithMinMaxLength' => false];
131+
private $optionalPropertyChanged = ['optionalInteger' => false, 'optionalString' => false, 'optionalEnum' => false, 'optionalIntEnum' => false, 'optionalDate' => false, 'optionalNullableDate' => false, 'optionalFloat' => false, 'optionalBoolean' => false, 'optionalNullableBoolean' => false, 'optionalArray' => false, 'optionalNullableArray' => false, 'optionalMixedArray' => false, 'optionalArrayWithMinMaxItems' => false, 'optionalStringWithMinMaxLength' => false, 'optionalStringWithPattern' => false, 'optionalIntegerBetweenIncluded' => false, 'optionalIntegerBetweenExcluded' => false, 'optionalNumberBetweenIncluded' => false, 'optionalNumberBetweenExcluded' => false, 'optionalObject' => false, 'optionalNullableStringWithMinMaxLength' => false];
129132

130133
/**
131134
* @param DateTimeInterface|null $mandatoryNullableDate
@@ -203,6 +206,17 @@ public function setOptionalDate(DateTimeInterface $optionalDate): self
203206
return $this;
204207
}
205208

209+
/**
210+
* @param DateTimeInterface|null $optionalNullableDate
211+
*/
212+
public function setOptionalNullableDate($optionalNullableDate): self
213+
{
214+
$this->optionalNullableDate = $optionalNullableDate;
215+
$this->optionalPropertyChanged['optionalNullableDate'] = true;
216+
217+
return $this;
218+
}
219+
206220
public function setOptionalFloat(float $optionalFloat): self
207221
{
208222
$this->optionalFloat = $optionalFloat;
@@ -433,6 +447,11 @@ public function hasOptionalDate(): bool
433447
return $this->optionalPropertyChanged['optionalDate'];
434448
}
435449

450+
public function hasOptionalNullableDate(): bool
451+
{
452+
return $this->optionalPropertyChanged['optionalNullableDate'];
453+
}
454+
436455
public function hasOptionalFloat(): bool
437456
{
438457
return $this->optionalPropertyChanged['optionalFloat'];
@@ -633,6 +652,14 @@ public function getOptionalDate()
633652
return $this->optionalDate;
634653
}
635654

655+
/**
656+
* @return DateTimeInterface|null
657+
*/
658+
public function getOptionalNullableDate()
659+
{
660+
return $this->optionalNullableDate;
661+
}
662+
636663
/**
637664
* @return float|null
638665
*/
@@ -785,6 +812,9 @@ public function toArray(): array
785812
if ($this->hasOptionalDate()) {
786813
$fields['optionalDate'] = $this->optionalDate->format(DATE_RFC3339);
787814
}
815+
if ($this->hasOptionalNullableDate()) {
816+
$fields['optionalNullableDate'] = $this->optionalNullableDate !== null ? $this->optionalNullableDate->format(DATE_RFC3339) : null;
817+
}
788818
if ($this->hasOptionalFloat()) {
789819
$fields['optionalFloat'] = $this->optionalFloat;
790820
}

test/suite/functional/Generator/Schema/ItemPhp72.php

+25-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ class Item implements SerializableInterface, JsonSerializable
7979
/** @var DateTimeInterface|null */
8080
private $optionalDate;
8181

82+
/** @var DateTimeInterface|null */
83+
private $optionalNullableDate;
84+
8285
/** @var float|null */
8386
private $optionalFloat;
8487

@@ -125,7 +128,7 @@ class Item implements SerializableInterface, JsonSerializable
125128
private $optionalNullableStringWithMinMaxLength;
126129

127130
/** @var array */
128-
private $optionalPropertyChanged = ['optionalInteger' => false, 'optionalString' => false, 'optionalEnum' => false, 'optionalIntEnum' => false, 'optionalDate' => false, 'optionalFloat' => false, 'optionalBoolean' => false, 'optionalNullableBoolean' => false, 'optionalArray' => false, 'optionalNullableArray' => false, 'optionalMixedArray' => false, 'optionalArrayWithMinMaxItems' => false, 'optionalStringWithMinMaxLength' => false, 'optionalStringWithPattern' => false, 'optionalIntegerBetweenIncluded' => false, 'optionalIntegerBetweenExcluded' => false, 'optionalNumberBetweenIncluded' => false, 'optionalNumberBetweenExcluded' => false, 'optionalObject' => false, 'optionalNullableStringWithMinMaxLength' => false];
131+
private $optionalPropertyChanged = ['optionalInteger' => false, 'optionalString' => false, 'optionalEnum' => false, 'optionalIntEnum' => false, 'optionalDate' => false, 'optionalNullableDate' => false, 'optionalFloat' => false, 'optionalBoolean' => false, 'optionalNullableBoolean' => false, 'optionalArray' => false, 'optionalNullableArray' => false, 'optionalMixedArray' => false, 'optionalArrayWithMinMaxItems' => false, 'optionalStringWithMinMaxLength' => false, 'optionalStringWithPattern' => false, 'optionalIntegerBetweenIncluded' => false, 'optionalIntegerBetweenExcluded' => false, 'optionalNumberBetweenIncluded' => false, 'optionalNumberBetweenExcluded' => false, 'optionalObject' => false, 'optionalNullableStringWithMinMaxLength' => false];
129132

130133
/**
131134
* @param string[] $mandatoryArray
@@ -200,6 +203,14 @@ public function setOptionalDate(DateTimeInterface $optionalDate): self
200203
return $this;
201204
}
202205

206+
public function setOptionalNullableDate(?DateTimeInterface $optionalNullableDate): self
207+
{
208+
$this->optionalNullableDate = $optionalNullableDate;
209+
$this->optionalPropertyChanged['optionalNullableDate'] = true;
210+
211+
return $this;
212+
}
213+
203214
public function setOptionalFloat(float $optionalFloat): self
204215
{
205216
$this->optionalFloat = $optionalFloat;
@@ -425,6 +436,11 @@ public function hasOptionalDate(): bool
425436
return $this->optionalPropertyChanged['optionalDate'];
426437
}
427438

439+
public function hasOptionalNullableDate(): bool
440+
{
441+
return $this->optionalPropertyChanged['optionalNullableDate'];
442+
}
443+
428444
public function hasOptionalFloat(): bool
429445
{
430446
return $this->optionalPropertyChanged['optionalFloat'];
@@ -601,6 +617,11 @@ public function getOptionalDate(): ?DateTimeInterface
601617
return $this->optionalDate;
602618
}
603619

620+
public function getOptionalNullableDate(): ?DateTimeInterface
621+
{
622+
return $this->optionalNullableDate;
623+
}
624+
604625
public function getOptionalFloat(): ?float
605626
{
606627
return $this->optionalFloat;
@@ -720,6 +741,9 @@ public function toArray(): array
720741
if ($this->hasOptionalDate()) {
721742
$fields['optionalDate'] = $this->optionalDate->format(DATE_RFC3339);
722743
}
744+
if ($this->hasOptionalNullableDate()) {
745+
$fields['optionalNullableDate'] = $this->optionalNullableDate !== null ? $this->optionalNullableDate->format(DATE_RFC3339) : null;
746+
}
723747
if ($this->hasOptionalFloat()) {
724748
$fields['optionalFloat'] = $this->optionalFloat;
725749
}

test/suite/functional/Generator/Schema/ItemPhp74.php

+24-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class Item implements SerializableInterface, JsonSerializable
6262

6363
private ?DateTimeInterface $optionalDate = null;
6464

65+
private ?DateTimeInterface $optionalNullableDate = null;
66+
6567
private ?float $optionalFloat = null;
6668

6769
private ?bool $optionalBoolean = null;
@@ -92,7 +94,7 @@ class Item implements SerializableInterface, JsonSerializable
9294

9395
private ?string $optionalNullableStringWithMinMaxLength = null;
9496

95-
private array $optionalPropertyChanged = ['optionalInteger' => false, 'optionalString' => false, 'optionalEnum' => false, 'optionalIntEnum' => false, 'optionalDate' => false, 'optionalFloat' => false, 'optionalBoolean' => false, 'optionalNullableBoolean' => false, 'optionalArray' => false, 'optionalNullableArray' => false, 'optionalMixedArray' => false, 'optionalArrayWithMinMaxItems' => false, 'optionalStringWithMinMaxLength' => false, 'optionalStringWithPattern' => false, 'optionalIntegerBetweenIncluded' => false, 'optionalIntegerBetweenExcluded' => false, 'optionalNumberBetweenIncluded' => false, 'optionalNumberBetweenExcluded' => false, 'optionalObject' => false, 'optionalNullableStringWithMinMaxLength' => false];
97+
private array $optionalPropertyChanged = ['optionalInteger' => false, 'optionalString' => false, 'optionalEnum' => false, 'optionalIntEnum' => false, 'optionalDate' => false, 'optionalNullableDate' => false, 'optionalFloat' => false, 'optionalBoolean' => false, 'optionalNullableBoolean' => false, 'optionalArray' => false, 'optionalNullableArray' => false, 'optionalMixedArray' => false, 'optionalArrayWithMinMaxItems' => false, 'optionalStringWithMinMaxLength' => false, 'optionalStringWithPattern' => false, 'optionalIntegerBetweenIncluded' => false, 'optionalIntegerBetweenExcluded' => false, 'optionalNumberBetweenIncluded' => false, 'optionalNumberBetweenExcluded' => false, 'optionalObject' => false, 'optionalNullableStringWithMinMaxLength' => false];
9698

9799
/**
98100
* @param string[] $mandatoryArray
@@ -167,6 +169,14 @@ public function setOptionalDate(DateTimeInterface $optionalDate): self
167169
return $this;
168170
}
169171

172+
public function setOptionalNullableDate(?DateTimeInterface $optionalNullableDate): self
173+
{
174+
$this->optionalNullableDate = $optionalNullableDate;
175+
$this->optionalPropertyChanged['optionalNullableDate'] = true;
176+
177+
return $this;
178+
}
179+
170180
public function setOptionalFloat(float $optionalFloat): self
171181
{
172182
$this->optionalFloat = $optionalFloat;
@@ -392,6 +402,11 @@ public function hasOptionalDate(): bool
392402
return $this->optionalPropertyChanged['optionalDate'];
393403
}
394404

405+
public function hasOptionalNullableDate(): bool
406+
{
407+
return $this->optionalPropertyChanged['optionalNullableDate'];
408+
}
409+
395410
public function hasOptionalFloat(): bool
396411
{
397412
return $this->optionalPropertyChanged['optionalFloat'];
@@ -568,6 +583,11 @@ public function getOptionalDate(): ?DateTimeInterface
568583
return $this->optionalDate;
569584
}
570585

586+
public function getOptionalNullableDate(): ?DateTimeInterface
587+
{
588+
return $this->optionalNullableDate;
589+
}
590+
571591
public function getOptionalFloat(): ?float
572592
{
573593
return $this->optionalFloat;
@@ -687,6 +707,9 @@ public function toArray(): array
687707
if ($this->hasOptionalDate()) {
688708
$fields['optionalDate'] = $this->optionalDate->format(DATE_RFC3339);
689709
}
710+
if ($this->hasOptionalNullableDate()) {
711+
$fields['optionalNullableDate'] = $this->optionalNullableDate !== null ? $this->optionalNullableDate->format(DATE_RFC3339) : null;
712+
}
690713
if ($this->hasOptionalFloat()) {
691714
$fields['optionalFloat'] = $this->optionalFloat;
692715
}

test/suite/functional/Generator/Schema/item.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ components:
9191
optionalDate:
9292
type: string
9393
format: 'date-time'
94+
optionalNullableDate:
95+
type: string
96+
format: 'date-time'
97+
nullable: true
9498
optionalFloat:
9599
type: number
96100
format: float

test/suite/functional/Generator/SchemaMapper/ItemMapper.php

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ public function toSchema(array $payload): Item
4848
if (isset($payload['optionalDate'])) {
4949
$schema->setOptionalDate(new DateTimeImmutable($payload['optionalDate']));
5050
}
51+
if (\array_key_exists('optionalNullableDate', $payload)) {
52+
$schema->setOptionalNullableDate($payload['optionalNullableDate'] !== null ? new DateTimeImmutable($payload['optionalNullableDate']) : null);
53+
}
5154
if (isset($payload['optionalFloat'])) {
5255
$schema->setOptionalFloat($payload['optionalFloat']);
5356
}

test/suite/functional/Generator/SchemaMapper/item.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ components:
6464
optionalDate:
6565
type: string
6666
format: 'date-time'
67+
optionalNullableDate:
68+
type: string
69+
format: 'date-time'
70+
nullable: true
6771
optionalFloat:
6872
type: number
6973
format: float

0 commit comments

Comments
 (0)