Class: Fastlane::FastFile

Inherits:
Object
  • Object
show all
Defined in:
lib/fastlane/fast_file.rb

Instance Attribute Summary collapse

DSL collapse

Other things collapse

Instance Method Summary collapse

Constructor Details

#initialize(path = nil) ⇒ Object

Returns The runner which can be executed to trigger the given actions.



6
7
8
9
10
11
12
13
# File 'lib/fastlane/fast_file.rb', line 6

def initialize(path = nil)
  return unless (path || '').length > 0
  raise "Could not find Fastfile at path '#{path}'".red unless File.exist?(path)
  @path = path
  content = File.read(path)

  parse(content)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_sym, *arguments, &_block) ⇒ Object

Is used to look if the method is implemented as an action



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
# File 'lib/fastlane/fast_file.rb', line 70

def method_missing(method_sym, *arguments, &_block)
  # First, check if there is a predefined method in the actions folder

  class_name = method_sym.to_s.fastlane_class + 'Action'
  class_ref = nil
  begin
    class_ref = Fastlane::Actions.const_get(class_name)
  rescue NameError => ex
    # Action not found
    raise "Could not find method '#{method_sym}'. Check out the README for more details: https://github.com/KrauseFx/fastlane".red
  end

  if class_ref && class_ref.respond_to?(:run)
    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)

    Helper.log_alert("Step: " + step_name)

    begin
      Dir.chdir('..') do # go up from the fastlane folder, to the project folder
        Actions.execute_action(method_sym) 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 hsh
          elsif arguments.count == 1 and arguments.first.kind_of?Hash
            arguments = ConfigurationHelper.parse(class_ref, arguments.first) # Correct configuration passed
          elsif not class_ref.available_options
            # This action does not use the new action format
            # Just passing the arguments to this method
          else
            Helper.log.fatal "------------------------------------------------------------------------------------".red
            Helper.log.fatal "If you've been an existing fastlane user, please check out the MigrationGuide to 1.0".yellow
            Helper.log.fatal "https://github.com/KrauseFx/fastlane/blob/master/docs/MigrationGuide.md".yellow
            Helper.log.fatal "------------------------------------------------------------------------------------".red
            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
  else
    raise "Action '#{method_sym}' of class '#{class_name}' was found, but has no `run` method.".red
  end
end

Instance Attribute Details

#runnerObject

Returns the value of attribute runner.



3
4
5
# File 'lib/fastlane/fast_file.rb', line 3

def runner
  @runner
end

Instance Method Details

#actions_path(path) ⇒ Object



148
149
150
151
152
# File 'lib/fastlane/fast_file.rb', line 148

def actions_path(path)
  raise "Path '#{path}' not found!".red unless File.directory?(path)

  Actions.load_external_actions(path)
end

#after_all(&block) ⇒ Object

Is executed after each test run



60
61
62
# File 'lib/fastlane/fast_file.rb', line 60

def after_all(&block)
  @runner.set_after_all(@current_platform, block)
end

#before_all(&block) ⇒ Object

Is executed before each test run



55
56
57
# File 'lib/fastlane/fast_file.rb', line 55

def before_all(&block)
  @runner.set_before_all(@current_platform, block)
end

#collectorObject



183
184
185
# File 'lib/fastlane/fast_file.rb', line 183

def collector
  @collector ||= ActionCollector.new
end

#desc(string) ⇒ Object



179
180
181
# File 'lib/fastlane/fast_file.rb', line 179

def desc(string)
  desc_collection << string
end

#desc_collectionObject



187
188
189
# File 'lib/fastlane/fast_file.rb', line 187

def desc_collection
  @desc_collection ||= []
end

#did_finishObject

Fastfile was finished executing



175
176
177
# File 'lib/fastlane/fast_file.rb', line 175

def did_finish
  collector.did_finish
end

#error(&block) ⇒ Object

Is executed if an error occured during fastlane execution



65
66
67
# File 'lib/fastlane/fast_file.rb', line 65

def error(&block)
  @runner.set_error(@current_platform, block)
end

#is_platform_block?(key) ⇒ Boolean

Is the given key a platform block or a lane?

Returns:

  • (Boolean)


139
140
141
142
143
144
145
146
# File 'lib/fastlane/fast_file.rb', line 139

def is_platform_block?(key)
  raise 'No key given'.red unless key

  return false if (self.runner.blocks[nil][key.to_sym] rescue false)
  return true if self.runner.blocks[key.to_sym].kind_of?Hash

  raise "Could not find '#{key}'. Available lanes: #{self.runner.available_lanes.join(', ')}".red
end

#lane(lane_name, &block) ⇒ Object

User defines a new lane



32
33
34
35
36
37
38
39
40
41
# File 'lib/fastlane/fast_file.rb', line 32

def lane(lane_name, &block)
  raise "You have to pass a block using 'do' for lane '#{lane_name}'. Make sure you read the docs on GitHub.".red unless block
  
  desc = desc_collection.join("\n\n")
  platform = @current_platform

  @runner.set_block(lane_name, platform, block, desc)

  @desc_collection = nil # reset the collected description again for the next lane
end

#parse(data) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'lib/fastlane/fast_file.rb', line 15

def parse(data)
  @runner = Runner.new

  Dir.chdir(Fastlane::FastlaneFolder.path || Dir.pwd) do # context: fastlane subfolder
    eval(data) # this is okay in this case
  end

  self
end

#platform(platform_name, &block) ⇒ Object

User defines a platform block



44
45
46
47
48
49
50
51
52
# File 'lib/fastlane/fast_file.rb', line 44

def platform(platform_name, &block)
  SupportedPlatforms.verify!platform_name

  @current_platform = platform_name

  block.call

  @current_platform = nil
end

#say(value) ⇒ Object

Speak out loud



130
131
132
133
134
135
136
# File 'lib/fastlane/fast_file.rb', line 130

def say(value)
  # Overwrite this, since there is already a 'say' method defined in the Ruby standard library
  value ||= yield
  Actions.execute_action('say') do
    Fastlane::Actions::SayAction.run([value])
  end
end

#sh(command) ⇒ Object

Execute shell command



155
156
157
158
159
# File 'lib/fastlane/fast_file.rb', line 155

def sh(command)
  Actions.execute_action(command) do
    Actions.sh_no_action(command)
  end
end

#verify_supported_os(name, class_ref) ⇒ Object



161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/fastlane/fast_file.rb', line 161

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