Skip to content

Commit

Permalink
Merge b03ca1c into 1ff5abb
Browse files Browse the repository at this point in the history
  • Loading branch information
joelwurtz committed Nov 9, 2018
2 parents 1ff5abb + b03ca1c commit 1148064
Show file tree
Hide file tree
Showing 28 changed files with 725 additions and 395 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ build
tests/generated/*
!tests/generated/.gitkeep
tests/fixtures/*/generated
src/AutoMapper/Bundle/Tests/Resources/app/cache/
1 change: 1 addition & 0 deletions .php_cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ $dirs = PhpCsFixer\Finder::create()
->exclude('OpenApi/Normalizer')
->exclude('OpenApi/Model')
->exclude('OpenApi/Tests/fixtures')
->exclude('AutoMapper/Bundle/Tests/Resources')
->in(__DIR__ . '/src')
;

Expand Down
12 changes: 8 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@
"friendsofphp/php-cs-fixer": "^2.7.3",
"localheinz/composer-normalize": "~0.8.0",
"php-http/artax-adapter": "^0.1",
"phpunit/phpunit": "^6.0"
"phpunit/phpunit": "^6.0",
"sensio/framework-extra-bundle": "^3.0",
"symfony/phpunit-bridge": "^4.1"
},
"suggest": {
"friendsofphp/php-cs-fixer": "Allow to automatically fix cs on generated code for better visualisation"
Expand All @@ -55,9 +57,11 @@
"autoload": {
"psr-4": {
"Jane\\": "src/"
},
"exclude-from-classmap": [
"**/Tests/"
}
},
"autoload-dev": {
"classmap": [
"src/AutoMapper/Bundle/Tests/Resources/app/AppKernel.php"
]
},
"minimum-stability": "dev",
Expand Down
9 changes: 9 additions & 0 deletions phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@
bootstrap = "bootstrap.php" >

<testsuites>
<testsuite name="Jane AutoMapper Bundle Test Suite">
<directory>./src/AutoMapper/Bundle/Tests</directory>
</testsuite>

<testsuite name="Jane Unit Test Suite">
<directory>./src/*/Tests</directory>
<exclude>./src/JsonSchema/Tests/fixtures</exclude>
Expand All @@ -33,4 +37,9 @@
</exclude>
</whitelist>
</filter>

<php>
<server name="KERNEL_DIR" value="./src/AutoMapper/Bundle/Tests/Resources/app" />
<server name="KERNEL_CLASS" value="DummyApp\AppKernel" />
</php>
</phpunit>
9 changes: 7 additions & 2 deletions src/AutoMapper/AbstractAutoMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
use Jane\AutoMapper\Exception\NoMappingFoundException;
use PhpParser\PrettyPrinter\Standard;

abstract class AbstractAutoMapper implements AutoMapperInterface
abstract class AbstractAutoMapper implements AutoMapperInterface, AutoMapperRegisterInterface
{
private $configurations = [];

Expand All @@ -19,7 +19,7 @@ public function __construct(Compiler $compiler = null)
$this->compiler = $compiler ?? new Compiler();
}

public function register(MapperConfigurationInterface $configuration)
public function register(MapperConfigurationInterface $configuration): void
{
if (!array_key_exists($configuration->getSource(), $this->configurations)) {
$this->configurations[$configuration->getSource()] = [];
Expand Down Expand Up @@ -52,6 +52,11 @@ public function getMapper(string $source, string $target): Mapper
return $this->mapperRegistry[$className] = $mappingConfiguration->createMapper($this);
}

public function hasMapper(string $source, string $target): bool
{
return $this->getConfiguration($source, $target) !== null;
}

public function map($value, string $target, Context $context = null)
{
$source = null;
Expand Down
2 changes: 2 additions & 0 deletions src/AutoMapper/AutoMapperInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@ interface AutoMapperInterface
{
public function getMapper(string $source, string $target): Mapper;

public function hasMapper(string $source, string $target): bool;

public function map($value, string $target, Context $context = null);
}
8 changes: 8 additions & 0 deletions src/AutoMapper/AutoMapperRegisterInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Jane\AutoMapper;

interface AutoMapperRegisterInterface
{
public function register(MapperConfigurationInterface $configuration): void;
}
27 changes: 27 additions & 0 deletions src/AutoMapper/Bundle/AutoMapper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Jane\AutoMapper\Bundle;

use Jane\AutoMapper\AbstractAutoMapper;
use Jane\AutoMapper\Bundle\Configuration\ConfigurationPassInterface;
use Jane\AutoMapper\MapperConfigurationInterface;

class AutoMapper extends AbstractAutoMapper
{
/** @var ConfigurationPassInterface[] */
private $configurationPass = [];

public function addConfigurationPass(ConfigurationPassInterface $configurationPass)
{
$this->configurationPass[] = $configurationPass;
}

public function register(MapperConfigurationInterface $configuration): void
{
foreach ($this->configurationPass as $configurationPass) {
$configurationPass->process($configuration);
}

parent::register($configuration);
}
}
10 changes: 10 additions & 0 deletions src/AutoMapper/Bundle/Configuration/ConfigurationPassInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Jane\AutoMapper\Bundle\Configuration;

use Jane\AutoMapper\MapperConfigurationInterface;

interface ConfigurationPassInterface
{
public function process(MapperConfigurationInterface $configuration);
}
30 changes: 30 additions & 0 deletions src/AutoMapper/Bundle/Configuration/RestrictConfigurationPass.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Jane\AutoMapper\Bundle\Configuration;

use Jane\AutoMapper\MapperConfigurationInterface;

class RestrictConfigurationPass implements ConfigurationPassInterface
{
private $source;

private $target;

private $configurationPass;

public function __construct($source, $target, ConfigurationPassInterface $configurationPass)
{
$this->source = $source;
$this->target = $target;
$this->configurationPass = $configurationPass;
}

public function process(MapperConfigurationInterface $configuration)
{
if ($configuration->getSource() !== $this->source || $configuration->getTarget() !== $this->target) {
return;
}

$this->configurationPass->process($configuration);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Jane\AutoMapper\Bundle\DependencyInjection\Compiler;

use Jane\AutoMapper\Bundle\AutoMapper;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class MapperConfigurationPass implements CompilerPassInterface
{
use PriorityTaggedServiceTrait;

public function process(ContainerBuilder $container)
{
$definition = $container->getDefinition(AutoMapper::class);

foreach ($this->findAndSortTaggedServices('jane_auto_mapper.mapper_configuration', $container) as $mapper) {
$definition->addMethodCall('register', [$mapper]);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Jane\AutoMapper\Bundle\DependencyInjection\Compiler;

use Jane\AutoMapper\Compiler\Transformer\ChainTransformerFactory;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class TransformerFactoryPass implements CompilerPassInterface
{
use PriorityTaggedServiceTrait;

public function process(ContainerBuilder $container)
{
$definition = $container->getDefinition(ChainTransformerFactory::class);

foreach ($this->findAndSortTaggedServices('jane_auto_mapper.transformer_factory', $container) as $factory) {
$definition->addMethodCall('addTransformerFactory', [$factory]);
}
}
}
31 changes: 31 additions & 0 deletions src/AutoMapper/Bundle/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace Jane\AutoMapper\Bundle\DependencyInjection;

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

class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('jane_auto_mapper');

$rootNode
->children()
->booleanNode('private')->end()
->arrayNode('mappings')
->prototype('array')
->children()
->scalarNode('source')->isRequired()->end()
->scalarNode('target')->isRequired()->end()
->scalarNode('pass')->end()
->end()
->end()
->end()
;

return $treeBuilder;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace Jane\AutoMapper\Bundle\DependencyInjection;

use Jane\AutoMapper\Bundle\AutoMapper;
use Jane\AutoMapper\Bundle\Configuration\RestrictConfigurationPass;
use Jane\AutoMapper\Extractor\PrivateReflectionExtractor;
use Jane\AutoMapper\MapperConfiguration;
use Jane\AutoMapper\MapperConfigurationFactory;
use Jane\AutoMapper\MapperConfigurationInterface;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

class JaneAutoMapperExtension extends Extension
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = $this->getConfiguration($configs, $container);
$config = $this->processConfiguration($configuration, $configs);

$container->registerForAutoconfiguration(MapperConfigurationInterface::class)->addTag('jane_auto_mapper.mapper_configuration');

$loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.xml');

foreach ($config['mappings'] as $mapping) {
$this->createMapperConfigurationDefinition($container, $mapping);
}

if ($config['private']) {
$container
->getDefinition(PrivateReflectionExtractor::class)
->addTag('property_info.list_extractor', ['priority' => -500])
->addTag('property_info.access_extractor', ['priority' => -1500])
;
}
}

private function createMapperConfigurationDefinition(ContainerBuilder $container, $config)
{
$serviceName = 'Mapping_' . $config['source'] . '_' . $config['target'];
$definition = $container->register($serviceName, MapperConfiguration::class);
$definition->setFactory([new Reference(MapperConfigurationFactory::class), 'create']);
$definition->addArgument($config['source']);
$definition->addArgument($config['target']);
$definition->addTag('jane_auto_mapper.mapper_configuration');

if (isset($config['pass'])) {
$restrictConfigurationPass = $container->register($serviceName . '_RestrictPass', RestrictConfigurationPass::class);
$restrictConfigurationPass->addArgument($config['source']);
$restrictConfigurationPass->addArgument($config['target']);
$restrictConfigurationPass->addArgument(new Reference($config['pass']));

$definition = $container->getDefinition(AutoMapper::class);
$definition->addMethodCall('addConfigurationPass', [new Reference($serviceName . '_RestrictPass')]);
}
}
}
19 changes: 19 additions & 0 deletions src/AutoMapper/Bundle/JaneAutoMapperBundle.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Jane\AutoMapper\Bundle;

use Jane\AutoMapper\Bundle\DependencyInjection\Compiler\MapperConfigurationPass;
use Jane\AutoMapper\Bundle\DependencyInjection\Compiler\TransformerFactoryPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class JaneAutoMapperBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);

$container->addCompilerPass(new MapperConfigurationPass());
$container->addCompilerPass(new TransformerFactoryPass());
}
}

0 comments on commit 1148064

Please sign in to comment.