diff --git a/core/modules/aggregator/migration_templates/d6_aggregator_item.yml b/core/modules/aggregator/migration_templates/d6_aggregator_item.yml index fb4040ab1240..e14dbd60ed59 100644 --- a/core/modules/aggregator/migration_templates/d6_aggregator_item.yml +++ b/core/modules/aggregator/migration_templates/d6_aggregator_item.yml @@ -7,7 +7,7 @@ source: process: iid: iid fid: - plugin: migration + plugin: migration_lookup migration: d6_aggregator_feed source: fid title: title diff --git a/core/modules/aggregator/migration_templates/d7_aggregator_item.yml b/core/modules/aggregator/migration_templates/d7_aggregator_item.yml index 9735e19da21f..054ba439f5db 100644 --- a/core/modules/aggregator/migration_templates/d7_aggregator_item.yml +++ b/core/modules/aggregator/migration_templates/d7_aggregator_item.yml @@ -7,7 +7,7 @@ source: process: iid: iid fid: - plugin: migration + plugin: migration_lookup migration: d7_aggregator_feed source: fid title: title diff --git a/core/modules/block_content/migration_templates/d6_custom_block.yml b/core/modules/block_content/migration_templates/d6_custom_block.yml index 8394c64488b9..55fbcb5c9dc8 100644 --- a/core/modules/block_content/migration_templates/d6_custom_block.yml +++ b/core/modules/block_content/migration_templates/d6_custom_block.yml @@ -8,7 +8,7 @@ process: id: bid info: info 'body/format': - plugin: migration + plugin: migration_lookup migration: d6_filter_format source: format 'body/value': body diff --git a/core/modules/block_content/migration_templates/d7_custom_block.yml b/core/modules/block_content/migration_templates/d7_custom_block.yml index 42021fb2f0e4..ca06cf04f91a 100644 --- a/core/modules/block_content/migration_templates/d7_custom_block.yml +++ b/core/modules/block_content/migration_templates/d7_custom_block.yml @@ -8,7 +8,7 @@ process: id: bid info: info 'body/format': - plugin: migration + plugin: migration_lookup migration: d7_filter_format source: format 'body/value': body diff --git a/core/modules/book/migration_templates/d6_book.yml b/core/modules/book/migration_templates/d6_book.yml index f5020c360416..94d7a8f0c429 100644 --- a/core/modules/book/migration_templates/d6_book.yml +++ b/core/modules/book/migration_templates/d6_book.yml @@ -14,7 +14,7 @@ process: method: process source: plid - - plugin: migration + plugin: migration_lookup migration: d6_book destination: plugin: book diff --git a/core/modules/comment/migration_templates/d6_comment.yml b/core/modules/comment/migration_templates/d6_comment.yml index f4dff98e2902..06820d462a5d 100644 --- a/core/modules/comment/migration_templates/d6_comment.yml +++ b/core/modules/comment/migration_templates/d6_comment.yml @@ -11,7 +11,7 @@ process: # the cid field to allow incremental migrations. cid: cid pid: - plugin: migration + plugin: migration_lookup migration: d6_comment source: pid entity_id: nid @@ -32,7 +32,7 @@ process: thread: thread 'comment_body/value': comment 'comment_body/format': - plugin: migration + plugin: migration_lookup migration: d6_filter_format source: format destination: diff --git a/core/modules/comment/migration_templates/d7_comment.yml b/core/modules/comment/migration_templates/d7_comment.yml index d4e3c57cb1b8..94a28844770c 100644 --- a/core/modules/comment/migration_templates/d7_comment.yml +++ b/core/modules/comment/migration_templates/d7_comment.yml @@ -11,7 +11,7 @@ process: # the cid field to allow incremental migrations. cid: cid pid: - plugin: migration + plugin: migration_lookup migration: d7_comment source: pid entity_id: nid diff --git a/core/modules/contact/migration_templates/d6_contact_settings.yml b/core/modules/contact/migration_templates/d6_contact_settings.yml index 452ebb236416..dbe020581e10 100644 --- a/core/modules/contact/migration_templates/d6_contact_settings.yml +++ b/core/modules/contact/migration_templates/d6_contact_settings.yml @@ -11,7 +11,7 @@ process: user_default_enabled: contact_default_status 'flood/limit': contact_hourly_threshold default_form: - plugin: migration + plugin: migration_lookup migration: contact_category source: default_category destination: diff --git a/core/modules/contact/migration_templates/d7_contact_settings.yml b/core/modules/contact/migration_templates/d7_contact_settings.yml index a0f3a3b51a40..9feebe53090d 100644 --- a/core/modules/contact/migration_templates/d7_contact_settings.yml +++ b/core/modules/contact/migration_templates/d7_contact_settings.yml @@ -11,7 +11,7 @@ process: user_default_enabled: contact_default_status 'flood/limit': contact_threshold_limit default_form: - plugin: migration + plugin: migration_lookup migration: contact_category source: default_category destination: diff --git a/core/modules/field/migration_templates/d6_field_formatter_settings.yml b/core/modules/field/migration_templates/d6_field_formatter_settings.yml index 7496db393174..d60449184bb4 100644 --- a/core/modules/field/migration_templates/d6_field_formatter_settings.yml +++ b/core/modules/field/migration_templates/d6_field_formatter_settings.yml @@ -15,7 +15,7 @@ process: # field migration. field_type_exists: - - plugin: migration + plugin: migration_lookup migration: d6_field source: - field_name @@ -29,7 +29,7 @@ process: entity_type: 'constants/entity_type' bundle: - - plugin: migration + plugin: migration_lookup migration: d6_node_type source: type_name - @@ -37,7 +37,7 @@ process: method: row view_mode: - - plugin: migration + plugin: migration_lookup migration: d6_view_modes source: - view_mode diff --git a/core/modules/field/migration_templates/d6_field_instance.yml b/core/modules/field/migration_templates/d6_field_instance.yml index b5035c2a579b..19343035cba7 100644 --- a/core/modules/field/migration_templates/d6_field_instance.yml +++ b/core/modules/field/migration_templates/d6_field_instance.yml @@ -14,7 +14,7 @@ process: # field migration. field_type_exists: - - plugin: migration + plugin: migration_lookup migration: d6_field source: - field_name @@ -29,7 +29,7 @@ process: field_name: field_name bundle: - - plugin: migration + plugin: migration_lookup migration: d6_node_type source: type_name - diff --git a/core/modules/field/migration_templates/d6_field_instance_widget_settings.yml b/core/modules/field/migration_templates/d6_field_instance_widget_settings.yml index 8b1fb47ca106..90009b7df98e 100644 --- a/core/modules/field/migration_templates/d6_field_instance_widget_settings.yml +++ b/core/modules/field/migration_templates/d6_field_instance_widget_settings.yml @@ -16,7 +16,7 @@ process: # field migration. field_type_exists: - - plugin: migration + plugin: migration_lookup migration: d6_field source: - field_name @@ -29,7 +29,7 @@ process: method: row bundle: - - plugin: migration + plugin: migration_lookup migration: d6_node_type source: type_name - diff --git a/core/modules/field/migration_templates/d7_field_formatter_settings.yml b/core/modules/field/migration_templates/d7_field_formatter_settings.yml index 14cdd661ab3a..126fd29a20b0 100644 --- a/core/modules/field/migration_templates/d7_field_formatter_settings.yml +++ b/core/modules/field/migration_templates/d7_field_formatter_settings.yml @@ -13,7 +13,7 @@ process: # field migration. field_type_exists: - - plugin: migration + plugin: migration_lookup migration: d7_field source: - field_name @@ -29,7 +29,7 @@ process: bundle: bundle view_mode: - - plugin: migration + plugin: migration_lookup migration: d7_view_modes source: - entity_type diff --git a/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml index b5ee41701076..e2bbcf4496d8 100644 --- a/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml +++ b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml @@ -14,7 +14,7 @@ process: # field migration. field_type_exists: - - plugin: migration + plugin: migration_lookup migration: d7_field source: - field_name diff --git a/core/modules/file/migration_templates/d6_upload.yml b/core/modules/file/migration_templates/d6_upload.yml index 75164a89972d..8289d563d364 100644 --- a/core/modules/file/migration_templates/d6_upload.yml +++ b/core/modules/file/migration_templates/d6_upload.yml @@ -13,7 +13,7 @@ process: source: upload process: target_id: - plugin: migration + plugin: migration_lookup migration: d6_file source: fid display: list diff --git a/core/modules/file/migration_templates/d6_upload_field_instance.yml b/core/modules/file/migration_templates/d6_upload_field_instance.yml index 5bd7c9a2c589..732153a0438f 100644 --- a/core/modules/file/migration_templates/d6_upload_field_instance.yml +++ b/core/modules/file/migration_templates/d6_upload_field_instance.yml @@ -13,7 +13,7 @@ process: entity_type: 'constants/entity_type' bundle: - - plugin: migration + plugin: migration_lookup migration: d6_node_type source: node_type - diff --git a/core/modules/forum/migration_templates/d6_forum_settings.yml b/core/modules/forum/migration_templates/d6_forum_settings.yml index 5516848e42a2..18ba8d403f6d 100644 --- a/core/modules/forum/migration_templates/d6_forum_settings.yml +++ b/core/modules/forum/migration_templates/d6_forum_settings.yml @@ -18,7 +18,7 @@ process: 'topics/page_limit': forum_per_page 'topics/order': forum_order vocabulary: - plugin: migration + plugin: migration_lookup migration: d6_taxonomy_vocabulary source: forum_nav_vocabulary destination: diff --git a/core/modules/forum/migration_templates/d7_forum_settings.yml b/core/modules/forum/migration_templates/d7_forum_settings.yml index b84d48598996..086d3e6fc91c 100644 --- a/core/modules/forum/migration_templates/d7_forum_settings.yml +++ b/core/modules/forum/migration_templates/d7_forum_settings.yml @@ -18,7 +18,7 @@ process: 'topics/page_limit': forum_per_page 'topics/order': forum_order vocabulary: - plugin: migration + plugin: migration_lookup migration: d7_taxonomy_vocabulary source: forum_nav_vocabulary destination: diff --git a/core/modules/menu_link_content/migration_templates/d6_menu_links.yml b/core/modules/menu_link_content/migration_templates/d6_menu_links.yml index c418bfebdd29..2c8ad4a45a03 100644 --- a/core/modules/menu_link_content/migration_templates/d6_menu_links.yml +++ b/core/modules/menu_link_content/migration_templates/d6_menu_links.yml @@ -10,7 +10,7 @@ process: description: description menu_name: - - plugin: migration + plugin: migration_lookup # The menu migration is in the system module. migration: d6_menu source: menu_name diff --git a/core/modules/menu_link_content/migration_templates/d7_menu_links.yml b/core/modules/menu_link_content/migration_templates/d7_menu_links.yml index 7f049f7acf77..200a79204791 100644 --- a/core/modules/menu_link_content/migration_templates/d7_menu_links.yml +++ b/core/modules/menu_link_content/migration_templates/d7_menu_links.yml @@ -13,7 +13,7 @@ process: description: description menu_name: - - plugin: migration + plugin: migration_lookup migration: d7_menu source: menu_name - diff --git a/core/modules/migrate/src/Plugin/migrate/process/DefaultValue.php b/core/modules/migrate/src/Plugin/migrate/process/DefaultValue.php index 5829f7473a5f..a5e63888e2e6 100644 --- a/core/modules/migrate/src/Plugin/migrate/process/DefaultValue.php +++ b/core/modules/migrate/src/Plugin/migrate/process/DefaultValue.php @@ -27,7 +27,7 @@ use Drupal\migrate\Row; * process: * uid: * - - * plugin: migration + * plugin: migration_lookup * migration: users * source: author * - diff --git a/core/modules/migrate/src/Plugin/migrate/process/Migration.php b/core/modules/migrate/src/Plugin/migrate/process/Migration.php index e07505ff597a..1b4160a3e32b 100644 --- a/core/modules/migrate/src/Plugin/migrate/process/Migration.php +++ b/core/modules/migrate/src/Plugin/migrate/process/Migration.php @@ -2,16 +2,8 @@ namespace Drupal\migrate\Plugin\migrate\process; -use Drupal\Core\Plugin\ContainerFactoryPluginInterface; -use Drupal\migrate\MigrateSkipProcessException; -use Drupal\migrate\Plugin\MigratePluginManagerInterface; -use Drupal\migrate\Plugin\MigrationPluginManagerInterface; -use Drupal\migrate\Plugin\MigrateIdMapInterface; -use Drupal\migrate\ProcessPluginBase; -use Drupal\migrate\Plugin\MigrationInterface; -use Drupal\migrate\MigrateExecutableInterface; -use Drupal\migrate\Row; -use Symfony\Component\DependencyInjection\ContainerInterface; +@trigger_error('The ' . __NAMESPACE__ . '\Migration is deprecated in +Drupal 8.4.0 and will be removed before Drupal 9.0.0. Instead, use ' . __NAMESPACE__ . '\MigrationLookup', E_USER_DEPRECATED); /** * Calculates the value of a property based on a previous migration. @@ -21,156 +13,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface; * @MigrateProcessPlugin( * id = "migration" * ) + * + * @deprecated in Drupal 8.3.x and will be removed in Drupal 9.0.x. + * Use \Drupal\migrate\Plugin\migrate\process\MigrationLookup instead. */ -class Migration extends ProcessPluginBase implements ContainerFactoryPluginInterface { - - /** - * The process plugin manager. - * - * @var \Drupal\migrate\Plugin\MigratePluginManager - */ - protected $processPluginManager; - - /** - * The migration plugin manager. - * - * @var \Drupal\migrate\Plugin\MigrationPluginManagerInterface - */ - protected $migrationPluginManager; - - /** - * The migration to be executed. - * - * @var \Drupal\migrate\Plugin\MigrationInterface - */ - protected $migration; - - /** - * {@inheritdoc} - */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigrationPluginManagerInterface $migration_plugin_manager, MigratePluginManagerInterface $process_plugin_manager) { - parent::__construct($configuration, $plugin_id, $plugin_definition); - $this->migrationPluginManager = $migration_plugin_manager; - $this->migration = $migration; - $this->processPluginManager = $process_plugin_manager; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $migration, - $container->get('plugin.manager.migration'), - $container->get('plugin.manager.migrate.process') - ); - } - - /** - * {@inheritdoc} - */ - public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { - $migration_ids = $this->configuration['migration']; - if (!is_array($migration_ids)) { - $migration_ids = [$migration_ids]; - } - if (!is_array($value)) { - $value = [$value]; - } - $this->skipOnEmpty($value); - $self = FALSE; - /** @var \Drupal\migrate\Plugin\MigrationInterface[] $migrations */ - $destination_ids = NULL; - $source_id_values = []; - $migrations = $this->migrationPluginManager->createInstances($migration_ids); - foreach ($migrations as $migration_id => $migration) { - if ($migration_id == $this->migration->id()) { - $self = TRUE; - } - if (isset($this->configuration['source_ids'][$migration_id])) { - $configuration = ['source' => $this->configuration['source_ids'][$migration_id]]; - $source_id_values[$migration_id] = $this->processPluginManager - ->createInstance('get', $configuration, $this->migration) - ->transform(NULL, $migrate_executable, $row, $destination_property); - } - else { - $source_id_values[$migration_id] = $value; - } - // Break out of the loop as soon as a destination ID is found. - if ($destination_ids = $migration->getIdMap()->lookupDestinationId($source_id_values[$migration_id])) { - break; - } - } - - if (!$destination_ids && !empty($this->configuration['no_stub'])) { - return NULL; - } - - if (!$destination_ids && ($self || isset($this->configuration['stub_id']) || count($migrations) == 1)) { - // If the lookup didn't succeed, figure out which migration will do the - // stubbing. - if ($self) { - $migration = $this->migration; - } - elseif (isset($this->configuration['stub_id'])) { - $migration = $migrations[$this->configuration['stub_id']]; - } - else { - $migration = reset($migrations); - } - $destination_plugin = $migration->getDestinationPlugin(TRUE); - // Only keep the process necessary to produce the destination ID. - $process = $migration->getProcess(); - - // We already have the source ID values but need to key them for the Row - // constructor. - $source_ids = $migration->getSourcePlugin()->getIds(); - $values = []; - foreach (array_keys($source_ids) as $index => $source_id) { - $values[$source_id] = $source_id_values[$migration->id()][$index]; - } - - $stub_row = new Row($values + $migration->getSourceConfiguration(), $source_ids, TRUE); - - // Do a normal migration with the stub row. - $migrate_executable->processRow($stub_row, $process); - $destination_ids = []; - try { - $destination_ids = $destination_plugin->import($stub_row); - } - catch (\Exception $e) { - $migration->getIdMap()->saveMessage($stub_row->getSourceIdValues(), $e->getMessage()); - } - - if ($destination_ids) { - $migration->getIdMap()->saveIdMapping($stub_row, $destination_ids, MigrateIdMapInterface::STATUS_NEEDS_UPDATE); - } - } - if ($destination_ids) { - if (count($destination_ids) == 1) { - return reset($destination_ids); - } - else { - return $destination_ids; - } - } - } - - /** - * Skips the migration process entirely if the value is FALSE. - * - * @param mixed $value - * The incoming value to transform. - * - * @throws \Drupal\migrate\MigrateSkipProcessException - */ - protected function skipOnEmpty(array $value) { - if (!array_filter($value)) { - throw new MigrateSkipProcessException(); - } - } - -} +class Migration extends MigrationLookup { } diff --git a/core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php b/core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php new file mode 100644 index 000000000000..f387df5233fd --- /dev/null +++ b/core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php @@ -0,0 +1,260 @@ +migrationPluginManager = $migration_plugin_manager; + $this->migration = $migration; + $this->processPluginManager = $process_plugin_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $migration, + $container->get('plugin.manager.migration'), + $container->get('plugin.manager.migrate.process') + ); + } + + /** + * {@inheritdoc} + */ + public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { + $migration_ids = $this->configuration['migration']; + if (!is_array($migration_ids)) { + $migration_ids = [$migration_ids]; + } + if (!is_array($value)) { + $value = [$value]; + } + $this->skipOnEmpty($value); + $self = FALSE; + /** @var \Drupal\migrate\Plugin\MigrationInterface[] $migrations */ + $destination_ids = NULL; + $source_id_values = []; + $migrations = $this->migrationPluginManager->createInstances($migration_ids); + foreach ($migrations as $migration_id => $migration) { + if ($migration_id == $this->migration->id()) { + $self = TRUE; + } + if (isset($this->configuration['source_ids'][$migration_id])) { + $configuration = ['source' => $this->configuration['source_ids'][$migration_id]]; + $source_id_values[$migration_id] = $this->processPluginManager + ->createInstance('get', $configuration, $this->migration) + ->transform(NULL, $migrate_executable, $row, $destination_property); + } + else { + $source_id_values[$migration_id] = $value; + } + // Break out of the loop as soon as a destination ID is found. + if ($destination_ids = $migration->getIdMap()->lookupDestinationId($source_id_values[$migration_id])) { + break; + } + } + + if (!$destination_ids && !empty($this->configuration['no_stub'])) { + return NULL; + } + + if (!$destination_ids && ($self || isset($this->configuration['stub_id']) || count($migrations) == 1)) { + // If the lookup didn't succeed, figure out which migration will do the + // stubbing. + if ($self) { + $migration = $this->migration; + } + elseif (isset($this->configuration['stub_id'])) { + $migration = $migrations[$this->configuration['stub_id']]; + } + else { + $migration = reset($migrations); + } + $destination_plugin = $migration->getDestinationPlugin(TRUE); + // Only keep the process necessary to produce the destination ID. + $process = $migration->getProcess(); + + // We already have the source ID values but need to key them for the Row + // constructor. + $source_ids = $migration->getSourcePlugin()->getIds(); + $values = []; + foreach (array_keys($source_ids) as $index => $source_id) { + $values[$source_id] = $source_id_values[$migration->id()][$index]; + } + + $stub_row = new Row($values + $migration->getSourceConfiguration(), $source_ids, TRUE); + + // Do a normal migration with the stub row. + $migrate_executable->processRow($stub_row, $process); + $destination_ids = []; + try { + $destination_ids = $destination_plugin->import($stub_row); + } + catch (\Exception $e) { + $migration->getIdMap()->saveMessage($stub_row->getSourceIdValues(), $e->getMessage()); + } + + if ($destination_ids) { + $migration->getIdMap()->saveIdMapping($stub_row, $destination_ids, MigrateIdMapInterface::STATUS_NEEDS_UPDATE); + } + } + if ($destination_ids) { + if (count($destination_ids) == 1) { + return reset($destination_ids); + } + else { + return $destination_ids; + } + } + } + + /** + * Skips the migration process entirely if the value is FALSE. + * + * @param mixed $value + * The incoming value to transform. + * + * @throws \Drupal\migrate\MigrateSkipProcessException + */ + protected function skipOnEmpty(array $value) { + if (!array_filter($value)) { + throw new MigrateSkipProcessException(); + } + } + +} diff --git a/core/modules/migrate/tests/modules/migrate_external_translated_test/migrations/migrate.migration.external_translated_test_node_translation.yml b/core/modules/migrate/tests/modules/migrate_external_translated_test/migrations/migrate.migration.external_translated_test_node_translation.yml index ff29084fb911..0363aa20214b 100644 --- a/core/modules/migrate/tests/modules/migrate_external_translated_test/migrations/migrate.migration.external_translated_test_node_translation.yml +++ b/core/modules/migrate/tests/modules/migrate_external_translated_test/migrations/migrate.migration.external_translated_test_node_translation.yml @@ -7,7 +7,7 @@ source: type: external_test process: nid: - plugin: migration + plugin: migration_lookup source: name migration: external_translated_test_node type: constants/type diff --git a/core/modules/migrate/tests/src/Unit/process/MigrationLookupTest.php b/core/modules/migrate/tests/src/Unit/process/MigrationLookupTest.php new file mode 100644 index 000000000000..f30c184458da --- /dev/null +++ b/core/modules/migrate/tests/src/Unit/process/MigrationLookupTest.php @@ -0,0 +1,202 @@ +prophesize(MigrationInterface::class); + $migration_plugin_manager = $this->prophesize(MigrationPluginManagerInterface::class); + $process_plugin_manager = $this->prophesize(MigratePluginManager::class); + + $destination_id_map = $this->prophesize(MigrateIdMapInterface::class); + $destination_migration = $this->prophesize(MigrationInterface::class); + $destination_migration->getIdMap()->willReturn($destination_id_map->reveal()); + $destination_id_map->lookupDestinationId([1])->willReturn(NULL); + + // Ensure the migration plugin manager returns our migration. + $migration_plugin_manager->createInstances(Argument::exact(['destination_migration'])) + ->willReturn(['destination_migration' => $destination_migration->reveal()]); + + $configuration = [ + 'no_stub' => TRUE, + 'migration' => 'destination_migration', + ]; + + $migration_plugin->id()->willReturn('actual_migration'); + $destination_migration->getDestinationPlugin(TRUE)->shouldNotBeCalled(); + + $migration = new MigrationLookup($configuration, '', [], $migration_plugin->reveal(), $migration_plugin_manager->reveal(), $process_plugin_manager->reveal()); + $result = $migration->transform(1, $this->migrateExecutable, $this->row, ''); + $this->assertNull($result); + } + + /** + * @covers ::transform + */ + public function testTransformWithStubbing() { + $migration_plugin = $this->prophesize(MigrationInterface::class); + $migration_plugin_manager = $this->prophesize(MigrationPluginManagerInterface::class); + $process_plugin_manager = $this->prophesize(MigratePluginManager::class); + + $destination_id_map = $this->prophesize(MigrateIdMapInterface::class); + $destination_migration = $this->prophesize('Drupal\migrate\Plugin\Migration'); + $destination_migration->getIdMap()->willReturn($destination_id_map->reveal()); + $migration_plugin_manager->createInstances(['destination_migration']) + ->willReturn(['destination_migration' => $destination_migration->reveal()]); + $destination_id_map->lookupDestinationId([1])->willReturn(NULL); + $destination_id_map->saveIdMapping(Argument::any(), Argument::any(), MigrateIdMapInterface::STATUS_NEEDS_UPDATE)->willReturn(NULL); + + $configuration = [ + 'no_stub' => FALSE, + 'migration' => 'destination_migration', + ]; + + $migration_plugin->id()->willReturn('actual_migration'); + $destination_migration->id()->willReturn('destination_migration'); + $destination_migration->getDestinationPlugin(TRUE)->shouldBeCalled(); + $destination_migration->getProcess()->willReturn([]); + $destination_migration->getSourceConfiguration()->willReturn([]); + + $source_plugin = $this->prophesize(MigrateSourceInterface::class); + $source_plugin->getIds()->willReturn(['nid']); + $destination_migration->getSourcePlugin()->willReturn($source_plugin->reveal()); + $destination_plugin = $this->prophesize(MigrateDestinationInterface::class); + $destination_plugin->import(Argument::any())->willReturn([2]); + $destination_migration->getDestinationPlugin(TRUE)->willReturn($destination_plugin->reveal()); + + $migration = new MigrationLookup($configuration, '', [], $migration_plugin->reveal(), $migration_plugin_manager->reveal(), $process_plugin_manager->reveal()); + $result = $migration->transform(1, $this->migrateExecutable, $this->row, ''); + $this->assertEquals(2, $result); + } + + /** + * Tests that processing is skipped when the input value is empty. + */ + public function testSkipOnEmpty() { + $migration_plugin = $this->prophesize(MigrationInterface::class); + $migration_plugin_manager = $this->prophesize(MigrationPluginManagerInterface::class); + $process_plugin_manager = $this->prophesize(MigratePluginManager::class); + + $configuration = [ + 'migration' => 'foobaz', + ]; + $migration_plugin->id()->willReturn(uniqid()); + $migration = new MigrationLookup($configuration, 'migration_lookup', [], $migration_plugin->reveal(), $migration_plugin_manager->reveal(), $process_plugin_manager->reveal()); + $this->setExpectedException(MigrateSkipProcessException::class); + $migration->transform(0, $this->migrateExecutable, $this->row, 'foo'); + } + + /** + * Tests a successful lookup. + * + * @dataProvider successfulLookupDataProvider + * + * @param array $source_id_values + * The source id(s) of the migration map. + * @param array $destination_id_values + * The destination id(s) of the migration map. + * @param string|array $source_value + * The source value(s) for the migration process plugin. + * @param string|array $expected_value + * The expected value(s) of the migration process plugin. + */ + public function testSuccessfulLookup($source_id_values, $destination_id_values, $source_value, $expected_value) { + $migration_plugin = $this->prophesize(MigrationInterface::class); + $migration_plugin_manager = $this->prophesize(MigrationPluginManagerInterface::class); + $process_plugin_manager = $this->prophesize(MigratePluginManager::class); + + $configuration = [ + 'migration' => 'foobaz', + ]; + $migration_plugin->id()->willReturn(uniqid()); + + $id_map = $this->prophesize(MigrateIdMapInterface::class); + $id_map->lookupDestinationId($source_id_values)->willReturn($destination_id_values); + $migration_plugin->getIdMap()->willReturn($id_map->reveal()); + + $migration_plugin_manager->createInstances(['foobaz']) + ->willReturn(['foobaz' => $migration_plugin->reveal()]); + + $migrationStorage = $this->prophesize(EntityStorageInterface::class); + $migrationStorage + ->loadMultiple(['foobaz']) + ->willReturn([$migration_plugin->reveal()]); + + $migration = new MigrationLookup($configuration, 'migration_lookup', [], $migration_plugin->reveal(), $migration_plugin_manager->reveal(), $process_plugin_manager->reveal()); + $this->assertSame($expected_value, $migration->transform($source_value, $this->migrateExecutable, $this->row, 'foo')); + } + + /** + * Provides data for the successful lookup test. + * + * @return array + */ + public function successfulLookupDataProvider() { + return [ + // Test data for scalar to scalar. + [ + // Source ID of the migration map. + [1], + // Destination ID of the migration map. + [3], + // Input value for the migration plugin. + 1, + // Expected output value of the migration plugin. + 3, + ], + // Test data for scalar to array. + [ + // Source ID of the migration map. + [1], + // Destination IDs of the migration map. + [3, 'foo'], + // Input value for the migration plugin. + 1, + // Expected output values of the migration plugin. + [3, 'foo'], + ], + // Test data for array to scalar. + [ + // Source IDs of the migration map. + [1, 3], + // Destination ID of the migration map. + ['foo'], + // Input values for the migration plugin. + [1, 3], + // Expected output value of the migration plugin. + 'foo', + ], + // Test data for array to array. + [ + // Source IDs of the migration map. + [1, 3], + // Destination IDs of the migration map. + [3, 'foo'], + // Input values for the migration plugin. + [1, 3], + // Expected output values of the migration plugin. + [3, 'foo'], + ], + ]; + } + +} diff --git a/core/modules/migrate/tests/src/Unit/process/MigrationTest.php b/core/modules/migrate/tests/src/Unit/process/MigrationTest.php index b571ba618fc4..843d1e558b5d 100644 --- a/core/modules/migrate/tests/src/Unit/process/MigrationTest.php +++ b/core/modules/migrate/tests/src/Unit/process/MigrationTest.php @@ -2,6 +2,9 @@ namespace Drupal\Tests\migrate\Unit\process; +@trigger_error('The ' . __NAMESPACE__ . '\MigrationTest is deprecated in +Drupal 8.4.0 and will be removed before Drupal 9.0.0. Instead, use ' . __NAMESPACE__ . '\MigrationLookupTest', E_USER_DEPRECATED); + use Drupal\Core\Entity\EntityStorageInterface; use Drupal\migrate\MigrateSkipProcessException; use Drupal\migrate\Plugin\MigrationInterface; @@ -14,6 +17,9 @@ use Drupal\migrate\Plugin\MigrationPluginManagerInterface; use Prophecy\Argument; /** + * @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x. Use + * \Drupal\Tests\migrate\Unit\process\MigrationLookupTest instead. + * * @coversDefaultClass \Drupal\migrate\Plugin\migrate\process\Migration * @group migrate */ diff --git a/core/modules/node/migration_templates/d6_node.yml b/core/modules/node/migration_templates/d6_node.yml index 4e19bb407f7d..56d0459a8126 100644 --- a/core/modules/node/migration_templates/d6_node.yml +++ b/core/modules/node/migration_templates/d6_node.yml @@ -25,7 +25,7 @@ process: promote: promote sticky: sticky 'body/format': - plugin: migration + plugin: migration_lookup migration: d6_filter_format source: format 'body/value': body diff --git a/core/modules/node/migration_templates/d6_node_revision.yml b/core/modules/node/migration_templates/d6_node_revision.yml index 046e9bbe4c56..f4ff3011c41b 100644 --- a/core/modules/node/migration_templates/d6_node_revision.yml +++ b/core/modules/node/migration_templates/d6_node_revision.yml @@ -22,7 +22,7 @@ process: promote: promote sticky: sticky 'body/format': - plugin: migration + plugin: migration_lookup migration: d6_filter_format source: format 'body/value': body diff --git a/core/modules/node/migration_templates/d6_node_translation.yml b/core/modules/node/migration_templates/d6_node_translation.yml index 3b923d181ddb..3eb06e8a7d7a 100644 --- a/core/modules/node/migration_templates/d6_node_translation.yml +++ b/core/modules/node/migration_templates/d6_node_translation.yml @@ -23,7 +23,7 @@ process: promote: promote sticky: sticky 'body/format': - plugin: migration + plugin: migration_lookup migration: d6_filter_format source: format 'body/value': body diff --git a/core/modules/path/migration_templates/d6_url_alias.yml b/core/modules/path/migration_templates/d6_url_alias.yml index 968b1e694a03..fcf20364056e 100644 --- a/core/modules/path/migration_templates/d6_url_alias.yml +++ b/core/modules/path/migration_templates/d6_url_alias.yml @@ -30,7 +30,7 @@ process: index: - 1 - - plugin: migration + plugin: migration_lookup migration: d6_node_translation destination: plugin: url_alias diff --git a/core/modules/path/migration_templates/d7_url_alias.yml b/core/modules/path/migration_templates/d7_url_alias.yml index 713a34676f7f..dffaf46825d1 100644 --- a/core/modules/path/migration_templates/d7_url_alias.yml +++ b/core/modules/path/migration_templates/d7_url_alias.yml @@ -28,7 +28,7 @@ process: index: - 1 - - plugin: migration + plugin: migration_lookup migration: d7_node_translation destination: plugin: url_alias diff --git a/core/modules/shortcut/migration_templates/d7_shortcut.yml b/core/modules/shortcut/migration_templates/d7_shortcut.yml index da3d894940ff..dac935433821 100644 --- a/core/modules/shortcut/migration_templates/d7_shortcut.yml +++ b/core/modules/shortcut/migration_templates/d7_shortcut.yml @@ -8,7 +8,7 @@ source: uri_scheme: 'internal:/' process: shortcut_set: - plugin: migration + plugin: migration_lookup migration: d7_shortcut_set source: menu_name title: link_title diff --git a/core/modules/shortcut/migration_templates/d7_shortcut_set_users.yml b/core/modules/shortcut/migration_templates/d7_shortcut_set_users.yml index a93c4bbab0ca..d0eb219962d6 100644 --- a/core/modules/shortcut/migration_templates/d7_shortcut_set_users.yml +++ b/core/modules/shortcut/migration_templates/d7_shortcut_set_users.yml @@ -7,14 +7,14 @@ source: process: uid: - - plugin: migration + plugin: migration_lookup migration: d7_user source: uid - plugin: skip_on_empty method: row set_name: - plugin: migration + plugin: migration_lookup migration: d7_shortcut_set source: set_name destination: diff --git a/core/modules/taxonomy/migration_templates/d6_taxonomy_term.yml b/core/modules/taxonomy/migration_templates/d6_taxonomy_term.yml index e5630fc62f78..e3c3e3d3420b 100644 --- a/core/modules/taxonomy/migration_templates/d6_taxonomy_term.yml +++ b/core/modules/taxonomy/migration_templates/d6_taxonomy_term.yml @@ -9,7 +9,7 @@ process: # the tid field to allow incremental migrations. tid: tid vid: - plugin: migration + plugin: migration_lookup migration: d6_taxonomy_vocabulary source: vid name: name @@ -22,7 +22,7 @@ process: method: process source: parent - - plugin: migration + plugin: migration_lookup migration: d6_taxonomy_term parent: plugin: default_value diff --git a/core/modules/taxonomy/migration_templates/d6_term_node.yml b/core/modules/taxonomy/migration_templates/d6_term_node.yml index 63aec8563f5d..846334d4b9ca 100644 --- a/core/modules/taxonomy/migration_templates/d6_term_node.yml +++ b/core/modules/taxonomy/migration_templates/d6_term_node.yml @@ -8,7 +8,7 @@ source: process: nid: - - plugin: migration + plugin: migration_lookup migration: d6_node source: nid - diff --git a/core/modules/taxonomy/migration_templates/d6_term_node_revision.yml b/core/modules/taxonomy/migration_templates/d6_term_node_revision.yml index cf1c6829040a..91c8362e63b8 100644 --- a/core/modules/taxonomy/migration_templates/d6_term_node_revision.yml +++ b/core/modules/taxonomy/migration_templates/d6_term_node_revision.yml @@ -8,7 +8,7 @@ source: process: vid: - - plugin: migration + plugin: migration_lookup migration: d6_node source: vid - diff --git a/core/modules/taxonomy/migration_templates/d6_vocabulary_entity_display.yml b/core/modules/taxonomy/migration_templates/d6_vocabulary_entity_display.yml index e8d04c0c6f7b..3c52a2fb04b1 100644 --- a/core/modules/taxonomy/migration_templates/d6_vocabulary_entity_display.yml +++ b/core/modules/taxonomy/migration_templates/d6_vocabulary_entity_display.yml @@ -17,7 +17,7 @@ process: options: 'constants/options' bundle: type field_name: - plugin: migration + plugin: migration_lookup migration: d6_taxonomy_vocabulary source: vid destination: diff --git a/core/modules/taxonomy/migration_templates/d6_vocabulary_entity_form_display.yml b/core/modules/taxonomy/migration_templates/d6_vocabulary_entity_form_display.yml index 2608877e9d5e..160f68c34c03 100644 --- a/core/modules/taxonomy/migration_templates/d6_vocabulary_entity_form_display.yml +++ b/core/modules/taxonomy/migration_templates/d6_vocabulary_entity_form_display.yml @@ -21,7 +21,7 @@ process: options/weight: 'constants/options/weight' bundle: type field_name: - plugin: migration + plugin: migration_lookup migration: d6_taxonomy_vocabulary source: vid destination: diff --git a/core/modules/taxonomy/migration_templates/d6_vocabulary_field.yml b/core/modules/taxonomy/migration_templates/d6_vocabulary_field.yml index 0e1a48728804..082386fdffa6 100644 --- a/core/modules/taxonomy/migration_templates/d6_vocabulary_field.yml +++ b/core/modules/taxonomy/migration_templates/d6_vocabulary_field.yml @@ -13,7 +13,7 @@ process: type: 'constants/type' field_name: - - plugin: migration + plugin: migration_lookup migration: d6_taxonomy_vocabulary source: vid - diff --git a/core/modules/taxonomy/migration_templates/d6_vocabulary_field_instance.yml b/core/modules/taxonomy/migration_templates/d6_vocabulary_field_instance.yml index a7bbbbbc42cc..a3afd9b9458b 100644 --- a/core/modules/taxonomy/migration_templates/d6_vocabulary_field_instance.yml +++ b/core/modules/taxonomy/migration_templates/d6_vocabulary_field_instance.yml @@ -13,7 +13,7 @@ process: bundle: type field_name: - - plugin: migration + plugin: migration_lookup migration: d6_taxonomy_vocabulary source: vid - diff --git a/core/modules/taxonomy/migration_templates/d7_taxonomy_term.yml b/core/modules/taxonomy/migration_templates/d7_taxonomy_term.yml index af8518006e2e..99004dfed6b7 100644 --- a/core/modules/taxonomy/migration_templates/d7_taxonomy_term.yml +++ b/core/modules/taxonomy/migration_templates/d7_taxonomy_term.yml @@ -10,7 +10,7 @@ process: # the tid field to allow incremental migrations. tid: tid vid: - plugin: migration + plugin: migration_lookup migration: d7_taxonomy_vocabulary source: vid name: name @@ -24,7 +24,7 @@ process: method: process source: parent - - plugin: migration + plugin: migration_lookup migration: d7_taxonomy_term parent: plugin: default_value diff --git a/core/modules/taxonomy/tests/modules/taxonomy_term_stub_test/migrations/taxonomy_term_stub_test.yml b/core/modules/taxonomy/tests/modules/taxonomy_term_stub_test/migrations/taxonomy_term_stub_test.yml index ad56fff023e6..4c3cd86710d6 100644 --- a/core/modules/taxonomy/tests/modules/taxonomy_term_stub_test/migrations/taxonomy_term_stub_test.yml +++ b/core/modules/taxonomy/tests/modules/taxonomy_term_stub_test/migrations/taxonomy_term_stub_test.yml @@ -19,7 +19,7 @@ process: name: name weight: weight parent: - plugin: migration + plugin: migration_lookup migration: taxonomy_term_stub_test source: parent destination: diff --git a/core/modules/user/migration_templates/d6_user.yml b/core/modules/user/migration_templates/d6_user.yml index c82c65750981..d58607b1507c 100644 --- a/core/modules/user/migration_templates/d6_user.yml +++ b/core/modules/user/migration_templates/d6_user.yml @@ -32,11 +32,11 @@ process: fallback_to_site_default: true init: init roles: - plugin: migration + plugin: migration_lookup migration: d6_user_role source: roles user_picture: - plugin: migration + plugin: migration_lookup migration: d6_user_picture_file source: uid no_stub: true diff --git a/core/modules/user/migration_templates/d7_user.yml b/core/modules/user/migration_templates/d7_user.yml index d68e2971e777..ae523844b122 100644 --- a/core/modules/user/migration_templates/d7_user.yml +++ b/core/modules/user/migration_templates/d7_user.yml @@ -31,7 +31,7 @@ process: fallback_to_site_default: true init: init roles: - plugin: migration + plugin: migration_lookup migration: d7_user_role source: roles user_picture: @@ -40,7 +40,7 @@ process: source: picture default_value: null - - plugin: migration + plugin: migration_lookup migration: d7_file destination: plugin: entity:user