diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b763b90a50..9bec670bbbb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@
* Mercure: Do not use data in options when deleting (#4056)
* Doctrine: Support for foreign identifiers
+* SchemaFactory: Allow generating documentation when property and method start from "is" (property `isActive` and method `isActive`)
## 2.6.2
diff --git a/features/hal/collection.feature b/features/hal/collection.feature
index 8507c886621..2b801be527e 100644
--- a/features/hal/collection.feature
+++ b/features/hal/collection.feature
@@ -73,6 +73,7 @@ Feature: HAL Collections support
"description": "Smart dummy.",
"dummy": "SomeDummyTest1",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -93,6 +94,7 @@ Feature: HAL Collections support
"description": "Not so smart dummy.",
"dummy": "SomeDummyTest2",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -113,6 +115,7 @@ Feature: HAL Collections support
"description": "Smart dummy.",
"dummy": "SomeDummyTest3",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -180,6 +183,7 @@ Feature: HAL Collections support
"description": "Smart dummy.",
"dummy": "SomeDummyTest7",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -200,6 +204,7 @@ Feature: HAL Collections support
"description": "Not so smart dummy.",
"dummy": "SomeDummyTest8",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -220,6 +225,7 @@ Feature: HAL Collections support
"description": "Smart dummy.",
"dummy": "SomeDummyTest9",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -278,6 +284,7 @@ Feature: HAL Collections support
"description": "Not so smart dummy.",
"dummy": "SomeDummyTest10",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -339,6 +346,7 @@ Feature: HAL Collections support
"description": "Not so smart dummy.",
"dummy": "SomeDummyTest4",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -359,6 +367,7 @@ Feature: HAL Collections support
"description": "Smart dummy.",
"dummy": "SomeDummyTest5",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -379,6 +388,7 @@ Feature: HAL Collections support
"description": "Not so smart dummy.",
"dummy": "SomeDummyTest6",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -501,6 +511,7 @@ Feature: HAL Collections support
"description": "Not so smart dummy.",
"dummy": "SomeDummyTest2",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -550,6 +561,7 @@ Feature: HAL Collections support
"description": "Not so smart dummy.",
"dummy": "SomeDummyTest8",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -599,6 +611,7 @@ Feature: HAL Collections support
"description": "Not so smart dummy.",
"dummy": "SomeDummyTest8",
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
diff --git a/features/hal/hal.feature b/features/hal/hal.feature
index 933c844caed..d0cf487fc58 100644
--- a/features/hal/hal.feature
+++ b/features/hal/hal.feature
@@ -71,6 +71,7 @@ Feature: HAL support
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": "2015-03-01T10:00:00+00:00",
"dummyFloat": null,
"dummyPrice": null,
@@ -114,6 +115,7 @@ Feature: HAL support
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": "2015-03-01T10:00:00+00:00",
"dummyFloat": null,
"dummyPrice": null,
diff --git a/features/json/relation.feature b/features/json/relation.feature
index 7c39dc75f71..129b3bc189e 100644
--- a/features/json/relation.feature
+++ b/features/json/relation.feature
@@ -208,6 +208,7 @@ Feature: JSON relations support
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
diff --git a/features/jsonapi/related-resouces-inclusion.feature b/features/jsonapi/related-resouces-inclusion.feature
index d2850d7ea49..34ab3dfbb31 100644
--- a/features/jsonapi/related-resouces-inclusion.feature
+++ b/features/jsonapi/related-resouces-inclusion.feature
@@ -338,6 +338,7 @@ Feature: JSON API Inclusion of Related Resources
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
diff --git a/features/main/content_negotiation.feature b/features/main/content_negotiation.feature
index f6f6593c448..4d12ec0e679 100644
--- a/features/main/content_negotiation.feature
+++ b/features/main/content_negotiation.feature
@@ -19,7 +19,7 @@ Feature: Content Negotiation support
And the XML should be equal to:
"""
- 1XML!
+ 1XML!
"""
Scenario: Retrieve a collection in XML
@@ -31,7 +31,7 @@ Feature: Content Negotiation support
And the XML should be equal to:
"""
- - 1XML!
+ - 1XML!
"""
Scenario: Retrieve a collection in XML using the .xml URL
@@ -42,7 +42,7 @@ Feature: Content Negotiation support
And the XML should be equal to:
"""
- - 1XML!
+ - 1XML!
"""
Scenario: Retrieve a collection in JSON
@@ -58,6 +58,7 @@ Feature: Content Negotiation support
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -89,7 +90,7 @@ Feature: Content Negotiation support
And the XML should be equal to:
"""
- 2Sent in JSON
+ 2Sent in JSON
"""
Scenario: Requesting the same format in the Accept header and in the URL should work
diff --git a/features/main/crud.feature b/features/main/crud.feature
index f73bb80f8f6..150b4333342 100644
--- a/features/main/crud.feature
+++ b/features/main/crud.feature
@@ -33,6 +33,7 @@ Feature: Create-Retrieve-Update-Delete
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": "2015-03-01T10:00:00+00:00",
"dummyFloat": null,
"dummyPrice": null,
@@ -69,6 +70,7 @@ Feature: Create-Retrieve-Update-Delete
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": "2015-03-01T10:00:00+00:00",
"dummyFloat": null,
"dummyPrice": null,
@@ -119,6 +121,7 @@ Feature: Create-Retrieve-Update-Delete
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": "2015-03-01T10:00:00+00:00",
"dummyFloat": null,
"dummyPrice": null,
@@ -523,6 +526,7 @@ Feature: Create-Retrieve-Update-Delete
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": "2018-12-01T13:12:00+00:00",
"dummyFloat": null,
"dummyPrice": null,
diff --git a/features/main/relation.feature b/features/main/relation.feature
index 8c268ed8417..37f97588e2c 100644
--- a/features/main/relation.feature
+++ b/features/main/relation.feature
@@ -155,6 +155,7 @@ Feature: Relations support
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
diff --git a/features/main/subresource.feature b/features/main/subresource.feature
index c2f0341c600..3746d443dae 100644
--- a/features/main/subresource.feature
+++ b/features/main/subresource.feature
@@ -383,6 +383,7 @@ Feature: Subresource support
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -416,6 +417,7 @@ Feature: Subresource support
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
diff --git a/features/security/strong_typing.feature b/features/security/strong_typing.feature
index ef630a2c27a..dab2e8caf44 100644
--- a/features/security/strong_typing.feature
+++ b/features/security/strong_typing.feature
@@ -25,6 +25,7 @@ Feature: Handle properly invalid data submitted to the API
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
@@ -33,8 +34,8 @@ Feature: Handle properly invalid data submitted to the API
"jsonData": [],
"arrayData": [],
"name_converted": null,
- "relatedOwnedDummy": null,
- "relatedOwningDummy": null,
+ "relatedOwnedDummy": null,
+ "relatedOwningDummy": null,
"id": 1,
"name": "Not existing",
"alias": null,
diff --git a/features/security/unknown_attributes.feature b/features/security/unknown_attributes.feature
index efe7b954c0a..4e7d4cb9e66 100644
--- a/features/security/unknown_attributes.feature
+++ b/features/security/unknown_attributes.feature
@@ -25,6 +25,7 @@ Feature: Ignore unknown attributes
"description": null,
"dummy": null,
"dummyBoolean": null,
+ "isDummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
diff --git a/src/JsonSchema/SchemaFactory.php b/src/JsonSchema/SchemaFactory.php
index 2093ef60b93..561814223a6 100644
--- a/src/JsonSchema/SchemaFactory.php
+++ b/src/JsonSchema/SchemaFactory.php
@@ -325,7 +325,10 @@ private function getValidationGroups(ResourceMetadata $resourceMetadata, ?string
*/
private function getFactoryOptions(array $serializerContext, array $validationGroups, ?string $operationType, ?string $operationName): array
{
- $options = [];
+ $options = [
+ /* @see https://github.com/symfony/symfony/blob/v5.1.0/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php */
+ 'enable_getter_setter_extraction' => true,
+ ];
if (isset($serializerContext[AbstractNormalizer::GROUPS])) {
/* @see https://github.com/symfony/symfony/blob/v4.2.6/src/Symfony/Component/PropertyInfo/Extractor/SerializerExtractor.php */
diff --git a/tests/Bridge/Doctrine/Common/Filter/BooleanFilterTestTrait.php b/tests/Bridge/Doctrine/Common/Filter/BooleanFilterTestTrait.php
index 3745fd2b02a..9c2e0daff66 100644
--- a/tests/Bridge/Doctrine/Common/Filter/BooleanFilterTestTrait.php
+++ b/tests/Bridge/Doctrine/Common/Filter/BooleanFilterTestTrait.php
@@ -46,6 +46,11 @@ public function testGetDescriptionDefaultFields()
'type' => 'bool',
'required' => false,
],
+ 'isDummyBoolean' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'bool',
+ 'required' => false,
+ ],
], $filter->getDescription($this->resourceClass));
}
diff --git a/tests/Bridge/Doctrine/Orm/Filter/ExistsFilterTest.php b/tests/Bridge/Doctrine/Orm/Filter/ExistsFilterTest.php
index 471a74689fe..4ecdf1f21f7 100644
--- a/tests/Bridge/Doctrine/Orm/Filter/ExistsFilterTest.php
+++ b/tests/Bridge/Doctrine/Orm/Filter/ExistsFilterTest.php
@@ -90,6 +90,11 @@ public function testGetDescriptionDefaultFields()
'type' => 'bool',
'required' => false,
],
+ 'exists[isDummyBoolean]' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'bool',
+ 'required' => false,
+ ],
], $filter->getDescription($this->resourceClass));
}
diff --git a/tests/Bridge/Doctrine/Orm/Filter/OrderFilterTest.php b/tests/Bridge/Doctrine/Orm/Filter/OrderFilterTest.php
index 77417ba1714..c2c3965c7fb 100644
--- a/tests/Bridge/Doctrine/Orm/Filter/OrderFilterTest.php
+++ b/tests/Bridge/Doctrine/Orm/Filter/OrderFilterTest.php
@@ -180,6 +180,18 @@ public function testGetDescriptionDefaultFields()
],
],
],
+ 'order[isDummyBoolean]' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'string',
+ 'required' => false,
+ 'schema' => [
+ 'type' => 'string',
+ 'enum' => [
+ 'asc',
+ 'desc',
+ ],
+ ],
+ ],
], $filter->getDescription($this->resourceClass));
}
diff --git a/tests/Bridge/Doctrine/Orm/Filter/RangeFilterTest.php b/tests/Bridge/Doctrine/Orm/Filter/RangeFilterTest.php
index 178b379ecdb..25416d1ef2c 100644
--- a/tests/Bridge/Doctrine/Orm/Filter/RangeFilterTest.php
+++ b/tests/Bridge/Doctrine/Orm/Filter/RangeFilterTest.php
@@ -332,6 +332,31 @@ public function testGetDescriptionDefaultFields()
'type' => 'string',
'required' => false,
],
+ 'isDummyBoolean[between]' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'string',
+ 'required' => false,
+ ],
+ 'isDummyBoolean[gt]' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'string',
+ 'required' => false,
+ ],
+ 'isDummyBoolean[gte]' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'string',
+ 'required' => false,
+ ],
+ 'isDummyBoolean[lt]' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'string',
+ 'required' => false,
+ ],
+ 'isDummyBoolean[lte]' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'string',
+ 'required' => false,
+ ],
], $filter->getDescription($this->resourceClass));
}
diff --git a/tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php b/tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php
index 1dbb23905dd..5d83a002c8a 100644
--- a/tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php
+++ b/tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php
@@ -214,6 +214,20 @@ public function testGetDescriptionDefaultFields()
'strategy' => 'exact',
'is_collection' => true,
],
+ 'isDummyBoolean' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'bool',
+ 'required' => false,
+ 'strategy' => 'exact',
+ 'is_collection' => false,
+ ],
+ 'isDummyBoolean[]' => [
+ 'property' => 'isDummyBoolean',
+ 'type' => 'bool',
+ 'required' => false,
+ 'strategy' => 'exact',
+ 'is_collection' => true,
+ ],
], $filter->getDescription($this->resourceClass));
}
diff --git a/tests/Fixtures/TestBundle/Document/Dummy.php b/tests/Fixtures/TestBundle/Document/Dummy.php
index 8e276fe7939..12cdc4b811a 100644
--- a/tests/Fixtures/TestBundle/Document/Dummy.php
+++ b/tests/Fixtures/TestBundle/Document/Dummy.php
@@ -98,6 +98,13 @@ class Dummy
*/
public $dummyBoolean;
+ /**
+ * @var bool A dummy boolean
+ *
+ * @ODM\Field(type="bool", nullable=true)
+ */
+ public $isDummyBoolean;
+
/**
* @var \DateTime A dummy date
*
@@ -315,7 +322,7 @@ public function setRelatedOwningDummy(RelatedOwningDummy $relatedOwningDummy)
/**
* @return bool
*/
- public function isDummyBoolean()
+ public function getDummyBoolean()
{
return $this->dummyBoolean;
}
@@ -328,6 +335,22 @@ public function setDummyBoolean($dummyBoolean)
$this->dummyBoolean = $dummyBoolean;
}
+ /**
+ * @return bool
+ */
+ public function isDummyBoolean()
+ {
+ return $this->isDummyBoolean;
+ }
+
+ /**
+ * @param bool $isDummyBoolean
+ */
+ public function setIsDummyBoolean($isDummyBoolean)
+ {
+ $this->isDummyBoolean = $isDummyBoolean;
+ }
+
public function setDummy($dummy = null)
{
$this->dummy = $dummy;
diff --git a/tests/Fixtures/TestBundle/Entity/Dummy.php b/tests/Fixtures/TestBundle/Entity/Dummy.php
index af81454acb1..43d60f3c4ea 100644
--- a/tests/Fixtures/TestBundle/Entity/Dummy.php
+++ b/tests/Fixtures/TestBundle/Entity/Dummy.php
@@ -94,6 +94,13 @@ class Dummy
*/
public $dummyBoolean;
+ /**
+ * @var bool A dummy boolean
+ *
+ * @ORM\Column(type="boolean", nullable=true)
+ */
+ public $isDummyBoolean;
+
/**
* @var \DateTime A dummy date
*
@@ -316,7 +323,7 @@ public function setRelatedOwningDummy(RelatedOwningDummy $relatedOwningDummy)
/**
* @return bool
*/
- public function isDummyBoolean()
+ public function getDummyBoolean()
{
return $this->dummyBoolean;
}
@@ -329,6 +336,22 @@ public function setDummyBoolean($dummyBoolean)
$this->dummyBoolean = $dummyBoolean;
}
+ /**
+ * @return bool
+ */
+ public function isDummyBoolean()
+ {
+ return $this->isDummyBoolean;
+ }
+
+ /**
+ * @param bool $isDummyBoolean
+ */
+ public function setIsDummyBoolean($isDummyBoolean)
+ {
+ $this->isDummyBoolean = $isDummyBoolean;
+ }
+
public function setDummy($dummy = null)
{
$this->dummy = $dummy;
diff --git a/tests/Hydra/JsonSchema/SchemaFactoryTest.php b/tests/Hydra/JsonSchema/SchemaFactoryTest.php
index f80caf4dcb9..5c29c60ae6b 100644
--- a/tests/Hydra/JsonSchema/SchemaFactoryTest.php
+++ b/tests/Hydra/JsonSchema/SchemaFactoryTest.php
@@ -39,7 +39,7 @@ protected function setUp(): void
$resourceMetadataFactory = $this->prophesize(ResourceMetadataFactoryInterface::class);
$resourceMetadataFactory->create(Dummy::class)->willReturn(new ResourceMetadata(Dummy::class));
$propertyNameCollectionFactory = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
- $propertyNameCollectionFactory->create(Dummy::class, [])->willReturn(new PropertyNameCollection());
+ $propertyNameCollectionFactory->create(Dummy::class, ['enable_getter_setter_extraction' => true])->willReturn(new PropertyNameCollection());
$propertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
$baseSchemaFactory = new BaseSchemaFactory(