【Laravel Prompts】progressのコールバックの表示更新PR

Laravel

Laravel11の公式パッケージ Promptsで提案されているprogressのコールバックの表示更新の修正が反映されそうです。

Allow re-rendering during progress callback by jessarcher · Pull Request #155 · laravel/prompts
This PR allows developers to update the progress label and hint at any point during their callback by calling the render...

これは、Issue#153で提示されていた、「progress実行の途中で表示が即時更新されない」という内容に対する修正です。

Progress bar label and hint not updating immediately · Issue #153 · laravel/prompts
Laravel Prompts Version 0.1.23 Laravel Version 11.10 PHP Version 8.2.20 Operating System & Version Ubuntu 22.04 Terminal...

※2024/06/18追記:昨晩、Joe Tannenbaum氏のレビュー前にTaylor氏によってmainブランチにmergeされました。

※2024/06/19追記:本日、v0.1.24としてリリースされました。

修正内容

この PR により、開発者は、Progress クラスの render メソッドを呼び出すことで、コールバック中の任意の時点で進行状況ラベルとヒントを更新できます。以前は、再レンダリングは各ステップの間でのみ発生したため、これから起こることを反映するようにラベルやヒントを更新することはできませんでした。

従来の仕様では、progressのコールバックの表示反映は、

パフォーマンス上の理由により、各ステップの間に1回だけ実行されるようになっていました。

今回の修正PRでは、従来の仕様に加えて、progressのコールバック内の任意のステップで即時反映できるようになっています。

従来の仕様

例えば、次のようなコードのように、

コールバック内の複数のステップで「label()」や「hint()」で表示を更新しようとしても、各ステップ毎の表示に反映されるのは、コールバック内の最後に実行される「label()」や「hint()」のみです。

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use function Laravel\Prompts\progress;

progress(
    label: 'アップロード中...',
    steps: [
        'file1.zip',
        'file2.zip',
    ],
    callback: function ($step, $progress) {
        sleep(1);
        $progress->label("{$step}をアップロード中...")
                  ->hint(rand(5, 10).'MB');
        sleep(1);

        $progress->label("{$step}の内容チェック中...")
                 ->hint("ZIP形式");
        sleep(1);

        $progress->label("{$step}のアップロード完了");
    },
);

つまり、このコードで表示されるのは、

label:「***.zipのアップロード完了」

hint:「ZIP形式」

のみです。

「***.zipをアップロード中」や、「***MB」は表示されません。

今回のPRでは、コールバック内で明示的に「render()」を実行することで、好きなステップで表示更新できるようにしたということです。

PRの内容をローカルに反映してみる

1.Laravel Promptsインストール

mkdir prompts-pr155
cd prompts-pr155
composer require laravel/prompts

2.PR元のリポジトリをブランチ指定でクローン

※2024/06/18追記:mainブランチにmergeされ、PR元のブランチは削除されました。

git clone -b allow-rerendering-during-progress-steps https://github.com/laravel/prompts.git

3.vendor内のsrcを差し替え

cp -raf prompts/src vendor/laravel/prompts/

実行コード

▼「src/progress.php」

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use function Laravel\Prompts\progress;

progress(
    label: 'アップロード中...',
    steps: [
        'file1.zip',
        'file2.zip',
    ],
    callback: function ($step, $progress) {
        sleep(1);
        $progress->label("{$step}をアップロード中...")
                  ->hint(rand(5, 10).'MB')
                  ->render();
        sleep(1);

        $progress->label("{$step}の内容チェック中...")
                 ->hint("ZIP形式")
                 ->render();
        sleep(1);

        // 各ステップ毎のコールバック完了時に、
        // プロンプ​​トがプログレスバーを再描画するので、
        // ここで「render」を呼び出すことは意味がありません。
        $progress->label("{$step}のアップロード完了");
    },
);

実行結果

▼こんな感じになります。

執筆時点で、このPRはまだレビュー待ちで、

筆者的には他にもメンテすべき箇所があると思われるので

早くて2024/6/24の週にリリースされるのではないかと思います。

※2024/06/18追記:昨晩、Joe Tannenbaum氏のレビュー前にTaylor氏が早々にマージしました。

※今週リリースされるのではないでしょうか。

※2024/06/19追記:本日、v0.1.24としてリリースされました。

コメント

タイトルとURLをコピーしました