thephpleague / climate

PHP's best friend for the terminal.
http://climate.thephpleague.com
MIT License
1.87k stars 123 forks source link

If length of checkbox option is larger than screenWidth Exception is thrown #161

Closed pvdhurk closed 3 years ago

pvdhurk commented 3 years ago

https://github.com/thephpleague/climate/blob/6b53a28a58ad9f5f63042e291eb870cf0d02a9c9/src/TerminalObject/Dynamic/Checkbox/Checkbox.php#L178

In my case, the radio option is 86 in length and the screen is 80, -6 results in the below exception:

PHP Fatal error:  Method League\CLImate\TerminalObject\Dynamic\Checkbox\Checkbox::__toString() must not throw an exception, caught Whoops\Exception\ErrorException: str_repeat(): Second argument has to be greater than or equal to 0 in /Users/patrick/Documents/Development/git/cap2missioncontrol/vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/CheckboxGroup.php on line 0
PHP Stack trace:
PHP   1. {main}() /Users/patrick/Documents/Development/git/cap2missioncontrol/console:0
PHP   2. Base->run() /Users/patrick/Documents/Development/git/cap2missioncontrol/console:77
PHP   3. Base->call($func = *uninitialized*, $args = *uninitialized*, $hooks = *uninitialized*) /Users/patrick/Documents/Development/git/cap2missioncontrol/vendor/bcosca/fatfree-core/base.php:1727
PHP   4. {closure:/Users/patrick/Documents/Development/git/cap2missioncontrol/console:34-75}($f3 = *uninitialized*, *uninitialized*, *uninitialized*) /Users/patrick/Documents/Development/git/cap2missioncontrol/vendor/bcosca/fatfree-core/base.php:1927
PHP   5. Cap2\MissionControl\Console\AbstractTask::execute($cmd = *uninitialized*, $task = *uninitialized*) /Users/patrick/Documents/Development/git/cap2missioncontrol/console:74
PHP   6. Cap2\MissionControl\Console\Db->testTenant() /Users/patrick/Documents/Development/git/cap2missioncontrol/src/Console/AbstractTask.php:127
PHP   7. Cap2\MissionControl\Console\Db->consoleReturnDatabaseAndPort() /Users/patrick/Documents/Development/git/cap2missioncontrol/src/Console/Db.php:154
PHP   8. League\CLImate\TerminalObject\Dynamic\Radio->prompt() /Users/patrick/Documents/Development/git/cap2missioncontrol/src/Console/Db.php:232
PHP   9. League\CLImate\TerminalObject\Dynamic\Radio->writeCheckboxes() /Users/patrick/Documents/Development/git/cap2missioncontrol/vendor/league/climate/src/TerminalObject/Dynamic/Checkboxes.php:34
PHP  10. League\CLImate\TerminalObject\Dynamic\Radio->updateCheckboxView() /Users/patrick/Documents/Development/git/cap2missioncontrol/vendor/league/climate/src/TerminalObject/Dynamic/Checkboxes.php:68
PHP  11. League\CLImate\TerminalObject\Dynamic\Checkbox\RadioGroup->write() /Users/patrick/Documents/Development/git/cap2missioncontrol/vendor/league/climate/src/TerminalObject/Dynamic/Checkboxes.php:157
PHP  12. array_map(*uninitialized*, *uninitialized*) /Users/patrick/Documents/Development/git/cap2missioncontrol/vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/CheckboxGroup.php:31
PHP  13. League\CLImate\TerminalObject\Dynamic\Checkbox\RadioGroup->writeCheckbox($checkbox = *uninitialized*) /Users/patrick/Documents/Development/git/cap2missioncontrol/vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/CheckboxGroup.php:31
Fatal error: Method League\CLImate\TerminalObject\Dynamic\Checkbox\Checkbox::__toString() must not throw an exception, caught Whoops\Exception\ErrorException: str_repeat(): Second argument has to be greater than or equal to 0
[vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/CheckboxGroup.php:0] 

Suggested change:

    /**
     * Get the padding string based on the length of the terminal/line
     *
     * @param string $line
     *
     * @return string
     */
    protected function getPaddingString($line)
    {
        $length = $this->util->width() - $this->lengthWithoutTags($line);

        return $length>=0 : str_repeat(' ', $length) ? '';
    }
duncan3dc commented 3 years ago

This is fixed in 3.6.0 thanks for the report!

pvdhurk commented 3 years ago

Happy to help :)