Skip to content

Commit 8188e19

Browse files
committed
Fix coenjacobs#32 Unintended discarding of default config when sibling config set
1 parent 83f1477 commit 8188e19

File tree

2 files changed

+126
-4
lines changed

2 files changed

+126
-4
lines changed

src/Composer/Extra/StraussConfig.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,9 @@ class StraussConfig
6969
protected array $excludeFromCopy = array();
7070

7171
/**
72-
* @var array{packages?: string[], namespaces?: string[], filePatterns?: string[]}
72+
* @var array{packages: string[], namespaces: string[], filePatterns: string[]}
7373
*/
74-
protected array $excludeFromPrefix = array('file_patterns'=>array('/^psr.*$/'));
75-
74+
protected array $excludeFromPrefix = array('file_patterns'=>array('/^psr.*$/'),'namespaces'=>array(),'packages'=>array());
7675

7776
/**
7877
* An array of autoload keys to replace packages' existing autoload key.
@@ -140,6 +139,8 @@ public function __construct(Composer $composer)
140139
$rename->addMapping(StraussConfig::class, 'exclude_packages', 'excludePackages');
141140
$rename->addMapping(StraussConfig::class, 'delete_vendor_directories', 'deleteVendorFiles');
142141

142+
$rename->addMapping(StraussConfig::class, 'exclude_prefix_packages', 'excludePackagesFromPrefixing');
143+
143144
$mapper->unshift($rename);
144145
$mapper->push(new \JsonMapper\Middleware\CaseConversion(
145146
\JsonMapper\Enums\TextNotation::UNDERSCORE(),
@@ -342,7 +343,15 @@ public function getExcludeFilePatternsFromCopy(): array
342343

343344
public function setExcludeFromPrefix(array $excludeFromPrefix): void
344345
{
345-
$this->excludeFromPrefix = $excludeFromPrefix;
346+
if (isset($excludeFromPrefix['packages'])) {
347+
$this->excludeFromPrefix['packages'] = $excludeFromPrefix['packages'];
348+
}
349+
if (isset($excludeFromPrefix['namespaces'])) {
350+
$this->excludeFromPrefix['namespaces'] = $excludeFromPrefix['namespaces'];
351+
}
352+
if (isset($excludeFromPrefix['file_patterns'])) {
353+
$this->excludeFromPrefix['file_patterns'] = $excludeFromPrefix['file_patterns'];
354+
}
346355
}
347356

348357
/**
@@ -355,6 +364,11 @@ public function getExcludePackagesFromPrefixing(): array
355364
return $this->excludeFromPrefix['packages'] ?? array();
356365
}
357366

367+
public function setExcludePackagesFromPrefixing(array $excludePackagesFromPrefixing): void
368+
{
369+
$this->excludeFromPrefix['packages'] = $excludePackagesFromPrefixing;
370+
}
371+
358372
public function getExcludeNamespacesFromPrefixing(): array
359373
{
360374
return $this->excludeFromPrefix['namespaces'] ?? array();

tests/Unit/Composer/Extra/StraussConfigTest.php

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,114 @@ public function testGetPackagesFromConfig()
396396
$this->assertContains('pimple/pimple', $sut->getPackages());
397397
}
398398

399+
400+
public function testGetOldSyntaxExcludePackagesFromPrefixing()
401+
{
402+
$this->markTestSkipped('Currently needs a reflectable property in the target object');
403+
404+
$composerExtraStraussJson = <<<'EOD'
405+
{
406+
"name": "brianhenryie/strauss-config-test",
407+
"extra": {
408+
"strauss": {
409+
"exclude_prefix_packages": [
410+
"psr/container"
411+
]
412+
}
413+
}
414+
}
415+
416+
EOD;
417+
$tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-');
418+
file_put_contents($tmpfname, $composerExtraStraussJson);
419+
420+
$composer = Factory::create(new NullIO(), $tmpfname);
421+
422+
$sut = new StraussConfig($composer);
423+
424+
$this->assertContains('psr/container', $sut->getExcludePackagesFromPrefixing());
425+
}
426+
427+
428+
public function testGetExcludePackagesFromPrefixing()
429+
{
430+
431+
$composerExtraStraussJson = <<<'EOD'
432+
{
433+
"name": "brianhenryie/strauss-config-test",
434+
"extra": {
435+
"strauss": {
436+
"exclude_from_prefix": {
437+
"packages": [
438+
"psr/container"
439+
]
440+
}
441+
}
442+
}
443+
}
444+
445+
EOD;
446+
$tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-');
447+
file_put_contents($tmpfname, $composerExtraStraussJson);
448+
449+
$composer = Factory::create(new NullIO(), $tmpfname);
450+
451+
$sut = new StraussConfig($composer);
452+
453+
$this->assertContains('psr/container', $sut->getExcludePackagesFromPrefixing());
454+
}
455+
456+
457+
public function testGetExcludeFilePatternsFromPrefixingDefault()
458+
{
459+
460+
$composerExtraStraussJson = <<<'EOD'
461+
{
462+
"name": "brianhenryie/strauss-config-test"
463+
}
464+
465+
EOD;
466+
$tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-');
467+
file_put_contents($tmpfname, $composerExtraStraussJson);
468+
469+
$composer = Factory::create(new NullIO(), $tmpfname);
470+
471+
$sut = new StraussConfig($composer);
472+
473+
$this->assertContains('/^psr.*$/', $sut->getExcludeFilePatternsFromPrefixing());
474+
}
475+
476+
/**
477+
* When excluding a package, the default file pattern exclusion was being forgotten.
478+
*
479+
* @see https://github.com/BrianHenryIE/strauss/issues/32
480+
*/
481+
public function testGetExcludeFilePatternsFromPrefixingDefaultAfterExcludingPackages()
482+
{
483+
484+
$composerExtraStraussJson = <<<'EOD'
485+
{
486+
"name": "brianhenryie/strauss-config-test",
487+
"extra": {
488+
"strauss": {
489+
"exclude_from_prefix": {
490+
"packages": ["yahnis-elsts/plugin-update-checker","erusev/parsedown"]
491+
}
492+
}
493+
}
494+
}
495+
496+
EOD;
497+
$tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-');
498+
file_put_contents($tmpfname, $composerExtraStraussJson);
499+
500+
$composer = Factory::create(new NullIO(), $tmpfname);
501+
502+
$sut = new StraussConfig($composer);
503+
504+
$this->assertContains('/^psr.*$/', $sut->getExcludeFilePatternsFromPrefixing());
505+
}
506+
399507
/**
400508
* When Strauss config has no packages specified, use composer.json's require list.
401509
*/

0 commit comments

Comments
 (0)