From 6950bcaa5e109a6dc789600a666bbba8d4fdf10d Mon Sep 17 00:00:00 2001 From: jwage <jwage@625475ce-881a-0410-a577-b389adb331d8> Date: Wed, 17 Mar 2010 22:33:25 +0000 Subject: [PATCH] [2.0] Extracting Doctrine 1 schema conversion from orm:convert-mapping task to a orm:convert-d1-schema task --- lib/Doctrine/Common/Cli/CliController.php | 3 +- .../Cli/Tasks/ConvertDoctrine1SchemaTask.php | 111 ++++++++++++++++++ .../Tools/Cli/Tasks/ConvertMappingTask.php | 61 +++------- 3 files changed, 132 insertions(+), 43 deletions(-) create mode 100644 lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertDoctrine1SchemaTask.php diff --git a/lib/Doctrine/Common/Cli/CliController.php b/lib/Doctrine/Common/Cli/CliController.php index 5bb26de4b..3e55bbd53 100644 --- a/lib/Doctrine/Common/Cli/CliController.php +++ b/lib/Doctrine/Common/Cli/CliController.php @@ -82,7 +82,8 @@ class CliController extends AbstractNamespace ->addTask('generate-proxies', $ns . '\GenerateProxiesTask') ->addTask('run-dql', $ns . '\RunDqlTask') ->addTask('schema-tool', $ns . '\SchemaToolTask') - ->addTask('version', $ns . '\VersionTask'); + ->addTask('version', $ns . '\VersionTask') + ->addTask('convert-d1-schema', $ns . '\ConvertDoctrine1SchemaTask'); $ns = 'Doctrine\DBAL\Tools\Cli\Tasks'; $this->addNamespace('Dbal') diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertDoctrine1SchemaTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertDoctrine1SchemaTask.php new file mode 100644 index 000000000..894f95e7c --- /dev/null +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertDoctrine1SchemaTask.php @@ -0,0 +1,111 @@ +<?php +/* + * $Id$ + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software consists of voluntary contributions made by many individuals + * and is licensed under the LGPL. For more information, see + * <http://www.doctrine-project.org>. + */ + +namespace Doctrine\ORM\Tools\Cli\Tasks; + +use Doctrine\Common\Cli\Tasks\AbstractTask, + Doctrine\ORM\Tools\Export\ClassMetadataExporter, + Doctrine\Common\Cli\CliException, + Doctrine\Common\Cli\Option, + Doctrine\Common\Cli\OptionGroup, + Doctrine\ORM\Tools\ConvertDoctrine1Schema; + +/** + * CLI Task to convert a Doctrine 1 schema to a Doctrine 2 mapping file + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei <kontakt@beberlei.de> + * @author Guilherme Blanco <guilhermeblanco@hotmail.com> + * @author Jonathan Wage <jonwage@gmail.com> + * @author Roman Borschel <roman@code-factory.org> + */ +class ConvertDoctrine1SchemaTask extends AbstractTask +{ + /** + * @inheritdoc + */ + public function buildDocumentation() + { + $options = new OptionGroup(OptionGroup::CARDINALITY_N_N, array( + new Option('from', '<FROM>', 'The path to the Doctrine 1 schema.'), + new Option('to', '<TO>', 'The Doctrine 2 mapping format to convert to.'), + new Option('dest', '<DEST>', 'The path to export the converted schema.') + )); + + $doc = $this->getDocumentation(); + $doc->setName('convert-10-schema') + ->setDescription('Displays the current installed Doctrine version.') + ->getOptionGroup() + ->addOption($options); + } + + /** + * @inheritdoc + */ + public function validate() + { + $arguments = $this->getArguments(); + $em = $this->getConfiguration()->getAttribute('em'); + + if ( ! isset($arguments['from']) || ! isset($arguments['to']) || ! isset($arguments['dest'])) { + throw new CliException('You must specify a value for --from, --to and --dest'); + } + + return true; + } + + public function run() + { + $arguments = $this->getArguments(); + $printer = $this->getPrinter(); + + $printer->writeln(sprintf( + 'Converting Doctrine 1 schema at "%s" to the "%s" format', + $printer->format($arguments['from'], 'KEYWORD'), + $printer->format($arguments['to'], 'KEYWORD') + ) + ); + + $cme = new ClassMetadataExporter(); + $exporter = $cme->getExporter($arguments['to'], $arguments['dest']); + + $converter = new ConvertDoctrine1Schema($arguments['from']); + $metadatas = $converter->getMetadatasFromSchema(); + + foreach ($metadatas as $metadata) { + $printer->writeln( + sprintf('Processing entity "%s"', $printer->format($metadata->name, 'KEYWORD')) + ); + } + + $exporter->setMetadatas($metadatas); + $exporter->export(); + + $printer->writeln(sprintf( + 'Writing Doctrine 2 mapping files to "%s"', + $printer->format($arguments['dest'], 'KEYWORD') + ) + ); + } +} \ No newline at end of file diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertMappingTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertMappingTask.php index 61d63cf8f..6e6e3ab7f 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertMappingTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertMappingTask.php @@ -129,36 +129,29 @@ class ConvertMappingTask extends AbstractTask $from = (array) $arguments['from']; - if ($this->_isDoctrine1Schema($from)) { - $printer->writeln('Converting Doctrine 1 schema to Doctrine 2 mapping files', 'INFO'); - - $converter = new \Doctrine\ORM\Tools\ConvertDoctrine1Schema($from); - $metadatas = $converter->getMetadatasFromSchema(); - } else { - foreach ($from as $source) { - $sourceArg = $source; - $type = $this->_determineSourceType($sourceArg); - - if ( ! $type) { - throw new CliException( - "Invalid mapping source type '$sourceArg'." - ); - } - - $source = $this->_getSourceByType($type, $sourceArg); - - $printer->writeln( - sprintf( - 'Adding "%s" mapping source which contains the "%s" format', - $printer->format($sourceArg, 'KEYWORD'), $printer->format($type, 'KEYWORD') - ) + foreach ($from as $source) { + $sourceArg = $source; + $type = $this->_determineSourceType($sourceArg); + + if ( ! $type) { + throw new CliException( + "Invalid mapping source type '$sourceArg'." ); - - $cme->addMappingSource($source, $type); } - $metadatas = $cme->getMetadatasForMappingSources(); + $source = $this->_getSourceByType($type, $sourceArg); + + $printer->writeln( + sprintf( + 'Adding "%s" mapping source which contains the "%s" format', + $printer->format($sourceArg, 'KEYWORD'), $printer->format($type, 'KEYWORD') + ) + ); + + $cme->addMappingSource($source, $type); } + + $metadatas = $cme->getMetadatasForMappingSources(); foreach ($metadatas as $metadata) { $printer->writeln( @@ -178,22 +171,6 @@ class ConvertMappingTask extends AbstractTask $exporter->export(); } - private function _isDoctrine1Schema(array $from) - { - $files = glob(current($from) . '/*.yml'); - - if ($files) { - $array = \Symfony\Components\Yaml\Yaml::load($files[0]); - $first = current($array); - - // We're dealing with a Doctrine 1 schema if you have - // a columns index in the first model array - return isset($first['columns']); - } else { - return false; - } - } - private function _determineSourceType($source) { // If the --from=<VALUE> is a directory lets determine if it is