From 550c6aac102a253529b86140b92168c515f33000 Mon Sep 17 00:00:00 2001 From: Dom Morgan Date: Wed, 25 May 2016 11:12:46 +0100 Subject: [PATCH 1/5] Replace old classes with a legacy extension --- src/Namespacer/Controller/Controller.php | 3 ++ src/Namespacer/Model/Map.php | 14 ++++++++- src/Namespacer/Model/Transformer.php | 40 +++++++++++++++++++++++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/Namespacer/Controller/Controller.php b/src/Namespacer/Controller/Controller.php index 5cbf2aa..7614cc0 100644 --- a/src/Namespacer/Controller/Controller.php +++ b/src/Namespacer/Controller/Controller.php @@ -35,6 +35,9 @@ public function transformAction() $transformer = new Transformer($map); switch ($step) { + case '4': + $transformer->modifyOriginalContentForExtension(); + break; case '3': $transformer->modifyContentForUseStatements(); break; diff --git a/src/Namespacer/Model/Map.php b/src/Namespacer/Model/Map.php index e1d0493..6faedd4 100644 --- a/src/Namespacer/Model/Map.php +++ b/src/Namespacer/Model/Map.php @@ -53,6 +53,18 @@ public function getNewFiles() return $data; } + public function getExtensionMap() + { + $data = array(); + foreach ($this->mapData as $item) { + $data[$item['original_file']] = array( + 'extends' => $item['new_namespace'] . '\\' . $item['new_class'], + 'class' => $item['original_class'] + ); + } + return $data; + } + public function getClassTransformations() { $data = array(); @@ -61,4 +73,4 @@ public function getClassTransformations() } return $data; } -} \ No newline at end of file +} diff --git a/src/Namespacer/Model/Transformer.php b/src/Namespacer/Model/Transformer.php index 285363c..8dc95c1 100644 --- a/src/Namespacer/Model/Transformer.php +++ b/src/Namespacer/Model/Transformer.php @@ -27,7 +27,7 @@ public function moveFiles() if (!file_exists($newDir)) { mkdir($newDir, 0777, true); } - rename($old, $new . '.transform'); + copy($old, $new . '.transform'); } foreach ($fileRenamings as $new) { if (file_exists($new . '.transform')) { @@ -47,6 +47,17 @@ public function modifyNamespaceAndClassNames() } } + public function modifyOriginalContentForExtension() + { + $extensionMap = $this->map->getExtensionMap(); + foreach ($extensionMap as $file => $extends) { + if (!file_exists($file)) { + throw new \RuntimeException('The file ' . $file . ' could not be found in the filesystem, check your map file is correct.'); + } + $this->modifyOriginalFileforExtension($file, $extends); + } + } + public function modifyContentForUseStatements() { $files = $this->map->getNewFiles(); @@ -103,6 +114,33 @@ protected function modifyFileWithNewNamespaceAndClass($file, $names) file_put_contents($file, $contents); } + protected function modifyOriginalFileforExtension($file, $names) + { + $tokens = token_get_all(file_get_contents($file)); + + $contents = ''; + $token = reset($tokens); + do { + if (T_TRAIT === $token[0]) { + $contents .= $token[1] . ' ' . $names['class']; + $contents .= "\n{\n"; + $contents .= " use \\" . $names['extends'] . ";"; + $contents .= "\n}\n"; + break; + } + if ($this->isClass($token[0])) { + $contents .= $token[1] . ' ' . $names['class']; + $contents .= " extends \\" . $names['extends']; + $contents .= "\n{\n}\n"; + break; + } else { + $contents .= (is_array($token)) ? $token[1] : $token; + } + } while ($token = next($tokens)); + + file_put_contents($file, $contents); + } + protected function modifyFileWithNewUseStatements($file, $classTransformations) { $tokens = token_get_all(file_get_contents($file)); From c1d495ece97a9fe89e6973c216f4234466480705 Mon Sep 17 00:00:00 2001 From: Dom Morgan Date: Wed, 25 May 2016 18:05:27 +0100 Subject: [PATCH 2/5] Create a legacy map action that adds in extended classes with the old names --- src/Namespacer/Controller/Controller.php | 15 ++++-- src/Namespacer/Model/LegacyExtension.php | 58 ++++++++++++++++++++++++ src/Namespacer/Model/Map.php | 12 +++-- src/Namespacer/Model/Transformer.php | 4 +- 4 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 src/Namespacer/Model/LegacyExtension.php diff --git a/src/Namespacer/Controller/Controller.php b/src/Namespacer/Controller/Controller.php index 7614cc0..d15797a 100644 --- a/src/Namespacer/Controller/Controller.php +++ b/src/Namespacer/Controller/Controller.php @@ -10,6 +10,7 @@ use Namespacer\Model\Map; use Namespacer\Model\Mapper; use Namespacer\Model\Transformer; +use Namespacer\Model\LegacyExtension; use Zend\Mvc\Controller\AbstractActionController; class Controller extends AbstractActionController @@ -35,9 +36,6 @@ public function transformAction() $transformer = new Transformer($map); switch ($step) { - case '4': - $transformer->modifyOriginalContentForExtension(); - break; case '3': $transformer->modifyContentForUseStatements(); break; @@ -55,6 +53,17 @@ public function transformAction() } } + public function legacyExtensionAction() + { + $mapfile = $this->params()->fromRoute('mapfile'); + $target = $this->params()->fromRoute('target'); + $data = include $mapfile; + $map = new Map($data); + $transformer = new LegacyExtension($map); + + $transformer->createLegacyClasses($target); + } + public function fixAction() { $mapfile = $this->params()->fromRoute('mapfile'); diff --git a/src/Namespacer/Model/LegacyExtension.php b/src/Namespacer/Model/LegacyExtension.php new file mode 100644 index 0000000..a2825ef --- /dev/null +++ b/src/Namespacer/Model/LegacyExtension.php @@ -0,0 +1,58 @@ +map = $map; + } + + public function createLegacyClasses($directory = false) + { + $fileRenamings = $this->map->getExtensionMap($directory); + + foreach ($fileRenamings as $legacyPath => $data) { + $legacyDir = dirname($legacyPath); + if (!file_exists($legacyDir)) { + mkdir($legacyDir, 0777, true); + } + touch($legacyPath); + + $this->createLegacyFile($legacyPath, $data); + } + } + + protected function createLegacyFile($file, $data) + { + $tokens = token_get_all(file_get_contents($data['original_file'])); + + $contents = ''; + $token = reset($tokens); + do { + if (T_TRAIT === $token[0]) { + $contents .= $token[1] . ' ' . $data['class']; + $contents .= "\n{\n"; + $contents .= " use \\" . $data['extends'] . ";"; + $contents .= "\n}\n"; + break; + } + if (T_CLASS === $token[0] || T_INTERFACE === $token[0]) { + $contents .= $token[1] . ' ' . $data['class']; + $contents .= " extends \\" . $data['extends']; + $contents .= "\n{\n}\n"; + break; + } else { + $contents .= (is_array($token)) ? $token[1] : $token; + } + } while ($token = next($tokens)); + + file_put_contents($file, $contents); + } +} diff --git a/src/Namespacer/Model/Map.php b/src/Namespacer/Model/Map.php index 6faedd4..9f79b97 100644 --- a/src/Namespacer/Model/Map.php +++ b/src/Namespacer/Model/Map.php @@ -53,13 +53,19 @@ public function getNewFiles() return $data; } - public function getExtensionMap() + public function getExtensionMap($directory = false) { $data = array(); foreach ($this->mapData as $item) { - $data[$item['original_file']] = array( + if ($directory) { + $file = str_replace($item['root_directory'], $directory, $item['original_file']); + } else { + $file = $item['original_file']; + } + $data[$file] = array( 'extends' => $item['new_namespace'] . '\\' . $item['new_class'], - 'class' => $item['original_class'] + 'class' => $item['original_class'], + 'original_file' => $item['original_file'] ); } return $data; diff --git a/src/Namespacer/Model/Transformer.php b/src/Namespacer/Model/Transformer.php index 8dc95c1..2e16a07 100644 --- a/src/Namespacer/Model/Transformer.php +++ b/src/Namespacer/Model/Transformer.php @@ -126,13 +126,13 @@ protected function modifyOriginalFileforExtension($file, $names) $contents .= "\n{\n"; $contents .= " use \\" . $names['extends'] . ";"; $contents .= "\n}\n"; - break; + break 2; } if ($this->isClass($token[0])) { $contents .= $token[1] . ' ' . $names['class']; $contents .= " extends \\" . $names['extends']; $contents .= "\n{\n}\n"; - break; + break 2; } else { $contents .= (is_array($token)) ? $token[1] : $token; } From a90abeef5e548823a9974b28189b6f978df6234c Mon Sep 17 00:00:00 2001 From: Dom Morgan Date: Wed, 25 May 2016 18:05:44 +0100 Subject: [PATCH 3/5] Add legacy route --- config/module.config.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config/module.config.php b/config/module.config.php index 566309c..686aa5a 100644 --- a/config/module.config.php +++ b/config/module.config.php @@ -59,6 +59,15 @@ ), ), ), + 'namespacer-legacy' => array( + 'options' => array( + 'route' => 'legacy [--mapfile=] [--target=]', + 'defaults' => array( + 'controller' => 'Namespacer\Controller\Controller', + 'action' => 'legacyExtension', + ), + ), + ), ), ), ), From d9f881813e3cc523721375af5f3f68c0b70cfc5d Mon Sep 17 00:00:00 2001 From: Dom Morgan Date: Wed, 25 May 2016 18:06:39 +0100 Subject: [PATCH 4/5] Update readme --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dbbb1e0..025fc45 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ be done in place, so it is best to either do this in a separate copy of the code, or on top of a git repository where you can easily reset --hard if you need to. -**Download**: https://github.com/zendframework/Namespacer/blob/master/namespacer.phar?raw=true +**Download**: https://github.com/dmnc/Namespacer/blob/master/namespacer.phar?raw=true * First, create a map file: @@ -20,8 +20,19 @@ if you need to. namespacer.phar map --mapfile types.php --source path/to/src ``` -* Second, transform the types located in the map file: +* Second, if you want to maintain legacy classes extending your new ones: + + ``` + namespacer.phar legacy --mapfile types.php --target path/for/legacy/files + ``` + +* Thirdly, transform the types located in the map file: ``` namespacer.phar transform --mapfile types.php ``` + +* Last, fix any used namespaces + ``` + namespacer.phar fix --mapfile types.php --target path/to/src + ``` From 8a27c874494ccb6c32daae58f8bd1221b5b85214 Mon Sep 17 00:00:00 2001 From: Dom Morgan Date: Fri, 27 May 2016 18:15:16 +0100 Subject: [PATCH 5/5] move files again rathe than cppying --- src/Namespacer/Model/Transformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Namespacer/Model/Transformer.php b/src/Namespacer/Model/Transformer.php index 2e16a07..28d56fa 100644 --- a/src/Namespacer/Model/Transformer.php +++ b/src/Namespacer/Model/Transformer.php @@ -27,7 +27,7 @@ public function moveFiles() if (!file_exists($newDir)) { mkdir($newDir, 0777, true); } - copy($old, $new . '.transform'); + rename($old, $new . '.transform'); } foreach ($fileRenamings as $new) { if (file_exists($new . '.transform')) {