@@ -15,16 +15,16 @@ discard block |
||
| 15 | 15 | class MozartIssue97Test extends IntegrationTestCase |
| 16 | 16 | { |
| 17 | 17 | |
| 18 | - /** |
|
| 19 | - * Issue 97. Package named "crewlabs/unsplash" is downloaded to `vendor/crewlabs/unsplash` but their composer.json |
|
| 20 | - * has the package name as "unsplash/unsplash". |
|
| 21 | - * |
|
| 22 | - * "The "/Users/BrianHenryIE/Sites/mozart-97/vendor/unsplash/unsplash/src" directory does not exist." |
|
| 23 | - */ |
|
| 24 | - public function testCrewlabsUnsplashSucceeds() |
|
| 25 | - { |
|
| 26 | - |
|
| 27 | - $composerJsonString = <<<'EOD' |
|
| 18 | + /** |
|
| 19 | + * Issue 97. Package named "crewlabs/unsplash" is downloaded to `vendor/crewlabs/unsplash` but their composer.json |
|
| 20 | + * has the package name as "unsplash/unsplash". |
|
| 21 | + * |
|
| 22 | + * "The "/Users/BrianHenryIE/Sites/mozart-97/vendor/unsplash/unsplash/src" directory does not exist." |
|
| 23 | + */ |
|
| 24 | + public function testCrewlabsUnsplashSucceeds() |
|
| 25 | + { |
|
| 26 | + |
|
| 27 | + $composerJsonString = <<<'EOD' |
|
| 28 | 28 | { |
| 29 | 29 | "name": "brianhenryie/mozart-issue-97", |
| 30 | 30 | "require": { |
@@ -39,19 +39,19 @@ discard block |
||
| 39 | 39 | } |
| 40 | 40 | EOD; |
| 41 | 41 | |
| 42 | - file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 42 | + file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 43 | 43 | |
| 44 | - chdir($this->testsWorkingDir); |
|
| 44 | + chdir($this->testsWorkingDir); |
|
| 45 | 45 | |
| 46 | - exec('composer install'); |
|
| 46 | + exec('composer install'); |
|
| 47 | 47 | |
| 48 | - $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 49 | - $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 48 | + $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 49 | + $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 50 | 50 | |
| 51 | - $mozartCompose = new Compose(); |
|
| 51 | + $mozartCompose = new Compose(); |
|
| 52 | 52 | |
| 53 | - $result = $mozartCompose->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 53 | + $result = $mozartCompose->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 54 | 54 | |
| 55 | - $this->assertEquals(0, $result); |
|
| 56 | - } |
|
| 55 | + $this->assertEquals(0, $result); |
|
| 56 | + } |
|
| 57 | 57 | } |
@@ -20,52 +20,52 @@ |
||
| 20 | 20 | class MozartIssue48Test extends IntegrationTestCase |
| 21 | 21 | { |
| 22 | 22 | |
| 23 | - /** |
|
| 24 | - * rubix/tensor |
|
| 25 | - * |
|
| 26 | - * Mozart was only processing one of the PSR-4 autoload paths, in which case it was not copying (amongst others) |
|
| 27 | - * `EigenvalueDecomposition.php` at all. Test for its presence. |
|
| 28 | - */ |
|
| 29 | - public function testRubixTensorBothPathsPersist() |
|
| 30 | - { |
|
| 23 | + /** |
|
| 24 | + * rubix/tensor |
|
| 25 | + * |
|
| 26 | + * Mozart was only processing one of the PSR-4 autoload paths, in which case it was not copying (amongst others) |
|
| 27 | + * `EigenvalueDecomposition.php` at all. Test for its presence. |
|
| 28 | + */ |
|
| 29 | + public function testRubixTensorBothPathsPersist() |
|
| 30 | + { |
|
| 31 | 31 | |
| 32 | - $composerJsonString = <<<'EOD' |
|
| 32 | + $composerJsonString = <<<'EOD' |
|
| 33 | 33 | { |
| 34 | 34 | "name": "brianhenryie/mozart-issue-48", |
| 35 | 35 | "require": { "rubix/tensor": "*" } |
| 36 | 36 | } |
| 37 | 37 | EOD; |
| 38 | 38 | |
| 39 | - file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 39 | + file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 40 | 40 | |
| 41 | - chdir($this->testsWorkingDir); |
|
| 41 | + chdir($this->testsWorkingDir); |
|
| 42 | 42 | |
| 43 | - exec('composer install'); |
|
| 43 | + exec('composer install'); |
|
| 44 | 44 | |
| 45 | - $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 46 | - $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 45 | + $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 46 | + $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 47 | 47 | |
| 48 | - $mozartCompose = new Compose(); |
|
| 48 | + $mozartCompose = new Compose(); |
|
| 49 | 49 | |
| 50 | - $result = $mozartCompose->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 50 | + $result = $mozartCompose->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 51 | 51 | |
| 52 | - // EigenvalueDecomposition.php |
|
| 53 | - // assert file exists somewhere in the tree |
|
| 52 | + // EigenvalueDecomposition.php |
|
| 53 | + // assert file exists somewhere in the tree |
|
| 54 | 54 | |
| 55 | - // https://stackoverflow.com/questions/17160696/php-glob-scan-in-subfolders-for-a-file |
|
| 56 | - $rsearch = function ($folder, $pattern) { |
|
| 57 | - $dir = new \RecursiveDirectoryIterator($folder); |
|
| 58 | - $ite = new \RecursiveIteratorIterator($dir); |
|
| 59 | - $files = new \RegexIterator($ite, $pattern, \RegexIterator::GET_MATCH); |
|
| 60 | - $fileList = array(); |
|
| 61 | - foreach ($files as $file) { |
|
| 62 | - $fileList = array_merge($fileList, $file); |
|
| 63 | - } |
|
| 64 | - return $fileList; |
|
| 65 | - }; |
|
| 55 | + // https://stackoverflow.com/questions/17160696/php-glob-scan-in-subfolders-for-a-file |
|
| 56 | + $rsearch = function ($folder, $pattern) { |
|
| 57 | + $dir = new \RecursiveDirectoryIterator($folder); |
|
| 58 | + $ite = new \RecursiveIteratorIterator($dir); |
|
| 59 | + $files = new \RegexIterator($ite, $pattern, \RegexIterator::GET_MATCH); |
|
| 60 | + $fileList = array(); |
|
| 61 | + foreach ($files as $file) { |
|
| 62 | + $fileList = array_merge($fileList, $file); |
|
| 63 | + } |
|
| 64 | + return $fileList; |
|
| 65 | + }; |
|
| 66 | 66 | |
| 67 | - $found = $rsearch($this->testsWorkingDir . 'strauss', '~EigenvalueDecomposition\.php~'); |
|
| 67 | + $found = $rsearch($this->testsWorkingDir . 'strauss', '~EigenvalueDecomposition\.php~'); |
|
| 68 | 68 | |
| 69 | - $this->assertNotEmpty($found); |
|
| 70 | - } |
|
| 69 | + $this->assertNotEmpty($found); |
|
| 70 | + } |
|
| 71 | 71 | } |
@@ -32,14 +32,14 @@ discard block |
||
| 32 | 32 | class MozartIssue62Test extends IntegrationTestCase |
| 33 | 33 | { |
| 34 | 34 | |
| 35 | - /** |
|
| 36 | - * Just confirms `use Guzzle\Common\Collection;` is prefixed. |
|
| 37 | - */ |
|
| 38 | - public function testGuzzleNamespaceIsPrefixedInS3Client() |
|
| 39 | - { |
|
| 40 | - $this->markTestSkipped('Very slow to run'); |
|
| 35 | + /** |
|
| 36 | + * Just confirms `use Guzzle\Common\Collection;` is prefixed. |
|
| 37 | + */ |
|
| 38 | + public function testGuzzleNamespaceIsPrefixedInS3Client() |
|
| 39 | + { |
|
| 40 | + $this->markTestSkipped('Very slow to run'); |
|
| 41 | 41 | |
| 42 | - $composerJsonString = <<<'EOD' |
|
| 42 | + $composerJsonString = <<<'EOD' |
|
| 43 | 43 | { |
| 44 | 44 | "name": "brianhenryie/mozart-issue-62", |
| 45 | 45 | "require": { |
@@ -54,21 +54,21 @@ discard block |
||
| 54 | 54 | } |
| 55 | 55 | EOD; |
| 56 | 56 | |
| 57 | - file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 57 | + file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 58 | 58 | |
| 59 | - chdir($this->testsWorkingDir); |
|
| 59 | + chdir($this->testsWorkingDir); |
|
| 60 | 60 | |
| 61 | - exec('composer install'); |
|
| 61 | + exec('composer install'); |
|
| 62 | 62 | |
| 63 | - $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 64 | - $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 63 | + $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 64 | + $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 65 | 65 | |
| 66 | - $mozartCompose = new Compose(); |
|
| 66 | + $mozartCompose = new Compose(); |
|
| 67 | 67 | |
| 68 | - $mozartCompose->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 68 | + $mozartCompose->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 69 | 69 | |
| 70 | - $phpString = file_get_contents($this->testsWorkingDir .'strauss/aws/aws-sdk-php/src/Aws/S3/S3Client.php'); |
|
| 70 | + $phpString = file_get_contents($this->testsWorkingDir .'strauss/aws/aws-sdk-php/src/Aws/S3/S3Client.php'); |
|
| 71 | 71 | |
| 72 | - $this->assertStringContainsString('use Strauss\\Guzzle\\Common\\Collection;', $phpString); |
|
| 73 | - } |
|
| 72 | + $this->assertStringContainsString('use Strauss\\Guzzle\\Common\\Collection;', $phpString); |
|
| 73 | + } |
|
| 74 | 74 | } |
@@ -17,21 +17,21 @@ discard block |
||
| 17 | 17 | */ |
| 18 | 18 | class MozartIssue93Test extends IntegrationTestCase |
| 19 | 19 | { |
| 20 | - /** |
|
| 21 | - * Issue #93 shows a classname being updated inside a class whose namespace has also been updated |
|
| 22 | - * by Mozart. |
|
| 23 | - * |
|
| 24 | - * This is caused by the same files being loaded by both a PSR-4 autolaoder and classmap autoloader. |
|
| 25 | - * @see https://github.com/katzgrau/KLogger/blob/de2d3ab6777a393a9879e0496ebb8e0644066e3f/composer.json#L24-L29 |
|
| 26 | - * |
|
| 27 | - * @author BrianHenryIE |
|
| 28 | - */ |
|
| 29 | - public function test_it_does_not_make_classname_replacement_inside_namespaced_file() |
|
| 30 | - { |
|
| 20 | + /** |
|
| 21 | + * Issue #93 shows a classname being updated inside a class whose namespace has also been updated |
|
| 22 | + * by Mozart. |
|
| 23 | + * |
|
| 24 | + * This is caused by the same files being loaded by both a PSR-4 autolaoder and classmap autoloader. |
|
| 25 | + * @see https://github.com/katzgrau/KLogger/blob/de2d3ab6777a393a9879e0496ebb8e0644066e3f/composer.json#L24-L29 |
|
| 26 | + * |
|
| 27 | + * @author BrianHenryIE |
|
| 28 | + */ |
|
| 29 | + public function test_it_does_not_make_classname_replacement_inside_namespaced_file() |
|
| 30 | + { |
|
| 31 | 31 | |
| 32 | - $this->markTestSkipped('Not respecting the pinned commit.'); |
|
| 32 | + $this->markTestSkipped('Not respecting the pinned commit.'); |
|
| 33 | 33 | |
| 34 | - $composerJsonString = <<<'EOD' |
|
| 34 | + $composerJsonString = <<<'EOD' |
|
| 35 | 35 | { |
| 36 | 36 | "name": "brianhenryie/mozart-issue-93", |
| 37 | 37 | "repositories": [{ |
@@ -51,25 +51,25 @@ discard block |
||
| 51 | 51 | } |
| 52 | 52 | EOD; |
| 53 | 53 | |
| 54 | - file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 54 | + file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 55 | 55 | |
| 56 | - chdir($this->testsWorkingDir); |
|
| 56 | + chdir($this->testsWorkingDir); |
|
| 57 | 57 | |
| 58 | - exec('composer install'); |
|
| 58 | + exec('composer install'); |
|
| 59 | 59 | |
| 60 | - $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 61 | - $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 60 | + $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 61 | + $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 62 | 62 | |
| 63 | - $mozartCompose = new Compose(); |
|
| 63 | + $mozartCompose = new Compose(); |
|
| 64 | 64 | |
| 65 | - $mozartCompose->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 65 | + $mozartCompose->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 66 | 66 | |
| 67 | - $php_string = file_get_contents($this->testsWorkingDir .'strauss/brianhenryie/wp-logger/src/class-logger.php'); |
|
| 67 | + $php_string = file_get_contents($this->testsWorkingDir .'strauss/brianhenryie/wp-logger/src/class-logger.php'); |
|
| 68 | 68 | |
| 69 | - // Confirm problem is gone. |
|
| 70 | - $this->assertStringNotContainsString('class BrianHenryIE_Strauss_Logger extends', $php_string); |
|
| 69 | + // Confirm problem is gone. |
|
| 70 | + $this->assertStringNotContainsString('class BrianHenryIE_Strauss_Logger extends', $php_string); |
|
| 71 | 71 | |
| 72 | - // Confirm solution is correct. |
|
| 73 | - $this->assertStringContainsString('class Logger extends', $php_string); |
|
| 74 | - } |
|
| 72 | + // Confirm solution is correct. |
|
| 73 | + $this->assertStringContainsString('class Logger extends', $php_string); |
|
| 74 | + } |
|
| 75 | 75 | } |
@@ -21,17 +21,17 @@ discard block |
||
| 21 | 21 | class MozartIssue43Test extends IntegrationTestCase |
| 22 | 22 | { |
| 23 | 23 | |
| 24 | - /** |
|
| 25 | - * Issue 43. Needs "aws/aws-sdk-php". |
|
| 26 | - * |
|
| 27 | - * League\Flysystem\FileExistsException : File already exists at path: |
|
| 28 | - * dep_directory/vendor/guzzle/guzzle/src/Guzzle/Cache/Zf1CacheAdapter.php |
|
| 29 | - */ |
|
| 30 | - public function testAwsSdkSucceeds() |
|
| 31 | - { |
|
| 32 | - $this->markTestSkipped('Very slow to run'); |
|
| 24 | + /** |
|
| 25 | + * Issue 43. Needs "aws/aws-sdk-php". |
|
| 26 | + * |
|
| 27 | + * League\Flysystem\FileExistsException : File already exists at path: |
|
| 28 | + * dep_directory/vendor/guzzle/guzzle/src/Guzzle/Cache/Zf1CacheAdapter.php |
|
| 29 | + */ |
|
| 30 | + public function testAwsSdkSucceeds() |
|
| 31 | + { |
|
| 32 | + $this->markTestSkipped('Very slow to run'); |
|
| 33 | 33 | |
| 34 | - $composerJsonString = <<<'EOD' |
|
| 34 | + $composerJsonString = <<<'EOD' |
|
| 35 | 35 | { |
| 36 | 36 | "name": "brianhenryie/mozart-issue-43", |
| 37 | 37 | "require": { |
@@ -53,21 +53,21 @@ discard block |
||
| 53 | 53 | } |
| 54 | 54 | EOD; |
| 55 | 55 | |
| 56 | - file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 56 | + file_put_contents($this->testsWorkingDir . '/composer.json', $composerJsonString); |
|
| 57 | 57 | |
| 58 | - chdir($this->testsWorkingDir); |
|
| 58 | + chdir($this->testsWorkingDir); |
|
| 59 | 59 | |
| 60 | - exec('composer install'); |
|
| 60 | + exec('composer install'); |
|
| 61 | 61 | |
| 62 | - $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 63 | - $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 62 | + $inputInterfaceMock = $this->createMock(InputInterface::class); |
|
| 63 | + $outputInterfaceMock = $this->createMock(OutputInterface::class); |
|
| 64 | 64 | |
| 65 | - $strauss = new Compose(); |
|
| 65 | + $strauss = new Compose(); |
|
| 66 | 66 | |
| 67 | - $result = $strauss->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 67 | + $result = $strauss->run($inputInterfaceMock, $outputInterfaceMock); |
|
| 68 | 68 | // |
| 69 | 69 | // $this->assertEquals(0, $result); |
| 70 | 70 | |
| 71 | - $this->assertFileExists($this->testsWorkingDir . '/strauss/aws/aws-sdk-php/src/AWS/Common/Aws.php'); |
|
| 72 | - } |
|
| 71 | + $this->assertFileExists($this->testsWorkingDir . '/strauss/aws/aws-sdk-php/src/AWS/Common/Aws.php'); |
|
| 72 | + } |
|
| 73 | 73 | } |
@@ -19,72 +19,72 @@ |
||
| 19 | 19 | |
| 20 | 20 | class Copier |
| 21 | 21 | { |
| 22 | - /** |
|
| 23 | - * The only path variable with a leading slash. |
|
| 24 | - * All directories in project end with a slash. |
|
| 25 | - * |
|
| 26 | - * @var string |
|
| 27 | - */ |
|
| 28 | - protected string $workingDir; |
|
| 29 | - |
|
| 30 | - protected string $targetDir; |
|
| 31 | - |
|
| 32 | - protected array $filepaths; |
|
| 33 | - |
|
| 34 | - /** @var Filesystem */ |
|
| 35 | - protected Filesystem $filesystem; |
|
| 36 | - |
|
| 37 | - /** |
|
| 38 | - * Copier constructor. |
|
| 39 | - * @param array<string, ComposerPackage> $filepaths |
|
| 40 | - * @param string $workingDir |
|
| 41 | - * @param string $relativeTargetDir |
|
| 42 | - */ |
|
| 43 | - public function __construct(array $filepaths, string $workingDir, string $relativeTargetDir) |
|
| 44 | - { |
|
| 45 | - $this->filepaths = array_keys($filepaths); |
|
| 46 | - |
|
| 47 | - $this->workingDir = $workingDir; |
|
| 48 | - |
|
| 49 | - $this->targetDir = $relativeTargetDir; |
|
| 50 | - |
|
| 51 | - $this->filesystem = new Filesystem(new Local($this->workingDir)); |
|
| 52 | - } |
|
| 53 | - |
|
| 54 | - /** |
|
| 55 | - * If the target dir does not exist, create it. |
|
| 56 | - * If it already exists, delete any files we're about to copy. |
|
| 57 | - * |
|
| 58 | - * @return void |
|
| 59 | - */ |
|
| 60 | - public function prepareTarget(): void |
|
| 61 | - { |
|
| 62 | - if (! $this->filesystem->has($this->targetDir)) { |
|
| 63 | - $this->filesystem->createDir($this->targetDir); |
|
| 64 | - } else { |
|
| 65 | - foreach ($this->filepaths as $vendorRelativeFilepath) { |
|
| 66 | - $projectRelativeFilepath = $this->targetDir . $vendorRelativeFilepath; |
|
| 67 | - |
|
| 68 | - if ($this->filesystem->has($projectRelativeFilepath)) { |
|
| 69 | - $this->filesystem->delete($projectRelativeFilepath); |
|
| 70 | - } |
|
| 71 | - } |
|
| 72 | - } |
|
| 73 | - } |
|
| 74 | - |
|
| 75 | - |
|
| 76 | - /** |
|
| 77 | - * |
|
| 78 | - */ |
|
| 79 | - public function copy(): void |
|
| 80 | - { |
|
| 81 | - |
|
| 82 | - foreach ($this->filepaths as $relativeFilepath) { |
|
| 83 | - $sourceFileRelativePath = 'vendor' . DIRECTORY_SEPARATOR . $relativeFilepath; |
|
| 84 | - |
|
| 85 | - $targetFileRelativePath = $this->targetDir . $relativeFilepath; |
|
| 86 | - |
|
| 87 | - $this->filesystem->copy($sourceFileRelativePath, $targetFileRelativePath); |
|
| 88 | - } |
|
| 89 | - } |
|
| 22 | + /** |
|
| 23 | + * The only path variable with a leading slash. |
|
| 24 | + * All directories in project end with a slash. |
|
| 25 | + * |
|
| 26 | + * @var string |
|
| 27 | + */ |
|
| 28 | + protected string $workingDir; |
|
| 29 | + |
|
| 30 | + protected string $targetDir; |
|
| 31 | + |
|
| 32 | + protected array $filepaths; |
|
| 33 | + |
|
| 34 | + /** @var Filesystem */ |
|
| 35 | + protected Filesystem $filesystem; |
|
| 36 | + |
|
| 37 | + /** |
|
| 38 | + * Copier constructor. |
|
| 39 | + * @param array<string, ComposerPackage> $filepaths |
|
| 40 | + * @param string $workingDir |
|
| 41 | + * @param string $relativeTargetDir |
|
| 42 | + */ |
|
| 43 | + public function __construct(array $filepaths, string $workingDir, string $relativeTargetDir) |
|
| 44 | + { |
|
| 45 | + $this->filepaths = array_keys($filepaths); |
|
| 46 | + |
|
| 47 | + $this->workingDir = $workingDir; |
|
| 48 | + |
|
| 49 | + $this->targetDir = $relativeTargetDir; |
|
| 50 | + |
|
| 51 | + $this->filesystem = new Filesystem(new Local($this->workingDir)); |
|
| 52 | + } |
|
| 53 | + |
|
| 54 | + /** |
|
| 55 | + * If the target dir does not exist, create it. |
|
| 56 | + * If it already exists, delete any files we're about to copy. |
|
| 57 | + * |
|
| 58 | + * @return void |
|
| 59 | + */ |
|
| 60 | + public function prepareTarget(): void |
|
| 61 | + { |
|
| 62 | + if (! $this->filesystem->has($this->targetDir)) { |
|
| 63 | + $this->filesystem->createDir($this->targetDir); |
|
| 64 | + } else { |
|
| 65 | + foreach ($this->filepaths as $vendorRelativeFilepath) { |
|
| 66 | + $projectRelativeFilepath = $this->targetDir . $vendorRelativeFilepath; |
|
| 67 | + |
|
| 68 | + if ($this->filesystem->has($projectRelativeFilepath)) { |
|
| 69 | + $this->filesystem->delete($projectRelativeFilepath); |
|
| 70 | + } |
|
| 71 | + } |
|
| 72 | + } |
|
| 73 | + } |
|
| 74 | + |
|
| 75 | + |
|
| 76 | + /** |
|
| 77 | + * |
|
| 78 | + */ |
|
| 79 | + public function copy(): void |
|
| 80 | + { |
|
| 81 | + |
|
| 82 | + foreach ($this->filepaths as $relativeFilepath) { |
|
| 83 | + $sourceFileRelativePath = 'vendor' . DIRECTORY_SEPARATOR . $relativeFilepath; |
|
| 84 | + |
|
| 85 | + $targetFileRelativePath = $this->targetDir . $relativeFilepath; |
|
| 86 | + |
|
| 87 | + $this->filesystem->copy($sourceFileRelativePath, $targetFileRelativePath); |
|
| 88 | + } |
|
| 89 | + } |
|
| 90 | 90 | } |
@@ -12,396 +12,396 @@ |
||
| 12 | 12 | |
| 13 | 13 | class StraussConfig |
| 14 | 14 | { |
| 15 | - /** |
|
| 16 | - * The output directory. |
|
| 17 | - * |
|
| 18 | - * Probably `strauss/` or `src/strauss/`. |
|
| 19 | - * |
|
| 20 | - * @var string |
|
| 21 | - */ |
|
| 22 | - protected $targetDirectory = 'strauss'; |
|
| 23 | - |
|
| 24 | - /** |
|
| 25 | - * `namespacePrefix` is the prefix to be given to any namespaces. |
|
| 26 | - * Presumably this will take the form `My_Project_Namespace\dep_directory`. |
|
| 27 | - * |
|
| 28 | - * @link https://www.php-fig.org/psr/psr-4/ |
|
| 29 | - * |
|
| 30 | - * @var string |
|
| 31 | - */ |
|
| 32 | - protected $namespacePrefix; |
|
| 33 | - |
|
| 34 | - /** |
|
| 35 | - * @var string |
|
| 36 | - */ |
|
| 37 | - protected $classmapPrefix; |
|
| 38 | - |
|
| 39 | - /** |
|
| 40 | - * Packages to copy and (maybe) prefix. |
|
| 41 | - * |
|
| 42 | - * If this is empty, the "requires" list in the project composer.json is used. |
|
| 43 | - * |
|
| 44 | - * @var array |
|
| 45 | - */ |
|
| 46 | - protected array $packages = []; |
|
| 47 | - |
|
| 48 | - // Back-compatibility with Mozart. |
|
| 49 | - private array $excludePackages; |
|
| 50 | - |
|
| 51 | - /** |
|
| 52 | - * @var array{packages?: string[], namespaces?: string[], filePatterns?: string[]} |
|
| 53 | - */ |
|
| 54 | - protected array $excludeFromCopy = array(); |
|
| 55 | - |
|
| 56 | - /** |
|
| 57 | - * @var array{packages?: string[], namespaces?: string[], filePatterns?: string[]} |
|
| 58 | - */ |
|
| 59 | - protected array $excludeFromPrefix = array('filePatterns'=>array('/^psr.*$/')); |
|
| 60 | - |
|
| 61 | - |
|
| 62 | - /** |
|
| 63 | - * An array of autoload keys to replace packages' existing autoload key. |
|
| 64 | - * |
|
| 65 | - * e.g. when |
|
| 66 | - * * A package has no autoloader |
|
| 67 | - * * A package specified both a PSR-4 and a classmap but only needs one |
|
| 68 | - * ... |
|
| 69 | - * |
|
| 70 | - * @var array |
|
| 71 | - */ |
|
| 72 | - protected $overrideAutoload = []; |
|
| 73 | - |
|
| 74 | - /** |
|
| 75 | - * After completing `strauss compose` should the source files be deleted? |
|
| 76 | - * This does not affect symlinked directories. |
|
| 77 | - * |
|
| 78 | - * @var bool |
|
| 79 | - */ |
|
| 80 | - protected $deleteVendorFiles = false; |
|
| 81 | - |
|
| 82 | - protected bool $classmapOutput; |
|
| 83 | - |
|
| 84 | - protected array $namespaceReplacementPatterns = array(); |
|
| 85 | - |
|
| 86 | - |
|
| 87 | - /** |
|
| 88 | - * Read any existing Mozart config. |
|
| 89 | - * Overwrite it with any Strauss config. |
|
| 90 | - * Provide sensible defaults. |
|
| 91 | - * |
|
| 92 | - * @throws Exception |
|
| 93 | - */ |
|
| 94 | - public function __construct(Composer $composer) |
|
| 95 | - { |
|
| 96 | - |
|
| 97 | - $configExtraSettings = null; |
|
| 98 | - |
|
| 99 | - // Backwards compatibility with Mozart. |
|
| 100 | - if (isset($composer->getPackage()->getExtra()['mozart'])) { |
|
| 101 | - $configExtraSettings = (object)$composer->getPackage()->getExtra()['mozart']; |
|
| 102 | - |
|
| 103 | - // Default setting for Mozart. |
|
| 104 | - $this->setDeleteVendorFiles(true); |
|
| 105 | - } |
|
| 106 | - |
|
| 107 | - if (isset($composer->getPackage()->getExtra()['strauss'])) { |
|
| 108 | - $configExtraSettings = (object)$composer->getPackage()->getExtra()['strauss']; |
|
| 109 | - } |
|
| 110 | - |
|
| 111 | - if (!is_null($configExtraSettings)) { |
|
| 112 | - $mapper = (new JsonMapperFactory())->bestFit(); |
|
| 113 | - |
|
| 114 | - $rename = new Rename(); |
|
| 115 | - $rename->addMapping(StraussConfig::class, 'dep_directory', 'targetDirectory'); |
|
| 116 | - $rename->addMapping(StraussConfig::class, 'dep_namespace', 'namespacePrefix'); |
|
| 117 | - |
|
| 118 | - $rename->addMapping(StraussConfig::class, 'exclude_packages', 'excludePackages'); |
|
| 119 | - $rename->addMapping(StraussConfig::class, 'delete_vendor_directories', 'deleteVendorFiles'); |
|
| 120 | - |
|
| 121 | - $mapper->unshift($rename); |
|
| 122 | - $mapper->push(new \JsonMapper\Middleware\CaseConversion( |
|
| 123 | - \JsonMapper\Enums\TextNotation::UNDERSCORE(), |
|
| 124 | - \JsonMapper\Enums\TextNotation::CAMEL_CASE() |
|
| 125 | - )); |
|
| 126 | - |
|
| 127 | - $mapper->mapObject($configExtraSettings, $this); |
|
| 128 | - } |
|
| 129 | - |
|
| 130 | - // Defaults. |
|
| 131 | - // * Use PSR-4 autoloader key |
|
| 132 | - // * Use PSR-0 autoloader key |
|
| 133 | - // * Use the package name |
|
| 134 | - if (! isset($this->namespacePrefix)) { |
|
| 135 | - if (isset($composer->getPackage()->getAutoload()['psr-4'])) { |
|
| 136 | - $this->setNamespacePrefix(array_key_first($composer->getPackage()->getAutoload()['psr-4'])); |
|
| 137 | - } elseif (isset($composer->getPackage()->getAutoload()['psr-0'])) { |
|
| 138 | - $this->setNamespacePrefix(array_key_first($composer->getPackage()->getAutoload()['psr-0'])); |
|
| 139 | - } elseif ('__root__' !== $composer->getPackage()->getName()) { |
|
| 140 | - $packageName = $composer->getPackage()->getName(); |
|
| 141 | - $namespacePrefix = preg_replace('/[^\w\/]+/', '_', $packageName); |
|
| 142 | - $namespacePrefix = str_replace('/', '\\', $namespacePrefix) . '\\'; |
|
| 143 | - $namespacePrefix = preg_replace_callback('/(?<=^|_|\\\\)[a-z]/', function ($match) { |
|
| 144 | - return strtoupper($match[0]); |
|
| 145 | - }, $namespacePrefix); |
|
| 146 | - $this->setNamespacePrefix($namespacePrefix); |
|
| 147 | - } elseif (isset($this->classmapPrefix)) { |
|
| 148 | - $namespacePrefix = rtrim($this->getClassmapPrefix(), '_'); |
|
| 149 | - $this->setNamespacePrefix($namespacePrefix); |
|
| 150 | - } |
|
| 151 | - } |
|
| 152 | - |
|
| 153 | - if (! isset($this->classmapPrefix)) { |
|
| 154 | - if (isset($composer->getPackage()->getAutoload()['psr-4'])) { |
|
| 155 | - $autoloadKey = array_key_first($composer->getPackage()->getAutoload()['psr-4']); |
|
| 156 | - $classmapPrefix = str_replace("\\", "_", $autoloadKey); |
|
| 157 | - $this->setClassmapPrefix($classmapPrefix); |
|
| 158 | - } elseif (isset($composer->getPackage()->getAutoload()['psr-0'])) { |
|
| 159 | - $autoloadKey = array_key_first($composer->getPackage()->getAutoload()['psr-0']); |
|
| 160 | - $classmapPrefix = str_replace("\\", "_", $autoloadKey); |
|
| 161 | - $this->setClassmapPrefix($classmapPrefix); |
|
| 162 | - } elseif ('__root__' !== $composer->getPackage()->getName()) { |
|
| 163 | - $packageName = $composer->getPackage()->getName(); |
|
| 164 | - $classmapPrefix = preg_replace('/[^\w\/]+/', '_', $packageName); |
|
| 165 | - $classmapPrefix = str_replace('/', '\\', $classmapPrefix); |
|
| 166 | - // Uppercase the first letter of each word. |
|
| 167 | - $classmapPrefix = preg_replace_callback('/(?<=^|_|\\\\)[a-z]/', function ($match) { |
|
| 168 | - return strtoupper($match[0]); |
|
| 169 | - }, $classmapPrefix); |
|
| 170 | - $classmapPrefix = str_replace("\\", "_", $classmapPrefix); |
|
| 171 | - $this->setClassmapPrefix($classmapPrefix); |
|
| 172 | - } elseif (isset($this->namespacePrefix)) { |
|
| 173 | - $classmapPrefix = preg_replace('/[^\w\/]+/', '_', $this->getNamespacePrefix()); |
|
| 174 | - $classmapPrefix = rtrim($classmapPrefix, '_') . '_'; |
|
| 175 | - $this->setClassmapPrefix($classmapPrefix); |
|
| 176 | - } |
|
| 177 | - } |
|
| 178 | - |
|
| 179 | - if (!isset($this->namespacePrefix) || !isset($this->classmapPrefix)) { |
|
| 180 | - throw new Exception('Prefix not set. Please set `namespace_prefix`, `classmap_prefix` in composer.json/extra/strauss.'); |
|
| 181 | - } |
|
| 182 | - |
|
| 183 | - if (empty($this->packages)) { |
|
| 184 | - $this->packages = array_map(function (\Composer\Package\Link $element) { |
|
| 185 | - return $element->getTarget(); |
|
| 186 | - }, $composer->getPackage()->getRequires()); |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - // If the bool flag for classmapOutput wasn't set in the Json config. |
|
| 190 | - if (!isset($this->classmapOutput)) { |
|
| 191 | - $this->classmapOutput = true; |
|
| 192 | - // Check each autoloader. |
|
| 193 | - foreach ($composer->getPackage()->getAutoload() as $autoload) { |
|
| 194 | - // To see if one of its paths. |
|
| 195 | - foreach ($autoload as $path) { |
|
| 196 | - // Matches the target directory. |
|
| 197 | - if (trim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR === $this->getTargetDirectory()) { |
|
| 198 | - $this->classmapOutput = false; |
|
| 199 | - break 2; |
|
| 200 | - } |
|
| 201 | - } |
|
| 202 | - } |
|
| 203 | - } |
|
| 204 | - |
|
| 205 | - // TODO: Throw an exception if any regex patterns in config are invalid. |
|
| 206 | - // https://stackoverflow.com/questions/4440626/how-can-i-validate-regex |
|
| 207 | - // preg_match('~Valid(Regular)Expression~', null) === false); |
|
| 208 | - } |
|
| 209 | - |
|
| 210 | - /** |
|
| 211 | - * `target_directory` will always be returned without a leading slash and with a trailing slash. |
|
| 212 | - * |
|
| 213 | - * @return string |
|
| 214 | - */ |
|
| 215 | - public function getTargetDirectory(): string |
|
| 216 | - { |
|
| 217 | - return trim($this->targetDirectory, DIRECTORY_SEPARATOR . '\\/') . DIRECTORY_SEPARATOR; |
|
| 218 | - } |
|
| 219 | - |
|
| 220 | - /** |
|
| 221 | - * @param string $targetDirectory |
|
| 222 | - */ |
|
| 223 | - public function setTargetDirectory(string $targetDirectory): void |
|
| 224 | - { |
|
| 225 | - $this->targetDirectory = trim( |
|
| 226 | - preg_replace( |
|
| 227 | - '/[\/\\\\]+/', |
|
| 228 | - DIRECTORY_SEPARATOR, |
|
| 229 | - $targetDirectory |
|
| 230 | - ), |
|
| 231 | - DIRECTORY_SEPARATOR |
|
| 232 | - ) |
|
| 233 | - . DIRECTORY_SEPARATOR ; |
|
| 234 | - } |
|
| 235 | - |
|
| 236 | - /** |
|
| 237 | - * @return string |
|
| 238 | - */ |
|
| 239 | - public function getNamespacePrefix(): string |
|
| 240 | - { |
|
| 241 | - return trim($this->namespacePrefix, '\\'); |
|
| 242 | - } |
|
| 243 | - |
|
| 244 | - /** |
|
| 245 | - * @param string $namespacePrefix |
|
| 246 | - */ |
|
| 247 | - public function setNamespacePrefix(string $namespacePrefix): void |
|
| 248 | - { |
|
| 249 | - $this->namespacePrefix = $namespacePrefix; |
|
| 250 | - } |
|
| 251 | - |
|
| 252 | - /** |
|
| 253 | - * @return string |
|
| 254 | - */ |
|
| 255 | - public function getClassmapPrefix(): string |
|
| 256 | - { |
|
| 257 | - return $this->classmapPrefix; |
|
| 258 | - } |
|
| 259 | - |
|
| 260 | - /** |
|
| 261 | - * @param string $classmapPrefix |
|
| 262 | - */ |
|
| 263 | - public function setClassmapPrefix(string $classmapPrefix): void |
|
| 264 | - { |
|
| 265 | - $this->classmapPrefix = $classmapPrefix; |
|
| 266 | - } |
|
| 267 | - |
|
| 268 | - public function setExcludeFromCopy(array $excludeFromCopy): void |
|
| 269 | - { |
|
| 270 | - $this->excludeFromCopy = $excludeFromCopy; |
|
| 271 | - } |
|
| 272 | - public function getExcludePackagesFromCopy(): array |
|
| 273 | - { |
|
| 274 | - return $this->excludeFromCopy['packages'] ?? array(); |
|
| 275 | - } |
|
| 276 | - |
|
| 277 | - public function getExcludeNamespacesFromCopy(): array |
|
| 278 | - { |
|
| 279 | - return $this->excludeFromCopy['namespaces'] ?? array(); |
|
| 280 | - } |
|
| 281 | - |
|
| 282 | - public function getExcludeFilePatternsFromCopy(): array |
|
| 283 | - { |
|
| 284 | - return $this->excludeFromCopy['filePatterns'] ?? array(); |
|
| 285 | - } |
|
| 286 | - |
|
| 287 | - |
|
| 288 | - public function setExcludeFromPrefix(array $excludeFromPrefix): void |
|
| 289 | - { |
|
| 290 | - $this->excludeFromPrefix = $excludeFromPrefix; |
|
| 291 | - } |
|
| 292 | - |
|
| 293 | - /** |
|
| 294 | - * When prefixing, do not prefix these packages (which have been copied). |
|
| 295 | - * |
|
| 296 | - * @var string[] |
|
| 297 | - */ |
|
| 298 | - public function getExcludePackagesFromPrefixing(): array |
|
| 299 | - { |
|
| 300 | - return $this->excludeFromPrefix['packages'] ?? array(); |
|
| 301 | - } |
|
| 302 | - |
|
| 303 | - public function getExcludeNamespacesFromPrefixing(): array |
|
| 304 | - { |
|
| 305 | - return $this->excludeFromPrefix['namespaces'] ?? array(); |
|
| 306 | - } |
|
| 307 | - |
|
| 308 | - public function getExcludeFilePatternsFromPrefixing(): array |
|
| 309 | - { |
|
| 310 | - return $this->excludeFromPrefix['filePatterns'] ?? array(); |
|
| 311 | - } |
|
| 312 | - |
|
| 313 | - |
|
| 314 | - /** |
|
| 315 | - * @return array |
|
| 316 | - */ |
|
| 317 | - public function getOverrideAutoload(): array |
|
| 318 | - { |
|
| 319 | - return $this->overrideAutoload; |
|
| 320 | - } |
|
| 321 | - |
|
| 322 | - /** |
|
| 323 | - * @param array $overrideAutoload |
|
| 324 | - */ |
|
| 325 | - public function setOverrideAutoload(array $overrideAutoload): void |
|
| 326 | - { |
|
| 327 | - $this->overrideAutoload = $overrideAutoload; |
|
| 328 | - } |
|
| 329 | - |
|
| 330 | - /** |
|
| 331 | - * @return bool |
|
| 332 | - */ |
|
| 333 | - public function isDeleteVendorFiles(): bool |
|
| 334 | - { |
|
| 335 | - return $this->deleteVendorFiles; |
|
| 336 | - } |
|
| 337 | - |
|
| 338 | - /** |
|
| 339 | - * @param bool $deleteVendorFiles |
|
| 340 | - */ |
|
| 341 | - public function setDeleteVendorFiles(bool $deleteVendorFiles): void |
|
| 342 | - { |
|
| 343 | - $this->deleteVendorFiles = $deleteVendorFiles; |
|
| 344 | - } |
|
| 345 | - |
|
| 346 | - /** |
|
| 347 | - * @return array |
|
| 348 | - */ |
|
| 349 | - public function getPackages(): array |
|
| 350 | - { |
|
| 351 | - return $this->packages; |
|
| 352 | - } |
|
| 353 | - |
|
| 354 | - /** |
|
| 355 | - * @param array $packages |
|
| 356 | - */ |
|
| 357 | - public function setPackages(array $packages): void |
|
| 358 | - { |
|
| 359 | - $this->packages = $packages; |
|
| 360 | - } |
|
| 361 | - |
|
| 362 | - /** |
|
| 363 | - * @return bool |
|
| 364 | - */ |
|
| 365 | - public function isClassmapOutput(): bool |
|
| 366 | - { |
|
| 367 | - return $this->classmapOutput; |
|
| 368 | - } |
|
| 369 | - |
|
| 370 | - /** |
|
| 371 | - * @param bool $classmapOutput |
|
| 372 | - */ |
|
| 373 | - public function setClassmapOutput(bool $classmapOutput): void |
|
| 374 | - { |
|
| 375 | - $this->classmapOutput = $classmapOutput; |
|
| 376 | - } |
|
| 377 | - |
|
| 378 | - /** |
|
| 379 | - * Backwards compatability with Mozart. |
|
| 380 | - */ |
|
| 381 | - public function setExcludePackages(array $excludePackages) |
|
| 382 | - { |
|
| 383 | - |
|
| 384 | - if (! isset($this->excludeFromPrefix)) { |
|
| 385 | - $this->excludeFromPrefix = array(); |
|
| 386 | - } |
|
| 387 | - |
|
| 388 | - $this->excludeFromPrefix['packages'] = $excludePackages; |
|
| 389 | - } |
|
| 390 | - |
|
| 391 | - |
|
| 392 | - /** |
|
| 393 | - * @return array |
|
| 394 | - */ |
|
| 395 | - public function getNamespaceReplacementPatterns(): array |
|
| 396 | - { |
|
| 397 | - return $this->namespaceReplacementPatterns; |
|
| 398 | - } |
|
| 399 | - |
|
| 400 | - /** |
|
| 401 | - * @param array $namespaceReplacementPatterns |
|
| 402 | - */ |
|
| 403 | - public function setNamespaceReplacementPatterns(array $namespaceReplacementPatterns): void |
|
| 404 | - { |
|
| 405 | - $this->namespaceReplacementPatterns = $namespaceReplacementPatterns; |
|
| 406 | - } |
|
| 15 | + /** |
|
| 16 | + * The output directory. |
|
| 17 | + * |
|
| 18 | + * Probably `strauss/` or `src/strauss/`. |
|
| 19 | + * |
|
| 20 | + * @var string |
|
| 21 | + */ |
|
| 22 | + protected $targetDirectory = 'strauss'; |
|
| 23 | + |
|
| 24 | + /** |
|
| 25 | + * `namespacePrefix` is the prefix to be given to any namespaces. |
|
| 26 | + * Presumably this will take the form `My_Project_Namespace\dep_directory`. |
|
| 27 | + * |
|
| 28 | + * @link https://www.php-fig.org/psr/psr-4/ |
|
| 29 | + * |
|
| 30 | + * @var string |
|
| 31 | + */ |
|
| 32 | + protected $namespacePrefix; |
|
| 33 | + |
|
| 34 | + /** |
|
| 35 | + * @var string |
|
| 36 | + */ |
|
| 37 | + protected $classmapPrefix; |
|
| 38 | + |
|
| 39 | + /** |
|
| 40 | + * Packages to copy and (maybe) prefix. |
|
| 41 | + * |
|
| 42 | + * If this is empty, the "requires" list in the project composer.json is used. |
|
| 43 | + * |
|
| 44 | + * @var array |
|
| 45 | + */ |
|
| 46 | + protected array $packages = []; |
|
| 47 | + |
|
| 48 | + // Back-compatibility with Mozart. |
|
| 49 | + private array $excludePackages; |
|
| 50 | + |
|
| 51 | + /** |
|
| 52 | + * @var array{packages?: string[], namespaces?: string[], filePatterns?: string[]} |
|
| 53 | + */ |
|
| 54 | + protected array $excludeFromCopy = array(); |
|
| 55 | + |
|
| 56 | + /** |
|
| 57 | + * @var array{packages?: string[], namespaces?: string[], filePatterns?: string[]} |
|
| 58 | + */ |
|
| 59 | + protected array $excludeFromPrefix = array('filePatterns'=>array('/^psr.*$/')); |
|
| 60 | + |
|
| 61 | + |
|
| 62 | + /** |
|
| 63 | + * An array of autoload keys to replace packages' existing autoload key. |
|
| 64 | + * |
|
| 65 | + * e.g. when |
|
| 66 | + * * A package has no autoloader |
|
| 67 | + * * A package specified both a PSR-4 and a classmap but only needs one |
|
| 68 | + * ... |
|
| 69 | + * |
|
| 70 | + * @var array |
|
| 71 | + */ |
|
| 72 | + protected $overrideAutoload = []; |
|
| 73 | + |
|
| 74 | + /** |
|
| 75 | + * After completing `strauss compose` should the source files be deleted? |
|
| 76 | + * This does not affect symlinked directories. |
|
| 77 | + * |
|
| 78 | + * @var bool |
|
| 79 | + */ |
|
| 80 | + protected $deleteVendorFiles = false; |
|
| 81 | + |
|
| 82 | + protected bool $classmapOutput; |
|
| 83 | + |
|
| 84 | + protected array $namespaceReplacementPatterns = array(); |
|
| 85 | + |
|
| 86 | + |
|
| 87 | + /** |
|
| 88 | + * Read any existing Mozart config. |
|
| 89 | + * Overwrite it with any Strauss config. |
|
| 90 | + * Provide sensible defaults. |
|
| 91 | + * |
|
| 92 | + * @throws Exception |
|
| 93 | + */ |
|
| 94 | + public function __construct(Composer $composer) |
|
| 95 | + { |
|
| 96 | + |
|
| 97 | + $configExtraSettings = null; |
|
| 98 | + |
|
| 99 | + // Backwards compatibility with Mozart. |
|
| 100 | + if (isset($composer->getPackage()->getExtra()['mozart'])) { |
|
| 101 | + $configExtraSettings = (object)$composer->getPackage()->getExtra()['mozart']; |
|
| 102 | + |
|
| 103 | + // Default setting for Mozart. |
|
| 104 | + $this->setDeleteVendorFiles(true); |
|
| 105 | + } |
|
| 106 | + |
|
| 107 | + if (isset($composer->getPackage()->getExtra()['strauss'])) { |
|
| 108 | + $configExtraSettings = (object)$composer->getPackage()->getExtra()['strauss']; |
|
| 109 | + } |
|
| 110 | + |
|
| 111 | + if (!is_null($configExtraSettings)) { |
|
| 112 | + $mapper = (new JsonMapperFactory())->bestFit(); |
|
| 113 | + |
|
| 114 | + $rename = new Rename(); |
|
| 115 | + $rename->addMapping(StraussConfig::class, 'dep_directory', 'targetDirectory'); |
|
| 116 | + $rename->addMapping(StraussConfig::class, 'dep_namespace', 'namespacePrefix'); |
|
| 117 | + |
|
| 118 | + $rename->addMapping(StraussConfig::class, 'exclude_packages', 'excludePackages'); |
|
| 119 | + $rename->addMapping(StraussConfig::class, 'delete_vendor_directories', 'deleteVendorFiles'); |
|
| 120 | + |
|
| 121 | + $mapper->unshift($rename); |
|
| 122 | + $mapper->push(new \JsonMapper\Middleware\CaseConversion( |
|
| 123 | + \JsonMapper\Enums\TextNotation::UNDERSCORE(), |
|
| 124 | + \JsonMapper\Enums\TextNotation::CAMEL_CASE() |
|
| 125 | + )); |
|
| 126 | + |
|
| 127 | + $mapper->mapObject($configExtraSettings, $this); |
|
| 128 | + } |
|
| 129 | + |
|
| 130 | + // Defaults. |
|
| 131 | + // * Use PSR-4 autoloader key |
|
| 132 | + // * Use PSR-0 autoloader key |
|
| 133 | + // * Use the package name |
|
| 134 | + if (! isset($this->namespacePrefix)) { |
|
| 135 | + if (isset($composer->getPackage()->getAutoload()['psr-4'])) { |
|
| 136 | + $this->setNamespacePrefix(array_key_first($composer->getPackage()->getAutoload()['psr-4'])); |
|
| 137 | + } elseif (isset($composer->getPackage()->getAutoload()['psr-0'])) { |
|
| 138 | + $this->setNamespacePrefix(array_key_first($composer->getPackage()->getAutoload()['psr-0'])); |
|
| 139 | + } elseif ('__root__' !== $composer->getPackage()->getName()) { |
|
| 140 | + $packageName = $composer->getPackage()->getName(); |
|
| 141 | + $namespacePrefix = preg_replace('/[^\w\/]+/', '_', $packageName); |
|
| 142 | + $namespacePrefix = str_replace('/', '\\', $namespacePrefix) . '\\'; |
|
| 143 | + $namespacePrefix = preg_replace_callback('/(?<=^|_|\\\\)[a-z]/', function ($match) { |
|
| 144 | + return strtoupper($match[0]); |
|
| 145 | + }, $namespacePrefix); |
|
| 146 | + $this->setNamespacePrefix($namespacePrefix); |
|
| 147 | + } elseif (isset($this->classmapPrefix)) { |
|
| 148 | + $namespacePrefix = rtrim($this->getClassmapPrefix(), '_'); |
|
| 149 | + $this->setNamespacePrefix($namespacePrefix); |
|
| 150 | + } |
|
| 151 | + } |
|
| 152 | + |
|
| 153 | + if (! isset($this->classmapPrefix)) { |
|
| 154 | + if (isset($composer->getPackage()->getAutoload()['psr-4'])) { |
|
| 155 | + $autoloadKey = array_key_first($composer->getPackage()->getAutoload()['psr-4']); |
|
| 156 | + $classmapPrefix = str_replace("\\", "_", $autoloadKey); |
|
| 157 | + $this->setClassmapPrefix($classmapPrefix); |
|
| 158 | + } elseif (isset($composer->getPackage()->getAutoload()['psr-0'])) { |
|
| 159 | + $autoloadKey = array_key_first($composer->getPackage()->getAutoload()['psr-0']); |
|
| 160 | + $classmapPrefix = str_replace("\\", "_", $autoloadKey); |
|
| 161 | + $this->setClassmapPrefix($classmapPrefix); |
|
| 162 | + } elseif ('__root__' !== $composer->getPackage()->getName()) { |
|
| 163 | + $packageName = $composer->getPackage()->getName(); |
|
| 164 | + $classmapPrefix = preg_replace('/[^\w\/]+/', '_', $packageName); |
|
| 165 | + $classmapPrefix = str_replace('/', '\\', $classmapPrefix); |
|
| 166 | + // Uppercase the first letter of each word. |
|
| 167 | + $classmapPrefix = preg_replace_callback('/(?<=^|_|\\\\)[a-z]/', function ($match) { |
|
| 168 | + return strtoupper($match[0]); |
|
| 169 | + }, $classmapPrefix); |
|
| 170 | + $classmapPrefix = str_replace("\\", "_", $classmapPrefix); |
|
| 171 | + $this->setClassmapPrefix($classmapPrefix); |
|
| 172 | + } elseif (isset($this->namespacePrefix)) { |
|
| 173 | + $classmapPrefix = preg_replace('/[^\w\/]+/', '_', $this->getNamespacePrefix()); |
|
| 174 | + $classmapPrefix = rtrim($classmapPrefix, '_') . '_'; |
|
| 175 | + $this->setClassmapPrefix($classmapPrefix); |
|
| 176 | + } |
|
| 177 | + } |
|
| 178 | + |
|
| 179 | + if (!isset($this->namespacePrefix) || !isset($this->classmapPrefix)) { |
|
| 180 | + throw new Exception('Prefix not set. Please set `namespace_prefix`, `classmap_prefix` in composer.json/extra/strauss.'); |
|
| 181 | + } |
|
| 182 | + |
|
| 183 | + if (empty($this->packages)) { |
|
| 184 | + $this->packages = array_map(function (\Composer\Package\Link $element) { |
|
| 185 | + return $element->getTarget(); |
|
| 186 | + }, $composer->getPackage()->getRequires()); |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + // If the bool flag for classmapOutput wasn't set in the Json config. |
|
| 190 | + if (!isset($this->classmapOutput)) { |
|
| 191 | + $this->classmapOutput = true; |
|
| 192 | + // Check each autoloader. |
|
| 193 | + foreach ($composer->getPackage()->getAutoload() as $autoload) { |
|
| 194 | + // To see if one of its paths. |
|
| 195 | + foreach ($autoload as $path) { |
|
| 196 | + // Matches the target directory. |
|
| 197 | + if (trim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR === $this->getTargetDirectory()) { |
|
| 198 | + $this->classmapOutput = false; |
|
| 199 | + break 2; |
|
| 200 | + } |
|
| 201 | + } |
|
| 202 | + } |
|
| 203 | + } |
|
| 204 | + |
|
| 205 | + // TODO: Throw an exception if any regex patterns in config are invalid. |
|
| 206 | + // https://stackoverflow.com/questions/4440626/how-can-i-validate-regex |
|
| 207 | + // preg_match('~Valid(Regular)Expression~', null) === false); |
|
| 208 | + } |
|
| 209 | + |
|
| 210 | + /** |
|
| 211 | + * `target_directory` will always be returned without a leading slash and with a trailing slash. |
|
| 212 | + * |
|
| 213 | + * @return string |
|
| 214 | + */ |
|
| 215 | + public function getTargetDirectory(): string |
|
| 216 | + { |
|
| 217 | + return trim($this->targetDirectory, DIRECTORY_SEPARATOR . '\\/') . DIRECTORY_SEPARATOR; |
|
| 218 | + } |
|
| 219 | + |
|
| 220 | + /** |
|
| 221 | + * @param string $targetDirectory |
|
| 222 | + */ |
|
| 223 | + public function setTargetDirectory(string $targetDirectory): void |
|
| 224 | + { |
|
| 225 | + $this->targetDirectory = trim( |
|
| 226 | + preg_replace( |
|
| 227 | + '/[\/\\\\]+/', |
|
| 228 | + DIRECTORY_SEPARATOR, |
|
| 229 | + $targetDirectory |
|
| 230 | + ), |
|
| 231 | + DIRECTORY_SEPARATOR |
|
| 232 | + ) |
|
| 233 | + . DIRECTORY_SEPARATOR ; |
|
| 234 | + } |
|
| 235 | + |
|
| 236 | + /** |
|
| 237 | + * @return string |
|
| 238 | + */ |
|
| 239 | + public function getNamespacePrefix(): string |
|
| 240 | + { |
|
| 241 | + return trim($this->namespacePrefix, '\\'); |
|
| 242 | + } |
|
| 243 | + |
|
| 244 | + /** |
|
| 245 | + * @param string $namespacePrefix |
|
| 246 | + */ |
|
| 247 | + public function setNamespacePrefix(string $namespacePrefix): void |
|
| 248 | + { |
|
| 249 | + $this->namespacePrefix = $namespacePrefix; |
|
| 250 | + } |
|
| 251 | + |
|
| 252 | + /** |
|
| 253 | + * @return string |
|
| 254 | + */ |
|
| 255 | + public function getClassmapPrefix(): string |
|
| 256 | + { |
|
| 257 | + return $this->classmapPrefix; |
|
| 258 | + } |
|
| 259 | + |
|
| 260 | + /** |
|
| 261 | + * @param string $classmapPrefix |
|
| 262 | + */ |
|
| 263 | + public function setClassmapPrefix(string $classmapPrefix): void |
|
| 264 | + { |
|
| 265 | + $this->classmapPrefix = $classmapPrefix; |
|
| 266 | + } |
|
| 267 | + |
|
| 268 | + public function setExcludeFromCopy(array $excludeFromCopy): void |
|
| 269 | + { |
|
| 270 | + $this->excludeFromCopy = $excludeFromCopy; |
|
| 271 | + } |
|
| 272 | + public function getExcludePackagesFromCopy(): array |
|
| 273 | + { |
|
| 274 | + return $this->excludeFromCopy['packages'] ?? array(); |
|
| 275 | + } |
|
| 276 | + |
|
| 277 | + public function getExcludeNamespacesFromCopy(): array |
|
| 278 | + { |
|
| 279 | + return $this->excludeFromCopy['namespaces'] ?? array(); |
|
| 280 | + } |
|
| 281 | + |
|
| 282 | + public function getExcludeFilePatternsFromCopy(): array |
|
| 283 | + { |
|
| 284 | + return $this->excludeFromCopy['filePatterns'] ?? array(); |
|
| 285 | + } |
|
| 286 | + |
|
| 287 | + |
|
| 288 | + public function setExcludeFromPrefix(array $excludeFromPrefix): void |
|
| 289 | + { |
|
| 290 | + $this->excludeFromPrefix = $excludeFromPrefix; |
|
| 291 | + } |
|
| 292 | + |
|
| 293 | + /** |
|
| 294 | + * When prefixing, do not prefix these packages (which have been copied). |
|
| 295 | + * |
|
| 296 | + * @var string[] |
|
| 297 | + */ |
|
| 298 | + public function getExcludePackagesFromPrefixing(): array |
|
| 299 | + { |
|
| 300 | + return $this->excludeFromPrefix['packages'] ?? array(); |
|
| 301 | + } |
|
| 302 | + |
|
| 303 | + public function getExcludeNamespacesFromPrefixing(): array |
|
| 304 | + { |
|
| 305 | + return $this->excludeFromPrefix['namespaces'] ?? array(); |
|
| 306 | + } |
|
| 307 | + |
|
| 308 | + public function getExcludeFilePatternsFromPrefixing(): array |
|
| 309 | + { |
|
| 310 | + return $this->excludeFromPrefix['filePatterns'] ?? array(); |
|
| 311 | + } |
|
| 312 | + |
|
| 313 | + |
|
| 314 | + /** |
|
| 315 | + * @return array |
|
| 316 | + */ |
|
| 317 | + public function getOverrideAutoload(): array |
|
| 318 | + { |
|
| 319 | + return $this->overrideAutoload; |
|
| 320 | + } |
|
| 321 | + |
|
| 322 | + /** |
|
| 323 | + * @param array $overrideAutoload |
|
| 324 | + */ |
|
| 325 | + public function setOverrideAutoload(array $overrideAutoload): void |
|
| 326 | + { |
|
| 327 | + $this->overrideAutoload = $overrideAutoload; |
|
| 328 | + } |
|
| 329 | + |
|
| 330 | + /** |
|
| 331 | + * @return bool |
|
| 332 | + */ |
|
| 333 | + public function isDeleteVendorFiles(): bool |
|
| 334 | + { |
|
| 335 | + return $this->deleteVendorFiles; |
|
| 336 | + } |
|
| 337 | + |
|
| 338 | + /** |
|
| 339 | + * @param bool $deleteVendorFiles |
|
| 340 | + */ |
|
| 341 | + public function setDeleteVendorFiles(bool $deleteVendorFiles): void |
|
| 342 | + { |
|
| 343 | + $this->deleteVendorFiles = $deleteVendorFiles; |
|
| 344 | + } |
|
| 345 | + |
|
| 346 | + /** |
|
| 347 | + * @return array |
|
| 348 | + */ |
|
| 349 | + public function getPackages(): array |
|
| 350 | + { |
|
| 351 | + return $this->packages; |
|
| 352 | + } |
|
| 353 | + |
|
| 354 | + /** |
|
| 355 | + * @param array $packages |
|
| 356 | + */ |
|
| 357 | + public function setPackages(array $packages): void |
|
| 358 | + { |
|
| 359 | + $this->packages = $packages; |
|
| 360 | + } |
|
| 361 | + |
|
| 362 | + /** |
|
| 363 | + * @return bool |
|
| 364 | + */ |
|
| 365 | + public function isClassmapOutput(): bool |
|
| 366 | + { |
|
| 367 | + return $this->classmapOutput; |
|
| 368 | + } |
|
| 369 | + |
|
| 370 | + /** |
|
| 371 | + * @param bool $classmapOutput |
|
| 372 | + */ |
|
| 373 | + public function setClassmapOutput(bool $classmapOutput): void |
|
| 374 | + { |
|
| 375 | + $this->classmapOutput = $classmapOutput; |
|
| 376 | + } |
|
| 377 | + |
|
| 378 | + /** |
|
| 379 | + * Backwards compatability with Mozart. |
|
| 380 | + */ |
|
| 381 | + public function setExcludePackages(array $excludePackages) |
|
| 382 | + { |
|
| 383 | + |
|
| 384 | + if (! isset($this->excludeFromPrefix)) { |
|
| 385 | + $this->excludeFromPrefix = array(); |
|
| 386 | + } |
|
| 387 | + |
|
| 388 | + $this->excludeFromPrefix['packages'] = $excludePackages; |
|
| 389 | + } |
|
| 390 | + |
|
| 391 | + |
|
| 392 | + /** |
|
| 393 | + * @return array |
|
| 394 | + */ |
|
| 395 | + public function getNamespaceReplacementPatterns(): array |
|
| 396 | + { |
|
| 397 | + return $this->namespaceReplacementPatterns; |
|
| 398 | + } |
|
| 399 | + |
|
| 400 | + /** |
|
| 401 | + * @param array $namespaceReplacementPatterns |
|
| 402 | + */ |
|
| 403 | + public function setNamespaceReplacementPatterns(array $namespaceReplacementPatterns): void |
|
| 404 | + { |
|
| 405 | + $this->namespaceReplacementPatterns = $namespaceReplacementPatterns; |
|
| 406 | + } |
|
| 407 | 407 | } |
@@ -13,134 +13,134 @@ |
||
| 13 | 13 | |
| 14 | 14 | class ComposerPackage |
| 15 | 15 | { |
| 16 | - /** |
|
| 17 | - * The composer.json file as parsed by Composer. |
|
| 18 | - * |
|
| 19 | - * @see \Composer\Factory::create |
|
| 20 | - * |
|
| 21 | - * @var \Composer\Composer |
|
| 22 | - */ |
|
| 23 | - protected \Composer\Composer $composer; |
|
| 24 | - |
|
| 25 | - /** |
|
| 26 | - * The name of the project in composer.json. |
|
| 27 | - * |
|
| 28 | - * e.g. brianhenryie/my-project |
|
| 29 | - * |
|
| 30 | - * @var string |
|
| 31 | - */ |
|
| 32 | - protected string $name; |
|
| 33 | - |
|
| 34 | - protected string $path; |
|
| 35 | - |
|
| 36 | - /** |
|
| 37 | - * The discovered files, classmap, psr0 and psr4 autoload keys discovered (as parsed by Composer). |
|
| 38 | - * |
|
| 39 | - * @var array<string, array<string, string>> |
|
| 40 | - */ |
|
| 41 | - protected array $autoload = []; |
|
| 42 | - |
|
| 43 | - /** |
|
| 44 | - * The names in the composer.json's "requires" field (without versions). |
|
| 45 | - * |
|
| 46 | - * @var array |
|
| 47 | - */ |
|
| 48 | - protected array $requiresNames = []; |
|
| 49 | - |
|
| 50 | - protected string $license; |
|
| 51 | - |
|
| 52 | - /** |
|
| 53 | - * Create a PHP object to represent a composer package. |
|
| 54 | - * |
|
| 55 | - * @param string $absolutePath The absolute path to the vendor folder with the composer.json "name", |
|
| 56 | - * i.e. the domain/package definition, which is the vendor subdir from where the package's |
|
| 57 | - * composer.json should be read. |
|
| 58 | - * @param array $overrideAutoload Optional configuration to replace the package's own autoload definition with |
|
| 59 | - * another which Strauss can use. |
|
| 60 | - */ |
|
| 61 | - public function __construct(string $absolutePath, array $overrideAutoload = null) |
|
| 62 | - { |
|
| 63 | - |
|
| 64 | - if (is_dir($absolutePath)) { |
|
| 65 | - $absolutePath = rtrim($absolutePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'composer.json'; |
|
| 66 | - } |
|
| 67 | - |
|
| 68 | - $composer = Factory::create(new NullIO(), $absolutePath); |
|
| 69 | - |
|
| 70 | - $this->composer = $composer; |
|
| 71 | - |
|
| 72 | - $this->name = $composer->getPackage()->getName(); |
|
| 73 | - |
|
| 74 | - $relativePath = null; |
|
| 75 | - |
|
| 76 | - // TODO: Test on Windows (DIRECTORY_SEPARATOR). |
|
| 77 | - if (1 === preg_match('/vendor\/(\w*\/\w*)\/composer\.json/', $absolutePath, $output_array)) { |
|
| 78 | - $relativePath = $output_array[1]; |
|
| 79 | - } |
|
| 80 | - |
|
| 81 | - $this->path = $relativePath ?? $composer->getPackage()->getName(); |
|
| 82 | - |
|
| 83 | - if (!is_null($overrideAutoload)) { |
|
| 84 | - $composer->getPackage()->setAutoload($overrideAutoload); |
|
| 85 | - } |
|
| 86 | - |
|
| 87 | - $this->autoload = $composer->getPackage()->getAutoload(); |
|
| 88 | - |
|
| 89 | - foreach ($composer->getPackage()->getRequires() as $_name => $packageLink) { |
|
| 90 | - $this->requiresNames[] = $packageLink->getTarget(); |
|
| 91 | - } |
|
| 92 | - |
|
| 93 | - // Try to get the license from the package's composer.json, asssume proprietary (all rights reserved!). |
|
| 94 | - $this->license = !empty($composer->getPackage()->getLicense()) |
|
| 95 | - ? implode(',', $composer->getPackage()->getLicense()) |
|
| 96 | - : 'proprietary?'; |
|
| 97 | - } |
|
| 98 | - |
|
| 99 | - /** |
|
| 100 | - * Composer package project name. |
|
| 101 | - * |
|
| 102 | - * @return string |
|
| 103 | - */ |
|
| 104 | - public function getName(): string |
|
| 105 | - { |
|
| 106 | - return $this->name; |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - public function getPath(): string |
|
| 110 | - { |
|
| 111 | - return $this->path; |
|
| 112 | - } |
|
| 113 | - |
|
| 114 | - /** |
|
| 115 | - * |
|
| 116 | - * e.g. ['psr-4' => [ 'BrianHenryIE\Project' => 'src' ]] |
|
| 117 | - * |
|
| 118 | - * @return array<string, array<int|string, string>> |
|
| 119 | - */ |
|
| 120 | - public function getAutoload(): array |
|
| 121 | - { |
|
| 122 | - return $this->autoload; |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - /** |
|
| 126 | - * The names of the packages in the composer.json's "requires" field (without version). |
|
| 127 | - * |
|
| 128 | - * Excludes PHP, ext-*, since we won't be copying or prefixing them. |
|
| 129 | - * |
|
| 130 | - * @return string[] |
|
| 131 | - */ |
|
| 132 | - public function getRequiresNames(): array |
|
| 133 | - { |
|
| 134 | - // Unset PHP, ext-*. |
|
| 135 | - $removePhpExt = function ($element) { |
|
| 136 | - return !( 0 === strpos($element, 'ext') || 'php' === $element ); |
|
| 137 | - }; |
|
| 138 | - |
|
| 139 | - return array_filter($this->requiresNames, $removePhpExt); |
|
| 140 | - } |
|
| 141 | - |
|
| 142 | - public function getLicense():string |
|
| 143 | - { |
|
| 144 | - return $this->license; |
|
| 145 | - } |
|
| 16 | + /** |
|
| 17 | + * The composer.json file as parsed by Composer. |
|
| 18 | + * |
|
| 19 | + * @see \Composer\Factory::create |
|
| 20 | + * |
|
| 21 | + * @var \Composer\Composer |
|
| 22 | + */ |
|
| 23 | + protected \Composer\Composer $composer; |
|
| 24 | + |
|
| 25 | + /** |
|
| 26 | + * The name of the project in composer.json. |
|
| 27 | + * |
|
| 28 | + * e.g. brianhenryie/my-project |
|
| 29 | + * |
|
| 30 | + * @var string |
|
| 31 | + */ |
|
| 32 | + protected string $name; |
|
| 33 | + |
|
| 34 | + protected string $path; |
|
| 35 | + |
|
| 36 | + /** |
|
| 37 | + * The discovered files, classmap, psr0 and psr4 autoload keys discovered (as parsed by Composer). |
|
| 38 | + * |
|
| 39 | + * @var array<string, array<string, string>> |
|
| 40 | + */ |
|
| 41 | + protected array $autoload = []; |
|
| 42 | + |
|
| 43 | + /** |
|
| 44 | + * The names in the composer.json's "requires" field (without versions). |
|
| 45 | + * |
|
| 46 | + * @var array |
|
| 47 | + */ |
|
| 48 | + protected array $requiresNames = []; |
|
| 49 | + |
|
| 50 | + protected string $license; |
|
| 51 | + |
|
| 52 | + /** |
|
| 53 | + * Create a PHP object to represent a composer package. |
|
| 54 | + * |
|
| 55 | + * @param string $absolutePath The absolute path to the vendor folder with the composer.json "name", |
|
| 56 | + * i.e. the domain/package definition, which is the vendor subdir from where the package's |
|
| 57 | + * composer.json should be read. |
|
| 58 | + * @param array $overrideAutoload Optional configuration to replace the package's own autoload definition with |
|
| 59 | + * another which Strauss can use. |
|
| 60 | + */ |
|
| 61 | + public function __construct(string $absolutePath, array $overrideAutoload = null) |
|
| 62 | + { |
|
| 63 | + |
|
| 64 | + if (is_dir($absolutePath)) { |
|
| 65 | + $absolutePath = rtrim($absolutePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'composer.json'; |
|
| 66 | + } |
|
| 67 | + |
|
| 68 | + $composer = Factory::create(new NullIO(), $absolutePath); |
|
| 69 | + |
|
| 70 | + $this->composer = $composer; |
|
| 71 | + |
|
| 72 | + $this->name = $composer->getPackage()->getName(); |
|
| 73 | + |
|
| 74 | + $relativePath = null; |
|
| 75 | + |
|
| 76 | + // TODO: Test on Windows (DIRECTORY_SEPARATOR). |
|
| 77 | + if (1 === preg_match('/vendor\/(\w*\/\w*)\/composer\.json/', $absolutePath, $output_array)) { |
|
| 78 | + $relativePath = $output_array[1]; |
|
| 79 | + } |
|
| 80 | + |
|
| 81 | + $this->path = $relativePath ?? $composer->getPackage()->getName(); |
|
| 82 | + |
|
| 83 | + if (!is_null($overrideAutoload)) { |
|
| 84 | + $composer->getPackage()->setAutoload($overrideAutoload); |
|
| 85 | + } |
|
| 86 | + |
|
| 87 | + $this->autoload = $composer->getPackage()->getAutoload(); |
|
| 88 | + |
|
| 89 | + foreach ($composer->getPackage()->getRequires() as $_name => $packageLink) { |
|
| 90 | + $this->requiresNames[] = $packageLink->getTarget(); |
|
| 91 | + } |
|
| 92 | + |
|
| 93 | + // Try to get the license from the package's composer.json, asssume proprietary (all rights reserved!). |
|
| 94 | + $this->license = !empty($composer->getPackage()->getLicense()) |
|
| 95 | + ? implode(',', $composer->getPackage()->getLicense()) |
|
| 96 | + : 'proprietary?'; |
|
| 97 | + } |
|
| 98 | + |
|
| 99 | + /** |
|
| 100 | + * Composer package project name. |
|
| 101 | + * |
|
| 102 | + * @return string |
|
| 103 | + */ |
|
| 104 | + public function getName(): string |
|
| 105 | + { |
|
| 106 | + return $this->name; |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + public function getPath(): string |
|
| 110 | + { |
|
| 111 | + return $this->path; |
|
| 112 | + } |
|
| 113 | + |
|
| 114 | + /** |
|
| 115 | + * |
|
| 116 | + * e.g. ['psr-4' => [ 'BrianHenryIE\Project' => 'src' ]] |
|
| 117 | + * |
|
| 118 | + * @return array<string, array<int|string, string>> |
|
| 119 | + */ |
|
| 120 | + public function getAutoload(): array |
|
| 121 | + { |
|
| 122 | + return $this->autoload; |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + /** |
|
| 126 | + * The names of the packages in the composer.json's "requires" field (without version). |
|
| 127 | + * |
|
| 128 | + * Excludes PHP, ext-*, since we won't be copying or prefixing them. |
|
| 129 | + * |
|
| 130 | + * @return string[] |
|
| 131 | + */ |
|
| 132 | + public function getRequiresNames(): array |
|
| 133 | + { |
|
| 134 | + // Unset PHP, ext-*. |
|
| 135 | + $removePhpExt = function ($element) { |
|
| 136 | + return !( 0 === strpos($element, 'ext') || 'php' === $element ); |
|
| 137 | + }; |
|
| 138 | + |
|
| 139 | + return array_filter($this->requiresNames, $removePhpExt); |
|
| 140 | + } |
|
| 141 | + |
|
| 142 | + public function getLicense():string |
|
| 143 | + { |
|
| 144 | + return $this->license; |
|
| 145 | + } |
|
| 146 | 146 | } |
@@ -9,48 +9,48 @@ |
||
| 9 | 9 | |
| 10 | 10 | class ProjectComposerPackage extends ComposerPackage |
| 11 | 11 | { |
| 12 | - protected string $author; |
|
| 13 | - |
|
| 14 | - protected string $vendorDirectory; |
|
| 15 | - |
|
| 16 | - public function __construct(string $absolutePath, array $overrideAutoload = null) |
|
| 17 | - { |
|
| 18 | - parent::__construct($absolutePath, $overrideAutoload); |
|
| 19 | - |
|
| 20 | - $authors = $this->composer->getPackage()->getAuthors(); |
|
| 21 | - if (empty($authors) || !isset($authors[0]['name'])) { |
|
| 22 | - $this->author = explode("/", $this->name, 2)[0]; |
|
| 23 | - } else { |
|
| 24 | - $this->author = $authors[0]['name']; |
|
| 25 | - } |
|
| 26 | - |
|
| 27 | - $vendorDirectory = $this->composer->getConfig()->get('vendor-dir'); |
|
| 28 | - if (is_string($vendorDirectory)) { |
|
| 29 | - $vendorDirectory = str_replace($absolutePath, '', (string) $vendorDirectory); |
|
| 30 | - $this->vendorDirectory = $vendorDirectory; |
|
| 31 | - } else { |
|
| 32 | - $this->vendorDirectory = 'vendor' . DIRECTORY_SEPARATOR; |
|
| 33 | - } |
|
| 34 | - } |
|
| 35 | - |
|
| 36 | - /** |
|
| 37 | - * @return StraussConfig |
|
| 38 | - * @throws \Exception |
|
| 39 | - */ |
|
| 40 | - public function getStraussConfig(): StraussConfig |
|
| 41 | - { |
|
| 42 | - |
|
| 43 | - return new StraussConfig($this->composer); |
|
| 44 | - } |
|
| 45 | - |
|
| 46 | - |
|
| 47 | - public function getAuthor(): string |
|
| 48 | - { |
|
| 49 | - return $this->author; |
|
| 50 | - } |
|
| 51 | - |
|
| 52 | - public function getVendorDirectory(): string |
|
| 53 | - { |
|
| 54 | - return rtrim($this->vendorDirectory, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
| 55 | - } |
|
| 12 | + protected string $author; |
|
| 13 | + |
|
| 14 | + protected string $vendorDirectory; |
|
| 15 | + |
|
| 16 | + public function __construct(string $absolutePath, array $overrideAutoload = null) |
|
| 17 | + { |
|
| 18 | + parent::__construct($absolutePath, $overrideAutoload); |
|
| 19 | + |
|
| 20 | + $authors = $this->composer->getPackage()->getAuthors(); |
|
| 21 | + if (empty($authors) || !isset($authors[0]['name'])) { |
|
| 22 | + $this->author = explode("/", $this->name, 2)[0]; |
|
| 23 | + } else { |
|
| 24 | + $this->author = $authors[0]['name']; |
|
| 25 | + } |
|
| 26 | + |
|
| 27 | + $vendorDirectory = $this->composer->getConfig()->get('vendor-dir'); |
|
| 28 | + if (is_string($vendorDirectory)) { |
|
| 29 | + $vendorDirectory = str_replace($absolutePath, '', (string) $vendorDirectory); |
|
| 30 | + $this->vendorDirectory = $vendorDirectory; |
|
| 31 | + } else { |
|
| 32 | + $this->vendorDirectory = 'vendor' . DIRECTORY_SEPARATOR; |
|
| 33 | + } |
|
| 34 | + } |
|
| 35 | + |
|
| 36 | + /** |
|
| 37 | + * @return StraussConfig |
|
| 38 | + * @throws \Exception |
|
| 39 | + */ |
|
| 40 | + public function getStraussConfig(): StraussConfig |
|
| 41 | + { |
|
| 42 | + |
|
| 43 | + return new StraussConfig($this->composer); |
|
| 44 | + } |
|
| 45 | + |
|
| 46 | + |
|
| 47 | + public function getAuthor(): string |
|
| 48 | + { |
|
| 49 | + return $this->author; |
|
| 50 | + } |
|
| 51 | + |
|
| 52 | + public function getVendorDirectory(): string |
|
| 53 | + { |
|
| 54 | + return rtrim($this->vendorDirectory, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
| 55 | + } |
|
| 56 | 56 | } |