Loading core/modules/migrate/src/Plugin/migrate/process/Flatten.php +5 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ namespace Drupal\migrate\Plugin\migrate\process; use Drupal\migrate\MigrateException; use Drupal\migrate\MigrateExecutableInterface; use Drupal\migrate\ProcessPluginBase; use Drupal\migrate\Row; Loading Loading @@ -49,6 +50,10 @@ class Flatten extends ProcessPluginBase { * For example, [[1, 2, [3, 4]]] becomes [1, 2, 3, 4]. */ public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { if (!is_array($value) && !is_object($value)) { $type = gettype($value); throw new MigrateException(sprintf("Input should be an array or an object, instead it was of type '%s'", $type)); } return iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($value)), FALSE); } Loading core/modules/migrate/tests/src/Unit/process/FlattenTest.php +82 −4 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ namespace Drupal\Tests\migrate\Unit\process; use Drupal\migrate\MigrateException; use Drupal\migrate\Plugin\migrate\process\Flatten; /** Loading @@ -11,13 +12,90 @@ */ class FlattenTest extends MigrateProcessTestCase { /** * {@inheritdoc} */ protected function setUp(): void { $this->plugin = new Flatten([], 'flatten', []); parent::setUp(); } /** * Test that various array flatten operations work properly. * * @dataProvider providerTestFlatten */ public function testFlatten($value, $expected) { $flattened = $this->plugin->transform($value, $this->migrateExecutable, $this->row, 'destination_property'); $this->assertSame($expected, $flattened); } /** * Provides data for the testFlatten. */ public function providerTestFlatten() { $object = (object) [ 'a' => 'test', 'b' => '1.2', 'c' => 'NULL', ]; return [ 'array' => [ [1, 2, [3, 4, [5]], [], [7, 8]], [1, 2, 3, 4, 5, 7, 8], ], 'object' => [ $object, ['test', '1.2', 'NULL'], ], ]; } /** * Tests that Flatten throws a MigrateException. * * @dataProvider providerTestFlattenInvalid */ public function testFlattenInvalid($value) { $this->expectException(MigrateException::class); $type = gettype($value); $this->expectExceptionMessage(sprintf("Input should be an array or an object, instead it was of type '%s'", $type)); $this->plugin->transform($value, $this->migrateExecutable, $this->row, 'destination_property'); } /** * Provides data for the testFlattenInvalid. */ public function testFlatten() { $plugin = new Flatten([], 'flatten', []); $flattened = $plugin->transform([1, 2, [3, 4, [5]], [], [7, 8]], $this->migrateExecutable, $this->row, 'destination_property'); $this->assertSame([1, 2, 3, 4, 5, 7, 8], $flattened); public function providerTestFlattenInvalid() { $xml_str = <<<XML <xml version='1.0'?> <authors> <name>Ada Lovelace</name> </authors> XML; return [ 'empty string' => [ '', ], 'string' => [ 'Kate Sheppard', ], 'integer' => [ 1, ], 'float' => [ 1.2, ], 'NULL' => [ NULL, ], 'boolean' => [ TRUE, ], 'xml' => [ $xml_str, ], ]; } } Loading
core/modules/migrate/src/Plugin/migrate/process/Flatten.php +5 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ namespace Drupal\migrate\Plugin\migrate\process; use Drupal\migrate\MigrateException; use Drupal\migrate\MigrateExecutableInterface; use Drupal\migrate\ProcessPluginBase; use Drupal\migrate\Row; Loading Loading @@ -49,6 +50,10 @@ class Flatten extends ProcessPluginBase { * For example, [[1, 2, [3, 4]]] becomes [1, 2, 3, 4]. */ public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { if (!is_array($value) && !is_object($value)) { $type = gettype($value); throw new MigrateException(sprintf("Input should be an array or an object, instead it was of type '%s'", $type)); } return iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($value)), FALSE); } Loading
core/modules/migrate/tests/src/Unit/process/FlattenTest.php +82 −4 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ namespace Drupal\Tests\migrate\Unit\process; use Drupal\migrate\MigrateException; use Drupal\migrate\Plugin\migrate\process\Flatten; /** Loading @@ -11,13 +12,90 @@ */ class FlattenTest extends MigrateProcessTestCase { /** * {@inheritdoc} */ protected function setUp(): void { $this->plugin = new Flatten([], 'flatten', []); parent::setUp(); } /** * Test that various array flatten operations work properly. * * @dataProvider providerTestFlatten */ public function testFlatten($value, $expected) { $flattened = $this->plugin->transform($value, $this->migrateExecutable, $this->row, 'destination_property'); $this->assertSame($expected, $flattened); } /** * Provides data for the testFlatten. */ public function providerTestFlatten() { $object = (object) [ 'a' => 'test', 'b' => '1.2', 'c' => 'NULL', ]; return [ 'array' => [ [1, 2, [3, 4, [5]], [], [7, 8]], [1, 2, 3, 4, 5, 7, 8], ], 'object' => [ $object, ['test', '1.2', 'NULL'], ], ]; } /** * Tests that Flatten throws a MigrateException. * * @dataProvider providerTestFlattenInvalid */ public function testFlattenInvalid($value) { $this->expectException(MigrateException::class); $type = gettype($value); $this->expectExceptionMessage(sprintf("Input should be an array or an object, instead it was of type '%s'", $type)); $this->plugin->transform($value, $this->migrateExecutable, $this->row, 'destination_property'); } /** * Provides data for the testFlattenInvalid. */ public function testFlatten() { $plugin = new Flatten([], 'flatten', []); $flattened = $plugin->transform([1, 2, [3, 4, [5]], [], [7, 8]], $this->migrateExecutable, $this->row, 'destination_property'); $this->assertSame([1, 2, 3, 4, 5, 7, 8], $flattened); public function providerTestFlattenInvalid() { $xml_str = <<<XML <xml version='1.0'?> <authors> <name>Ada Lovelace</name> </authors> XML; return [ 'empty string' => [ '', ], 'string' => [ 'Kate Sheppard', ], 'integer' => [ 1, ], 'float' => [ 1.2, ], 'NULL' => [ NULL, ], 'boolean' => [ TRUE, ], 'xml' => [ $xml_str, ], ]; } }