Class: FastlaneCore::Shell

Inherits:
Object
  • Object
show all
Defined in:
lib/fastlane/plugin/wpmreleasetoolkit/helper/interactive_prompt_reminder.rb

Overview

NOTE: FastlaneCore::UI delegates to the FastlaneCore::Shell implementation when output is the terminal

Constant Summary collapse

DEFAULT_PROMPT_REMINDER_MESSAGE =
'An interactive prompt is waiting for you in the Terminal!'.freeze
DEFAULT_PROMPT_REMINDER_DELAYS =
[30, 180, 600].freeze

Class Method Summary collapse

Class Method Details

.monkey_patch_interactive_prompts_with_reminder(after: DEFAULT_PROMPT_REMINDER_DELAYS, message: DEFAULT_PROMPT_REMINDER_MESSAGE) ⇒ Object

Monkey-Patch fastlane’s ‘UI.input`, `UI.confirm`, `UI.select` and `UI.password` interactive methods (which delegate to `FastlaneCore::Shell` when output is the terminal)

Once you call this method, any invocation of ‘UI.input`, `UI.confirm`, `UI.select` or `UI.password` anywhere in Fastlane (by your Fastfile, an action, …) will be wrapped in a call to with_reminder automatically.



73
74
75
76
77
78
79
80
81
# File 'lib/fastlane/plugin/wpmreleasetoolkit/helper/interactive_prompt_reminder.rb', line 73

def self.monkey_patch_interactive_prompts_with_reminder(after: DEFAULT_PROMPT_REMINDER_DELAYS, message: DEFAULT_PROMPT_REMINDER_MESSAGE)
  %i[input confirm select password].each do |method_name|
    old_method = instance_method(method_name)

    define_method(method_name) do |*args|
      FastlaneCore::Shell.with_reminder(after: after, message: message) { old_method.bind(self).call(*args) }
    end
  end
end

.with_reminder(after: DEFAULT_PROMPT_REMINDER_DELAYS, message: DEFAULT_PROMPT_REMINDER_MESSAGE) ⇒ Object

Calls the block given and remind the user with a vocal message if the block does not return after specific delays.

Especially useful when using a block which calls methods that are interactive, in order to remind the user to answer the interactive prompt if they forgot about it after some delays.

Example usage:

text = with_reminder do
  puts "Enter some text:"
  $stdout.getch
end

Parameters:

  • after (Double, Array<Double>) (defaults to: DEFAULT_PROMPT_REMINDER_DELAYS)

    Delay or list of delays to wait for before pronouncing the reminder message. If an array of values is passed, the message will be pronounced multiple times, after having waited for the subsequent delays in turn. Defaults to reminding after 30s, then 3mn, then 10mn.

  • message (String) (defaults to: DEFAULT_PROMPT_REMINDER_MESSAGE)

    The message to pronounce out loud after the delay has passed, if the block hasn’t returned beforehand.

Returns:

  • The same value that the blocks might return



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/fastlane/plugin/wpmreleasetoolkit/helper/interactive_prompt_reminder.rb', line 50

def self.with_reminder(after: DEFAULT_PROMPT_REMINDER_DELAYS, message: DEFAULT_PROMPT_REMINDER_MESSAGE)
  delays_list = Array(after.dup)
  thread = Thread.new do
    until delays_list.empty?
      sleep(delays_list.shift)
      $stdout.beep
      system('say', message) unless message.nil?
    end
  end
  # execute the interactive code
  res = yield
  # if we replied before the timeout, kill the thread so message won't be triggered
  thread.kill
  # If the block given returned a value, pass it
  res
end