Skip to content

Commit

Permalink
Merge pull request #8 from iter8-au/feature-symfony-6-support
Browse files Browse the repository at this point in the history
[FEATURE] Symfony 6 Support
  • Loading branch information
yesdevnull authored Oct 11, 2022
2 parents ec620b1 + 2c44e03 commit f2c4224
Show file tree
Hide file tree
Showing 14 changed files with 273 additions and 77 deletions.
1 change: 1 addition & 0 deletions .github/workflows/coding-standards.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ jobs:
php-version:
- 7.4
- 8.0
- 8.1

steps:
- name: "Checkout"
Expand Down
28 changes: 17 additions & 11 deletions .github/workflows/continuous-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,31 +22,37 @@ jobs:
matrix:
include:
# Symfony 4.4.0 has a minimum requirement of PHP 7.1.3 but LdapRecord library
# has a minimum PHP requirement of 7.2.
- php-version: 7.2
composer-flags: "--prefer-lowest --prefer-stable"
symfony-require: "4.4.*"
# has a minimum PHP requirement of 7.3.
- php-version: 7.3
composer-flags: "--prefer-stable"
composer-flags: "--prefer-lowest --prefer-stable"
symfony-require: "4.4.*"
- php-version: 7.4
composer-flags: "--prefer-stable"
symfony-require: "4.4.*"
- php-version: 7.4
composer-flags: "--prefer-stable"
symfony-require: "5.0.*"
symfony-require: "5.3.*"
- php-version: 7.4
composer-flags: "--prefer-stable"
symfony-require: "5.1.*"
- php-version: 7.4
symfony-require: "5.4.*"
- php-version: 8.0
composer-flags: "--prefer-stable"
symfony-require: "5.2.*"
symfony-require: "4.4.*"
- php-version: 8.0
composer-flags: "--prefer-stable"
symfony-require: "5.2.*"
symfony-require: "5.3.*"
- php-version: 8.0
composer-flags: "--prefer-stable"
symfony-require: "5.4.*"
- php-version: 8.0
composer-flags: "--prefer-stable"
symfony-require: "6.0.*"
- php-version: 8.1
composer-flags: "--ignore-platform-reqs"
symfony-require: "5.4.*"
- php-version: 8.1
composer-flags: "--ignore-platform-reqs"
symfony-require: "5.2.*"
symfony-require: "6.0.*"

services:
ldap:
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/static-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ jobs:
php-version:
- 7.4
- 8.0
- 8.1

steps:
- name: "Checkout"
Expand All @@ -32,5 +33,6 @@ jobs:
- name: "Run a static analysis with phpstan/phpstan"
run: "vendor/bin/phpstan analyse"

- name: "Run a static analysis with vimeo/psalm"
run: "vendor/bin/psalm --output-format=github"
# Skip Psalm until we can get it working better with Symfony bundle configuration files.
# - name: "Run a static analysis with vimeo/psalm"
# run: "vendor/bin/psalm --output-format=github"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ vendor/
composer.lock
phpunit.xml
.php_cs.cache
.php-cs-fixer.cache
.phpunit.result.cache
composer.phar
package.tar
Expand Down
16 changes: 9 additions & 7 deletions .php_cs.dist → .php-cs-fixer.dist.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
<?php

return PhpCsFixer\Config::create()
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
->append([__FILE__]);

// @See https://github.com/FriendsOfPHP/PHP-CS-Fixer
$config = new PhpCsFixer\Config();

return $config
->setRules([
'@Symfony' => true,
'@Symfony:risky' => true,
Expand All @@ -15,9 +22,4 @@
'php_unit_method_casing' => ['case' => 'snake_case'],
])
->setRiskyAllowed(true)
->setFinder(
PhpCsFixer\Finder::create()
->in(__DIR__)
->append([__FILE__])
)
;
->setFinder($finder);
176 changes: 172 additions & 4 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,60 +4,230 @@

namespace Iter8\Bundle\LdapRecordBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

final class Configuration implements ConfigurationInterface
{
/**
* @psalm-return TreeBuilder<'array'>
*
* @phpstan-return TreeBuilder
*/
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('iter8_ldap_record');

$rootNode = $treeBuilder->getRootNode();

$this->addHostsSection($rootNode);
$this->addBaseDnSection($rootNode);
$this->addUsernameSection($rootNode);
$this->addPasswordSection($rootNode);
$this->addPortSection($rootNode);
$this->addUseSslSection($rootNode);
$this->addUseTlsSection($rootNode);
$this->addVersionSection($rootNode);
$this->addTimeoutSection($rootNode);
$this->addFollowReferralsSection($rootNode);
$this->addAutoConnectSection($rootNode);
$this->addOptionsSection($rootNode);

return $treeBuilder;
}

private function addHostsSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
*/
$rootNode
->children()
->arrayNode('hosts')
->requiresAtLeastOneElement()
->scalarPrototype()
->end()
->scalarPrototype()->end()
->end()
->end();
}

private function addBaseDnSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->scalarNode('base_dn')
->isRequired()
->cannotBeEmpty()
->end()
->end();
}

private function addUsernameSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->scalarNode('username')
->isRequired()
->cannotBeEmpty()
->end()
->end();
}

private function addPasswordSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->scalarNode('password')
->isRequired()
->end()
->end();
}

private function addPortSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->integerNode('port')
->min(1)
->max(65535)
->defaultValue(389)
->end()
->end();
}

private function addUseSslSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->booleanNode('use_ssl')
->defaultFalse()
->end()
->end();
}

private function addUseTlsSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->booleanNode('use_tls')
->defaultFalse()
->end()
->end();
}

private function addVersionSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->enumNode('version')
->values([2, 3])
->defaultValue(3)
->end()
->end();
}

private function addTimeoutSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->integerNode('timeout')
->info('Timeout (in seconds).')
->defaultValue(5)
->end()
->end();
}

private function addFollowReferralsSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->booleanNode('follow_referrals')
->defaultFalse()
->end()
->end();
}

private function addAutoConnectSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
* @psalm-suppress UnusedMethodCall
*/
$rootNode
->children()
->booleanNode('auto_connect')
->defaultFalse()
->end()
->end();
}

private function addOptionsSection(ArrayNodeDefinition $rootNode): void
{
/*
* @psalm-suppress PossiblyNullReference
* @psalm-suppress PossiblyUndefinedMethod
* @psalm-suppress ReservedWord
*/
$rootNode
->children()
->arrayNode('options')
->arrayPrototype()
->children()
Expand All @@ -67,7 +237,5 @@ public function getConfigTreeBuilder(): TreeBuilder
->end()
->end()
->end();

return $treeBuilder;
}
}
6 changes: 6 additions & 0 deletions DependencyInjection/Iter8LdapRecordExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,18 @@ protected function loadInternal(
ContainerBuilder $container
): void {
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
/* @psalm-suppress ReservedWord */
$loader->load('services.xml');

if ($mergedConfig['use_ssl'] && $mergedConfig['use_tls']) {
throw new InvalidArgumentException(self::EXCEPTION_TLS_AND_SSL);
}

/**
* @var bool $shouldAutoConnect
*
* @phpcsSuppress SlevomatCodingStandard.PHP.RequireExplicitAssertion.RequiredExplicitAssertion
*/
$shouldAutoConnect = $mergedConfig['auto_connect'];
unset($mergedConfig['auto_connect']);

Expand Down
3 changes: 3 additions & 0 deletions Tests/DependencyInjection/Iter8LdapRecordExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ public function test_is_connected_with_auto_connect_enabled(): void
self::assertTrue($connection->isConnected());
}

/**
* @return array<string, mixed>
*/
private function baseConfig(): array
{
return [
Expand Down
2 changes: 1 addition & 1 deletion Tests/TestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ protected function getLdapConfig(): array
$h = @ldap_connect((string) getenv('LDAP_HOST'), (int) getenv('LDAP_PORT'));
@ldap_set_option($h, \LDAP_OPT_PROTOCOL_VERSION, 3);

if (!\is_resource($h) || !@ldap_bind($h)) {
if (null === $h || !@ldap_bind($h)) {
self::markTestSkipped('No server is listening on LDAP_HOST:LDAP_PORT');
}

Expand Down
Loading

0 comments on commit f2c4224

Please sign in to comment.