Class: Fastlane::Runner
- Inherits:
-
Object
- Object
- Fastlane::Runner
- Defined in:
- lib/fastlane/runner.rb
Instance Attribute Summary collapse
-
#current_lane ⇒ Object
Symbol for the current lane.
-
#current_platform ⇒ Object
Symbol for the current platform.
-
#lanes ⇒ Hash
All the lanes available, first the platform, then the lane.
Instance Method Summary collapse
- #add_lane(lane, override = false) ⇒ Object
- #after_all_blocks ⇒ Object
-
#available_lanes(filter_platform = nil) ⇒ Object
An array of lanes (platform lane_name) to print them out to the user.
- #before_all_blocks ⇒ Object
- #collector ⇒ Object
-
#did_finish ⇒ Object
Fastfile was finished executing.
- #error_blocks ⇒ Object
-
#execute(lane, platform = nil, parameters = nil) ⇒ Object
This will take care of executing one lane.
- #execute_action(method_sym, class_ref, arguments) ⇒ Object
- #full_lane_name ⇒ Object
- #set_after_all(platform, block) ⇒ Object
- #set_before_all(platform, block) ⇒ Object
- #set_error(platform, block) ⇒ Object
-
#try_switch_to_lane(new_lane, parameters) ⇒ Object
All the methods that are usually called on execution.
- #verify_supported_os(name, class_ref) ⇒ Object
Instance Attribute Details
#current_lane ⇒ Object
Symbol for the current lane
4 5 6 |
# File 'lib/fastlane/runner.rb', line 4 def current_lane @current_lane end |
#current_platform ⇒ Object
Symbol for the current platform
7 8 9 |
# File 'lib/fastlane/runner.rb', line 7 def current_platform @current_platform end |
#lanes ⇒ Hash
Returns All the lanes available, first the platform, then the lane.
10 11 12 |
# File 'lib/fastlane/runner.rb', line 10 def lanes @lanes end |
Instance Method Details
#add_lane(lane, override = false) ⇒ Object
177 178 179 180 181 182 183 184 185 |
# File 'lib/fastlane/runner.rb', line 177 def add_lane(lane, override = false) lanes[lane.platform] ||= {} if !override and lanes[lane.platform][lane.name] raise "Lane '#{lane.name}' was defined multiple times!".red end lanes[lane.platform][lane.name] = lane end |
#after_all_blocks ⇒ Object
207 208 209 |
# File 'lib/fastlane/runner.rb', line 207 def after_all_blocks @after_all ||= {} end |
#available_lanes(filter_platform = nil) ⇒ Object
Returns an array of lanes (platform lane_name) to print them out to the user.
73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/fastlane/runner.rb', line 73 def available_lanes(filter_platform = nil) all = [] lanes.each do |platform, platform_lanes| next if (filter_platform and filter_platform.to_s != platform.to_s) # skip actions that don't match platform_lanes.each do |lane_name, lane| all << [platform, lane_name].reject(&:nil?).join(' ') unless lane.is_private end end all end |
#before_all_blocks ⇒ Object
203 204 205 |
# File 'lib/fastlane/runner.rb', line 203 def before_all_blocks @before_all ||= {} end |
#collector ⇒ Object
164 165 166 |
# File 'lib/fastlane/runner.rb', line 164 def collector @collector ||= ActionCollector.new end |
#did_finish ⇒ Object
Fastfile was finished executing
169 170 171 |
# File 'lib/fastlane/runner.rb', line 169 def did_finish collector.did_finish end |
#error_blocks ⇒ Object
211 212 213 |
# File 'lib/fastlane/runner.rb', line 211 def error_blocks @error_blocks ||= {} end |
#execute(lane, platform = nil, parameters = nil) ⇒ Object
This will take care of executing one lane. Thatβs when the user triggers a lane from the CLI for example This method is not executed when switching a lane
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 |
# File 'lib/fastlane/runner.rb', line 21 def execute(lane, platform = nil, parameters = nil) raise "No lane given" unless lane self.current_lane = lane.to_sym self.current_platform = (platform ? platform.to_sym : nil) lane_obj = (lanes[current_platform][current_lane] rescue nil) raise "Could not find lane '#{full_lane_name}'. Available lanes: #{available_lanes.join(', ')}".red unless lane_obj raise "You can't call the private lane '#{lane}' directly" if lane_obj.is_private ENV["FASTLANE_LANE_NAME"] = current_lane.to_s ENV["FASTLANE_PLATFORM_NAME"] = (current_platform ? current_platform.to_s : nil) Actions.lane_context[Actions::SharedValues::PLATFORM_NAME] = current_platform Actions.lane_context[Actions::SharedValues::LANE_NAME] = full_lane_name Helper.log.info "Driving the lane '#{full_lane_name}' π".green return_val = nil path_to_use = Fastlane::FastlaneFolder.path || Dir.pwd begin Dir.chdir(path_to_use) do # the file is located in the fastlane folder # Call the platform specific before_all block and then the general one before_all_blocks[current_platform].call(current_lane) if (before_all_blocks[current_platform] and current_platform) before_all_blocks[nil].call(current_lane) if before_all_blocks[nil] return_val = lane_obj.call(parameters || {}) # by default no parameters # `after_all` is only called if no exception was raised before # Call the platform specific before_all block and then the general one after_all_blocks[current_platform].call(current_lane) if (after_all_blocks[current_platform] and current_platform) after_all_blocks[nil].call(current_lane) if (after_all_blocks[nil]) end return return_val rescue => ex Dir.chdir(path_to_use) do # Provide error block exception without colour code error_ex = ex.exception(ex..gsub(/\033\[\d+m/, '')) error_blocks[current_platform].call(current_lane, error_ex) if (error_blocks[current_platform] and current_platform) error_blocks[nil].call(current_lane, error_ex) if error_blocks[nil] end raise ex end end |
#execute_action(method_sym, class_ref, arguments) ⇒ Object
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 |
# File 'lib/fastlane/runner.rb', line 118 def execute_action(method_sym, class_ref, arguments) collector.did_launch_action(method_sym) step_name = class_ref.step_text rescue nil step_name = method_sym.to_s unless step_name verify_supported_os(method_sym, class_ref) begin Dir.chdir('..') do # go up from the fastlane folder, to the project folder Actions.execute_action(class_ref.step_text) do # arguments is an array by default, containing an hash with the actual parameters # Since we usually just need the passed hash, we'll just use the first object if there is only one if arguments.count == 0 arguments = ConfigurationHelper.parse(class_ref, {}) # no parameters => empty hash elsif arguments.count == 1 and arguments.first.kind_of?Hash arguments = ConfigurationHelper.parse(class_ref, arguments.first) # Correct configuration passed elsif not class_ref. # This action does not use the new action format # Just passing the arguments to this method else raise "You have to pass the options for '#{method_sym}' in a different way. Please check out the current documentation on GitHub!".red end class_ref.run(arguments) end end rescue => ex collector.did_raise_error(method_sym) raise ex end end |
#full_lane_name ⇒ Object
12 13 14 |
# File 'lib/fastlane/runner.rb', line 12 def full_lane_name [current_platform, current_lane].reject(&:nil?).join(' ') end |
#set_after_all(platform, block) ⇒ Object
191 192 193 |
# File 'lib/fastlane/runner.rb', line 191 def set_after_all(platform, block) after_all_blocks[platform] = block end |
#set_before_all(platform, block) ⇒ Object
187 188 189 |
# File 'lib/fastlane/runner.rb', line 187 def set_before_all(platform, block) before_all_blocks[platform] = block end |
#set_error(platform, block) ⇒ Object
195 196 197 |
# File 'lib/fastlane/runner.rb', line 195 def set_error(platform, block) error_blocks[platform] = block end |
#try_switch_to_lane(new_lane, parameters) ⇒ Object
All the methods that are usually called on execution
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 |
# File 'lib/fastlane/runner.rb', line 89 def try_switch_to_lane(new_lane, parameters) block = lanes.fetch(current_platform, {}).fetch(new_lane, nil) block ||= lanes.fetch(nil, {}).fetch(new_lane, nil) # fallback to general lane for multiple platforms if block original_full = full_lane_name original_lane = current_lane raise "Parameters for a lane must always be a hash".red unless (parameters.first || {}).kind_of?Hash pretty = [new_lane] pretty = [current_platform, new_lane] if current_platform Actions.execute_action("Switch to #{pretty.join(' ')} lane") {} # log the action Helper.log.info "Cruising over to lane '#{pretty.join(' ')}' π".green # Actually switch lane now current_lane = new_lane collector.did_launch_action(:lane_switch) result = block.call(parameters.first || {}) # to always pass a hash current_lane = original_lane Helper.log.info "Cruising back to lane '#{original_full}' π".green return result else # No action and no lane, raising an exception now Helper.log.error caller.join("\n") raise "Could not find action or lane '#{new_lane}'. Check out the README for more details: https://github.com/KrauseFx/fastlane".red end end |
#verify_supported_os(name, class_ref) ⇒ Object
151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/fastlane/runner.rb', line 151 def verify_supported_os(name, class_ref) if class_ref.respond_to?(:is_supported?) if Actions.lane_context[Actions::SharedValues::PLATFORM_NAME] # This value is filled in based on the executed platform block. Might be nil when lane is in root of Fastfile platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME] unless class_ref.is_supported?(platform) raise "Action '#{name}' doesn't support required operating system '#{platform}'.".red end end end end |