Skip to content

Commit

Permalink
composer コマンドに、dir オプションを追加
Browse files Browse the repository at this point in the history
テストも追加
  • Loading branch information
ryuring committed Jun 16, 2024
1 parent a0622de commit 00a59ac
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 23 deletions.
2 changes: 1 addition & 1 deletion plugins/baser-core/config/setting.php
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@

/**
* インストール時に composer.json にセットするバージョン
* @see \BaserCore\Command\CreateReleaseCommand::setupComposer()
* @see \BaserCore\Utility\BcComposer::setupComposerForDistribution()
*/
'setupVersion' => '5.0.*',

Expand Down
24 changes: 2 additions & 22 deletions plugins/baser-core/src/Command/CreateReleaseCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace BaserCore\Command;

use BaserCore\Utility\BcComposer;
use Cake\Command\Command;
use Cake\Console\Arguments;
use Cake\Console\ConsoleIo;
Expand Down Expand Up @@ -70,7 +71,7 @@ public function execute(Arguments $args, ConsoleIo $io)
$this->clonePackage($packagePath, $args->getArgument('branch'));

$io->out(__d('baser_core', '- composer.json をセットアップします。'));
$this->setupComposer($packagePath);
BcComposer::setupComposerForDistribution($packagePath);

$io->out(__d('baser_core', '- プラグインを初期化します。'));
$this->deletePlugins($packagePath);
Expand All @@ -89,27 +90,6 @@ public function execute(Arguments $args, ConsoleIo $io)
$io->out(__d('baser_core', 'リリースパッケージの作成が完了しました。/tmp/basercms.zip を確認してください。'));
}

/**
* composer.json を配布用にセットアップする
*
* @param string $packagePath
* @checked
* @noTodo
*/
public function setupComposer(string $packagePath)
{
$composer = $packagePath . 'composer.json';
$file = new File($composer);
$data = $file->read();
$regex = '/^(.+?) "replace": {.+?},\n(.+?)/s';
$data = preg_replace($regex, "$1$2", $data);
$regex = '/^(.+?"cakephp\/cakephp": ".+?",)(.+?)$/s';
$setupVersion = Configure::read('BcApp.setupVersion');
$replace = "$1\n \"baserproject/baser-core\": \"{$setupVersion}\",$2";
$data = preg_replace($regex, $replace, $data);
$file->write($data);
}

/**
* パッケージを GitHub よりクローンする
*
Expand Down
24 changes: 24 additions & 0 deletions plugins/baser-core/src/Utility/BcComposer.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

namespace BaserCore\Utility;

use Cake\Core\Configure;
use Cake\Filesystem\File;
use Exception;
use BaserCore\Annotation\UnitTest;
use BaserCore\Annotation\NoTodo;
Expand Down Expand Up @@ -217,4 +219,26 @@ public static function createCommand(string $command)
return self::$cd . ' ' . self::$export . ' echo y | ' . self::$php . ' ' . self::$composerDir . 'composer.phar ' . $command . ' 2>&1';
}

/**
* 配布用に composer.json をセットアップする
* @param string $packagePath
* @return void
* @noTodo
* @checked
* @unitTest
*/
public static function setupComposerForDistribution(string $packagePath)
{
$composer = $packagePath . 'composer.json';
$file = new File($composer);
$data = $file->read();
$regex = '/^(.+?) "replace": {.+?},\n(.+?)/s';
$data = preg_replace($regex, "$1$2", $data);
$regex = '/^(.+?"cakephp\/cakephp": ".+?",)(.+?)$/s';
$setupVersion = Configure::read('BcApp.setupVersion');
$replace = "$1\n \"baserproject/baser-core\": \"{$setupVersion}\",$2";
$data = preg_replace($regex, $replace, $data);
$file->write($data);
}

}
118 changes: 118 additions & 0 deletions plugins/baser-core/tests/TestCase/Command/ComposerCommandTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?php
/**
* baserCMS : Based Website Development Project <https://basercms.net>
* Copyright (c) NPO baser foundation <https://baserfoundation.org/>
*
* @copyright Copyright (c) NPO baser foundation
* @link https://basercms.net baserCMS Project
* @since 5.0.0
* @license https://basercms.net/license/index.html MIT License
*/

namespace BaserCore\Test\TestCase\Command;

use BaserCore\TestSuite\BcTestCase;
use BaserCore\Utility\BcComposer;
use Cake\Command\Command;
use Cake\Console\TestSuite\ConsoleIntegrationTestTrait;
use Cake\Filesystem\File;
use Cake\Filesystem\Folder;

/**
* ComposerCommandTest
*/
class ComposerCommandTest extends BcTestCase
{

/**
* Trait
*/
use ConsoleIntegrationTestTrait;

/**
* setUp
*
* @return void
*/
public function setUp(): void
{
parent::setUp();
$this->useCommandRunner();
}

/**
* test buildOptionParser
* @return void
*/
public function testBuildOptionParser()
{
$this->exec('composer --help');
$this->assertOutputContains('データベース接続名');
$this->assertOutputContains('実行対象ディレクトリ');
$this->assertOutputContains('アップデート対象のバージョン番号');
}

/**
* test execute
* @return void
*/
public function testExecute()
{
// バージョン指定なし
$this->exec('composer');
$this->assertErrorContains('Missing required argument. The `version` argument is required');
$this->assertExitError();

// composer.json / composer.lock をバックアップ
copy(ROOT . DS . 'composer.json', ROOT . DS . 'composer.json.bak');
copy(ROOT . DS . 'composer.lock', ROOT . DS . 'composer.lock.bak');

// composer実行(composer.json を配布用にセットアップなし)
$this->exec('composer 5.0.15');
$this->assertExitError();
$this->assertErrorContains('Composer によるアップデートが失敗しました。update ログを確認してください。');

// composer実行(composer.json を配布用にセットアップ)
BcComposer::setupComposerForDistribution(ROOT . DS);
$this->exec('composer 5.0.15');
$this->assertExitCode(Command::CODE_SUCCESS);
$this->assertOutputContains('Composer によるアップデートが完了しました。');

// バージョンを確認
$file = new File(ROOT . DS . 'vendor' . DS . 'baserproject' . DS . 'baser-core' . DS . 'VERSION.txt');
$versionData = $file->read();
$aryVersionData = explode("\n", $versionData);
$this->assertEquals('5.0.15', $aryVersionData[0]);

// バックアップをリストア
rename(ROOT . DS . 'composer.json.bak', ROOT . DS . 'composer.json');
rename(ROOT . DS . 'composer.lock.bak', ROOT . DS . 'composer.lock');
// vendor/baserproject を削除
(new Folder())->delete(ROOT . DS . 'vendor' . DS . 'baserproject');
}

/**
* test execute on update tmp
* @return void
*/
public function testExecuteOnUpdateTmp()
{
// 一時ファイル作成
(new Folder())->create(TMP . 'update');
(new Folder(ROOT . DS . 'vendor'))->copy(TMP . 'update' . DS . 'vendor');
copy(ROOT . DS . 'composer.json', TMP . 'update' . DS . 'composer.json');
copy(ROOT . DS . 'composer.lock', TMP . 'update' . DS . 'composer.lock');
// composer.json を配布用にセットアップ
BcComposer::setupComposerForDistribution(TMP . 'update' . DS);
// composer 実行
$this->exec('composer 5.0.15 --dir ' . TMP . 'update');
// バージョンを確認
$file = new File(TMP . 'update' . DS . 'vendor' . DS . 'baserproject' . DS . 'baser-core' . DS . 'VERSION.txt');
$versionData = $file->read();
$aryVersionData = explode("\n", $versionData);
$this->assertEquals('5.0.15', $aryVersionData[0]);
// 一時ファイル削除
(new Folder())->delete(TMP . 'update');
}

}
20 changes: 20 additions & 0 deletions plugins/baser-core/tests/TestCase/Utility/BcComposerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,24 @@ public function testClearCache()
$this->assertFileDoesNotExist(ROOT . DS . 'composer' . DS . '.composer' . DS . 'cache' . DS . '.htaccess');
}

/**
* test setupComposerForDistribution
*/
public function testSetupComposerForDistribution()
{
// composer.json をバックアップ
$composer = ROOT . DS . 'composer.json';
copy($composer, ROOT . DS . 'composer.json.bak');

// 実行
BcComposer::setupComposerForDistribution(ROOT . DS);
$file = new File($composer);
$data = $file->read();
$this->assertNotFalse(strpos($data, '"baserproject/baser-core": '));
$this->assertFalse(strpos($data, '"replace": {'));

// バックアップをリストア
rename(ROOT . DS . 'composer.json.bak', ROOT . DS . 'composer.json');
}

}

0 comments on commit 00a59ac

Please sign in to comment.