Migrator only replaced "PHPExcel"

This commit is contained in:
Adrien Crivelli 2018-08-05 23:03:04 +09:00
parent 46eabbad60
commit 98c55b0f88
No known key found for this signature in database
GPG Key ID: B182FD79DC6DE92E
2 changed files with 104 additions and 9 deletions

View File

@ -4,6 +4,22 @@ namespace PhpOffice\PhpSpreadsheet\Helper;
class Migrator class Migrator
{ {
/**
* @var string[]
*/
private $from;
/**
* @var string[]
*/
private $to;
public function __construct()
{
$this->from = array_keys($this->getMapping());
$this->to = array_values($this->getMapping());
}
/** /**
* Return the ordered mapping from old PHPExcel class names to new PhpSpreadsheet one. * Return the ordered mapping from old PHPExcel class names to new PhpSpreadsheet one.
* *
@ -258,9 +274,6 @@ class Migrator
'/*.phtml', '/*.phtml',
]; ];
$from = array_keys($this->getMapping());
$to = array_values($this->getMapping());
foreach ($patterns as $pattern) { foreach ($patterns as $pattern) {
foreach (glob($path . $pattern) as $file) { foreach (glob($path . $pattern) as $file) {
if (strpos($path, '/vendor/') !== false) { if (strpos($path, '/vendor/') !== false) {
@ -269,12 +282,7 @@ class Migrator
continue; continue;
} }
$original = file_get_contents($file); $original = file_get_contents($file);
$converted = str_replace($from, $to, $original); $converted = $this->replace($original);
// The string "PHPExcel" gets special treatment because of how common it might be.
// This regex requires a word boundary around the string, and it can't be
// preceded by $ or -> (goal is to filter out cases where a variable is named $PHPExcel or similar)
$converted = preg_replace('/(?<!\$|->)\bPHPExcel\b/', \PhpOffice\PhpSpreadsheet\Spreadsheet::class, $original);
if ($original !== $converted) { if ($original !== $converted) {
echo $file . " converted\n"; echo $file . " converted\n";
@ -303,4 +311,23 @@ class Migrator
$this->recursiveReplace($path); $this->recursiveReplace($path);
} }
} }
/**
* Migrate the given code from PHPExcel to PhpSpreadsheet.
*
* @param string $original
*
* @return string
*/
public function replace($original)
{
$converted = str_replace($this->from, $this->to, $original);
// The string "PHPExcel" gets special treatment because of how common it might be.
// This regex requires a word boundary around the string, and it can't be
// preceded by $ or -> (goal is to filter out cases where a variable is named $PHPExcel or similar)
$converted = preg_replace('~(?<!\$|->)(\b|\\\\)PHPExcel\b~', '\\' . \PhpOffice\PhpSpreadsheet\Spreadsheet::class, $converted);
return $converted;
}
} }

View File

@ -17,4 +17,72 @@ class MigratorTest extends TestCase
} }
} }
} }
public function testReplace()
{
$input = <<<'STRING'
<?php
namespace Foo;
use PHPExcel;
use PHPExcel_Worksheet;
class Bar
{
/**
* @param PHPExcel $workbook
* @param PHPExcel_Worksheet $sheet
*
* @return string
*/
public function baz(PHPExcel $workbook, PHPExcel_Worksheet $sheet)
{
PHPExcel::class;
\PHPExcel::class;
$PHPExcel->do();
$fooobjPHPExcel->do();
$objPHPExcel->do();
$this->objPHPExcel->do();
$this->PHPExcel->do();
return \PHPExcel_Cell::stringFromColumnIndex(9);
}
}
STRING;
$expected = <<<'STRING'
<?php
namespace Foo;
use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class Bar
{
/**
* @param \PhpOffice\PhpSpreadsheet\Spreadsheet $workbook
* @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $sheet
*
* @return string
*/
public function baz(\PhpOffice\PhpSpreadsheet\Spreadsheet $workbook, \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $sheet)
{
\PhpOffice\PhpSpreadsheet\Spreadsheet::class;
\PhpOffice\PhpSpreadsheet\Spreadsheet::class;
$PHPExcel->do();
$fooobjPHPExcel->do();
$objPHPExcel->do();
$this->objPHPExcel->do();
$this->PHPExcel->do();
return \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex(9);
}
}
STRING;
$migrator = new Migrator();
self::assertSame($expected, $migrator->replace($input));
}
} }