From 6824406bbf430d5d37ace063387823ba46d8edda Mon Sep 17 00:00:00 2001 From: dFayet Date: Sun, 3 Nov 2019 18:29:55 +0100 Subject: [PATCH 1/3] Add Api-Platform's version in debug bar --- CHANGELOG.md | 1 + composer.json | 1 + .../DataCollector/RequestDataCollector.php | 13 +++++++++++ .../views/DataCollector/request.html.twig | 2 +- .../RequestDataCollectorTest.php | 22 +++++++++++++++++++ 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5d2fccd95c..adf29598ee1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 2.6.0 +* Display the API Platform's version in the debug-bar * MongoDB: Possibility to add execute options (aggregate command fields) for a resource, like `allowDiskUse` (#3144) * MongoDB: Mercure support (#3290) * GraphQL: Subscription support with Mercure (#3321) diff --git a/composer.json b/composer.json index 1eedc7e1261..03fa8a2b186 100644 --- a/composer.json +++ b/composer.json @@ -96,6 +96,7 @@ "doctrine/mongodb-odm-bundle": "To support MongoDB. Only versions 4.0 and later are supported.", "elasticsearch/elasticsearch": "To support Elasticsearch.", "guzzlehttp/guzzle": "To use the HTTP cache invalidation system.", + "ocramius/package-versions": "To display the API Platform's version in the debug bar.", "phpdocumentor/reflection-docblock": "To support extracting metadata from PHPDoc.", "psr/cache-implementation": "To use metadata caching.", "ramsey/uuid": "To support Ramsey's UUID identifiers.", diff --git a/src/Bridge/Symfony/Bundle/DataCollector/RequestDataCollector.php b/src/Bridge/Symfony/Bundle/DataCollector/RequestDataCollector.php index 9ecf4c46c30..a5c8db17701 100644 --- a/src/Bridge/Symfony/Bundle/DataCollector/RequestDataCollector.php +++ b/src/Bridge/Symfony/Bundle/DataCollector/RequestDataCollector.php @@ -23,6 +23,7 @@ use ApiPlatform\Core\DataProvider\SubresourceDataProviderInterface; use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; use ApiPlatform\Core\Util\RequestAttributesExtractor; +use PackageVersions\Versions; use Psr\Container\ContainerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -158,6 +159,18 @@ public function getDataPersisters(): array return $this->data['dataPersisters'] ?? ['responses' => []]; } + public function getVersion(): ?string + { + if (!class_exists(Versions::class)) { + return null; + } + + $version = Versions::getVersion('api-platform/core'); + preg_match('/^v(.*?)@/', $version, $output); + + return $output[1] ?? strtok($version, '@'); + } + /** * {@inheritdoc} */ diff --git a/src/Bridge/Symfony/Bundle/Resources/views/DataCollector/request.html.twig b/src/Bridge/Symfony/Bundle/Resources/views/DataCollector/request.html.twig index 79d78a25bf2..56e22891e32 100644 --- a/src/Bridge/Symfony/Bundle/Resources/views/DataCollector/request.html.twig +++ b/src/Bridge/Symfony/Bundle/Resources/views/DataCollector/request.html.twig @@ -80,7 +80,7 @@ {% set icon %} {% set status_color = collector.counters.ignored_filters|default(false) ? 'yellow' : 'default' %} {{ include('@ApiPlatform/DataCollector/api-platform-icon.svg') }} - + {{ collector.version }} {% endset %} {% set text %} diff --git a/tests/Bridge/Symfony/Bundle/DataCollector/RequestDataCollectorTest.php b/tests/Bridge/Symfony/Bundle/DataCollector/RequestDataCollectorTest.php index 7621d124ef2..3bfd06d05f0 100644 --- a/tests/Bridge/Symfony/Bundle/DataCollector/RequestDataCollectorTest.php +++ b/tests/Bridge/Symfony/Bundle/DataCollector/RequestDataCollectorTest.php @@ -31,6 +31,7 @@ use ApiPlatform\Core\Tests\Fixtures\DummyEntity; use ApiPlatform\Core\Tests\ProphecyTrait; use PHPUnit\Framework\TestCase; +use ProxyManager\Version; use Psr\Container\ContainerInterface; use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\Request; @@ -212,6 +213,27 @@ public function testWithResourceWithTraceables() } } + public function testVersionCollection() + { + $this->apiResourceClassWillReturn(DummyEntity::class); + + $dataCollector = new RequestDataCollector( + $this->metadataFactory->reveal(), + $this->filterLocator->reveal(), + $this->getUsedCollectionDataProvider(), + $this->getUsedItemDataProvider(), + $this->getUsedSubresourceDataProvider(), + $this->getUsedPersister() + ); + + $dataCollector->collect( + $this->request->reveal(), + $this->response + ); + + $this->assertSame(null !== $dataCollector->getVersion(), class_exists(Version::class)); + } + private function apiResourceClassWillReturn($data, $context = []) { $this->attributes->get('_api_resource_class')->shouldBeCalled()->willReturn($data); From 875ff2bc4ace21b2b89acc8d56aa0ff12e69afc9 Mon Sep 17 00:00:00 2001 From: Damien Date: Mon, 4 Nov 2019 12:43:59 +0100 Subject: [PATCH 2/3] Move version in hover tooltip --- .../Bundle/Resources/views/DataCollector/request.html.twig | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Bridge/Symfony/Bundle/Resources/views/DataCollector/request.html.twig b/src/Bridge/Symfony/Bundle/Resources/views/DataCollector/request.html.twig index 56e22891e32..13bfe8939e2 100644 --- a/src/Bridge/Symfony/Bundle/Resources/views/DataCollector/request.html.twig +++ b/src/Bridge/Symfony/Bundle/Resources/views/DataCollector/request.html.twig @@ -80,10 +80,15 @@ {% set icon %} {% set status_color = collector.counters.ignored_filters|default(false) ? 'yellow' : 'default' %} {{ include('@ApiPlatform/DataCollector/api-platform-icon.svg') }} - {{ collector.version }} {% endset %} {% set text %} + {% if collector.version %} +
+ Version + {{ collector.version }} +
+ {% endif %}
Resource Class {{ collector.resourceClass|default('Not an API Platform resource') }} From 28c3e4581c73135ec546447657e3d1fca7ebcff9 Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Thu, 10 Sep 2020 19:48:09 +0200 Subject: [PATCH 3/3] fix: unit test --- .../Symfony/Bundle/DataCollector/RequestDataCollectorTest.php | 4 ++-- .../Symfony/Bundle/Twig/ApiPlatformProfilerPanelTest.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Bridge/Symfony/Bundle/DataCollector/RequestDataCollectorTest.php b/tests/Bridge/Symfony/Bundle/DataCollector/RequestDataCollectorTest.php index 3bfd06d05f0..52e482ff848 100644 --- a/tests/Bridge/Symfony/Bundle/DataCollector/RequestDataCollectorTest.php +++ b/tests/Bridge/Symfony/Bundle/DataCollector/RequestDataCollectorTest.php @@ -30,8 +30,8 @@ use ApiPlatform\Core\Metadata\Resource\ResourceMetadata; use ApiPlatform\Core\Tests\Fixtures\DummyEntity; use ApiPlatform\Core\Tests\ProphecyTrait; +use PackageVersions\Versions; use PHPUnit\Framework\TestCase; -use ProxyManager\Version; use Psr\Container\ContainerInterface; use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\Request; @@ -231,7 +231,7 @@ public function testVersionCollection() $this->response ); - $this->assertSame(null !== $dataCollector->getVersion(), class_exists(Version::class)); + $this->assertSame(null !== $dataCollector->getVersion(), class_exists(Versions::class)); } private function apiResourceClassWillReturn($data, $context = []) diff --git a/tests/Bridge/Symfony/Bundle/Twig/ApiPlatformProfilerPanelTest.php b/tests/Bridge/Symfony/Bundle/Twig/ApiPlatformProfilerPanelTest.php index 9ff6806e6d9..3ea58ad0f04 100644 --- a/tests/Bridge/Symfony/Bundle/Twig/ApiPlatformProfilerPanelTest.php +++ b/tests/Bridge/Symfony/Bundle/Twig/ApiPlatformProfilerPanelTest.php @@ -81,7 +81,7 @@ public function testDebugBarContentNotResourceClass() // Check extra info content $this->assertStringContainsString('sf-toolbar-status-default', $block->attr('class'), 'The toolbar block should have the default color.'); - $this->assertSame('Not an API Platform resource', $block->filter('.sf-toolbar-info-piece span')->html()); + $this->assertSame('Not an API Platform resource', $block->filterXPath('//div[@class="sf-toolbar-info-piece"][./b[contains(., "Resource Class")]]/span')->html()); } public function testDebugBarContent() @@ -99,7 +99,7 @@ public function testDebugBarContent() // Check extra info content $this->assertStringContainsString('sf-toolbar-status-default', $block->attr('class'), 'The toolbar block should have the default color.'); - $this->assertSame('mongodb' === $this->env ? DocumentDummy::class : Dummy::class, $block->filter('.sf-toolbar-info-piece span')->html()); + $this->assertSame('mongodb' === $this->env ? DocumentDummy::class : Dummy::class, $block->filterXPath('//div[@class="sf-toolbar-info-piece"][./b[contains(., "Resource Class")]]/span')->html()); } public function testProfilerGeneralLayoutNotResourceClass()