Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skip namespaces #36

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions src/Console/Commands/Compose.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,13 @@ protected function execute(InputInterface $input, OutputInterface $output)
$this->replacer = new Replacer($workingDir, $config);

$packages = $this->findPackages($config->packages);
$namespacesToSkip = $this->config->namespaces_to_skip ?? [];

$this->movePackages($packages);
$this->replacePackages($packages);
$this->replacePackages($packages, $namespacesToSkip);

foreach ($packages as $package) {
$this->replacer->replaceParentPackage($package, null);
$this->replacer->replaceParentPackage($package, null, $namespacesToSkip);
}

return 0;
Expand All @@ -75,10 +76,10 @@ protected function movePackages($packages)
* @param $config
* @param array $packages
*/
protected function replacePackages($packages)
protected function replacePackages($packages, array $namespacesToSkip)
{
foreach ($packages as $package) {
$this->replacePackage($package);
$this->replacePackage($package, $namespacesToSkip);
}
}

Expand All @@ -99,15 +100,15 @@ public function movePackage($package)
/**
* Replace contents of all the packages, one by one, starting on the deepest level of dependencies.
*/
public function replacePackage($package)
public function replacePackage($package, array $namespacesToSkip)
{
if (! empty($package->dependencies)) {
foreach ($package->dependencies as $dependency) {
$this->replacePackage($dependency);
$this->replacePackage($dependency, $namespacesToSkip);
}
}

$this->replacer->replacePackage($package);
$this->replacer->replacePackage($package, $namespacesToSkip);
}

/**
Expand Down
5 changes: 5 additions & 0 deletions src/Replace/BaseReplacer.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,14 @@ abstract class BaseReplacer implements Replacer
{
/** @var Autoloader */
public $autoloader;
public $namespacesToSkip;

public function setAutoloader($autoloader)
{
$this->autoloader = $autoloader;
}
public function setNamespacesToSkip(array $namespacesToSkip)
{
$this->namespacesToSkip = $namespacesToSkip;
}
}
7 changes: 7 additions & 0 deletions src/Replace/ClassmapReplacer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ public function replace($contents)
return preg_replace_callback(
'/(?:[abstract]*class |interface )([a-zA-Z\_]+)(?:[ \n]*{| extends| implements)/U',
function ($matches) {
// If it matches any of the namespaces to skip, then do nothing
$namespacesToSkip = $this->namespacesToSkip ?? [];
foreach ($namespacesToSkip as $namespaceToSkip) {
if (strlen($matches[1]) >= strlen($namespaceToSkip) && substr($matches[1], 0, strlen($namespaceToSkip)) == $namespaceToSkip) {
return $matches[0];
}
}
$replace = $this->classmap_prefix . $matches[1];
$this->saveReplacedClass($matches[1], $replace);
return str_replace($matches[1], $replace, $matches[0]);
Expand Down
7 changes: 7 additions & 0 deletions src/Replace/NamespaceReplacer.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ public function replace($contents)
return preg_replace_callback(
'/([^\\?])(' . addslashes($searchNamespace) . '[\\\|;])/U',
function ($matches) {
// If it matches any of the namespaces to skip, then do nothing
$namespacesToSkip = $this->namespacesToSkip ?? [];
foreach ($namespacesToSkip as $namespaceToSkip) {
if (strlen($matches[2]) >= strlen($namespaceToSkip) && substr($matches[2], 0, strlen($namespaceToSkip)) == $namespaceToSkip) {
return $matches[1] . $matches[2];
}
}
return $matches[1] . $this->dep_namespace . $matches[2];
},
$contents
Expand Down
1 change: 1 addition & 0 deletions src/Replace/Replacer.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
interface Replacer
{
public function setAutoloader($autoloader);
public function setNamespacesToSkip(array $namespacesToSkip);
public function replace($contents);
}
25 changes: 13 additions & 12 deletions src/Replacer.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,18 @@ public function __construct($workingDir, $config)
$this->filesystem = new Filesystem(new Local($this->workingDir));
}

public function replacePackage(Package $package)
public function replacePackage(Package $package, array $namespacesToSkip)
{
foreach ($package->autoloaders as $autoloader) {
$this->replacePackageByAutoloader($package, $autoloader);
$this->replacePackageByAutoloader($package, $autoloader, $namespacesToSkip);
}
}

/**
* @param $targetFile
* @param $autoloader
*/
public function replaceInFile($targetFile, $autoloader)
public function replaceInFile($targetFile, $autoloader, array $namespacesToSkip)
{
$targetFile = str_replace($this->workingDir, '', $targetFile);
$contents = $this->filesystem->read($targetFile);
Expand All @@ -62,6 +62,7 @@ public function replaceInFile($targetFile, $autoloader)
}

$replacer->setAutoloader($autoloader);
$replacer->setNamespacesToSkip($namespacesToSkip);
$contents = $replacer->replace($contents);

if ($replacer instanceof ClassmapReplacer) {
Expand All @@ -75,11 +76,11 @@ public function replaceInFile($targetFile, $autoloader)
* @param Package $package
* @param $autoloader
*/
public function replacePackageByAutoloader(Package $package, $autoloader)
public function replacePackageByAutoloader(Package $package, $autoloader, array $namespacesToSkip)
{
if ($autoloader instanceof NamespaceAutoloader) {
$source_path = $this->workingDir . $this->targetDir . str_replace('\\', '/', $autoloader->namespace) . '/';
$this->replaceInDirectory($autoloader, $source_path);
$this->replaceInDirectory($autoloader, $namespacesToSkip, $source_path);
} elseif ($autoloader instanceof Classmap) {
$finder = new Finder();
$source_path = $this->workingDir . $this->config->classmap_directory . '/' . $package->config->name;
Expand All @@ -89,7 +90,7 @@ public function replacePackageByAutoloader(Package $package, $autoloader)
$targetFile = $foundFile->getRealPath();

if ('.php' == substr($targetFile, '-4', 4)) {
$this->replaceInFile($targetFile, $autoloader);
$this->replaceInFile($targetFile, $autoloader, $namespacesToSkip);
}
}
}
Expand Down Expand Up @@ -126,7 +127,7 @@ public function replaceParentClassesInDirectory($directory)
* @param $autoloader
* @param $directory
*/
public function replaceInDirectory($autoloader, $directory)
public function replaceInDirectory($autoloader, array $namespacesToSkip, $directory)
{
$finder = new Finder();
$finder->files()->in($directory);
Expand All @@ -135,12 +136,12 @@ public function replaceInDirectory($autoloader, $directory)
$targetFile = $file->getPathName();

if ('.php' == substr($targetFile, '-4', 4)) {
$this->replaceInFile($targetFile, $autoloader);
$this->replaceInFile($targetFile, $autoloader, $namespacesToSkip);
}
}
}

public function replaceParentPackage(Package $package, $parent)
public function replaceParentPackage(Package $package, $parent, array $namespacesToSkip)
{
if ($parent !== null) {
// Replace everything in parent, based on the dependencies
Expand All @@ -151,7 +152,7 @@ public function replaceParentPackage(Package $package, $parent)
$directory = $this->workingDir . $this->config->dep_directory . $namespace . '/';

if ($autoloader instanceof NamespaceAutoloader) {
$this->replaceInDirectory($autoloader, $directory);
$this->replaceInDirectory($autoloader, $namespacesToSkip, $directory);
} else {
$directory = str_replace($this->workingDir, '', $directory);
$this->replaceParentClassesInDirectory($directory);
Expand All @@ -160,7 +161,7 @@ public function replaceParentPackage(Package $package, $parent)
$directory = $this->workingDir . $this->config->classmap_directory . $parent->config->name;

if ($autoloader instanceof NamespaceAutoloader) {
$this->replaceInDirectory($autoloader, $directory);
$this->replaceInDirectory($autoloader, $namespacesToSkip, $directory);
} else {
$directory = str_replace($this->workingDir, '', $directory);
$this->replaceParentClassesInDirectory($directory);
Expand All @@ -172,7 +173,7 @@ public function replaceParentPackage(Package $package, $parent)

if (! empty($package->dependencies)) {
foreach ($package->dependencies as $dependency) {
$this->replaceParentPackage($dependency, $package);
$this->replaceParentPackage($dependency, $package, $namespacesToSkip);
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions tests/replacers/NamespaceReplacerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ protected function setUp(): void

$replacer = new NamespaceReplacer();
$replacer->setAutoloader($autoloader);
$replacer->setNamespacesToSkip([]);
$replacer->dep_namespace = 'Prefix\\';
$this->replacer = $replacer;
}
Expand All @@ -39,6 +40,7 @@ public function it_doesnt_replaces_namespace_inside_namespace(): void

$replacer = new NamespaceReplacer();
$replacer->setAutoloader($autoloader);
$replacer->setNamespacesToSkip([]);
$replacer->dep_namespace = 'Prefix\\';
$this->replacer = $replacer;

Expand Down