Module: TwirlCLI::Options
- Defined in:
- lib/ruby-progress/cli/twirl_options.rb
Overview
Option parsing helpers for the Twirl subcommand.
Keeps the CLI option definitions extracted from the main dispatcher so the ‘TwirlCLI` module stays small and focused on dispatching.
Class Method Summary collapse
Class Method Details
.parse_cli_options ⇒ Object
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/ruby-progress/cli/twirl_options.rb', line 12 def self. = { output_position: :above, output_lines: 3 } OptionParser.new do |opts| opts. = 'Usage: prg twirl [options]' opts.separator '' opts.separator 'Animation Options:' opts.on('-s', '--speed SPEED', 'Animation speed (1-10, fast/medium/slow, or f/m/s)') do |speed| [:speed] = speed end opts.on('-m', '--message MESSAGE', 'Message to display before spinner') do || [:message] = end opts.on('--style STYLE', 'Spinner style (see --show-styles for options)') do |style| [:style] = style end opts.on('-d', '--direction DIRECTION', 'Animation direction (forward/bidirectional or f/b)') do |direction| # Twirl is a spinner and doesn't visibly change with direction, but accept the # flag for parity with other subcommands (Worm/Ripple) so scripts can use it. [:direction] = direction =~ /^f/i ? :forward_only : :bidirectional end opts.on('--ends CHARS', 'Start/end characters (even number of chars, split in half)') do |chars| [:ends] = chars end opts.separator '' opts.separator 'Command Execution:' opts.on('-c', '--command COMMAND', 'Command to run (optional - runs indefinitely without)') do |command| [:command] = command end opts.on('--output-position POSITION', 'Position to render captured output: above or below (default: above)') do |pos| [:output_position] = pos.to_sym end opts.on('--output-lines N', Integer, 'Number of output lines to reserve for captured output (default: 3)') do |n| [:output_lines] = n end opts.on('--success MESSAGE', 'Success message to display') do |text| [:success] = text end opts.on('--success-icon ICON', 'Custom success icon to show with completion messages') do |ic| [:success_icon] = ic end opts.on('--error-icon ICON', 'Custom error icon to show with failure messages') do |ic| [:error_icon] = ic end opts.on('--error MESSAGE', 'Error message to display') do |text| [:error] = text end opts.on('--checkmark', 'Show checkmarks (✅ success, 🛑 failure)') do [:checkmark] = true end opts.on('--stdout', 'Output captured command result to STDOUT') do [:stdout] = true end opts.on('--stdout-live', 'Stream captured output to STDOUT as it arrives (non-blocking)') do [:stdout_live] = true end opts.separator '' opts.separator 'Daemon Mode:' opts.on('--daemon', 'Run in background daemon mode') do [:daemon] = true end opts.on('--daemon-as NAME', 'Run in daemon mode with custom name (creates /tmp/ruby-progress/NAME.pid)') do |name| [:daemon] = true [:daemon_name] = name end opts.on('--pid-file FILE', 'Write process ID to file (default: /tmp/ruby-progress/progress.pid)') do |file| [:pid_file] = file end opts.on('--stop', 'Stop daemon (uses default PID file unless --pid-file specified)') do [:stop] = true end opts.on('--stop-id NAME', 'Stop daemon by name (automatically implies --stop)') do |name| [:stop] = true [:stop_name] = name end opts.on('--status', 'Show daemon status (uses default PID file unless --pid-file specified)') do [:status] = true end opts.on('--status-id NAME', 'Show daemon status by name') do |name| [:status] = true [:status_name] = name end opts.on('--stop-success MESSAGE', 'Stop daemon with success message (automatically implies --stop)') do |msg| [:stop] = true [:stop_success] = msg end opts.on('--stop-error MESSAGE', 'Stop daemon with error message (automatically implies --stop)') do |msg| [:stop] = true [:stop_error] = msg end opts.on('--stop-checkmark', 'When stopping, include a success checkmark') { [:stop_checkmark] = true } opts.separator '' opts.separator 'Daemon notes:' opts.separator ' - Do not append &; prg detaches itself and returns immediately.' opts.separator ' - Use --daemon-as NAME for named daemons, or --stop-id/--status-id for named control.' opts.separator '' opts.separator 'General:' opts.on('--show-styles', 'Show available twirl styles with visual previews') do PrgCLI.show_twirl_styles exit end opts.on('--stop-all', 'Stop all prg twirl processes') do success = PrgCLI.stop_subcommand_processes('twirl') exit(success ? 0 : 1) end opts.on('-v', '--version', 'Show version') do puts "Twirl version #{RubyProgress::VERSION}" exit end opts.on('-h', '--help', 'Show this help') do puts opts exit end end.parse! rescue OptionParser::InvalidOption => e puts "Invalid option: #{e.args.first}" puts '' puts 'Usage: prg twirl [options]' puts "Run 'prg twirl --help' for more information." exit 1 end |