Class: Snapshot::Runner

Inherits:
Object
  • Object
show all
Defined in:
snapshot/lib/snapshot/runner.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.path_to_helper_file_from_gemObject

Depending on the Xcode version, the return value is different

[View source]

97
98
99
100
101
102
103
104
105
# File 'snapshot/lib/snapshot/runner.rb', line 97

def self.path_to_helper_file_from_gem
  runner_dir = File.dirname(__FILE__)

  if Helper.xcode_at_least?("9.0")
    return File.expand_path('../assets/SnapshotHelper.swift', runner_dir)
  else
    return File.expand_path('../assets/SnapshotHelperXcode8.swift', runner_dir)
  end
end

Instance Method Details

#clear_previous_screenshotsObject

[View source]

87
88
89
90
91
92
93
94
# File 'snapshot/lib/snapshot/runner.rb', line 87

def clear_previous_screenshots
  UI.important("Clearing previously generated screenshots")
  path = File.join(Snapshot.config[:output_directory], "*", "*.png")
  Dir[path].each do |current|
    UI.verbose("Deleting #{current}")
    File.delete(current)
  end
end
[View source]

65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'snapshot/lib/snapshot/runner.rb', line 65

def print_results(results)
  return if results.count == 0

  rows = []
  results.each do |device, languages|
    current = [device]
    languages.each do |language, value|
      current << (value == true ? " 💚" : " ❌")
    end
    rows << current
  end

  params = {
    rows: FastlaneCore::PrintTable.transform_output(rows),
    headings: ["Device"] + results.values.first.keys,
    title: "snapshot results"
  }
  puts("")
  puts(Terminal::Table.new(params))
  puts("")
end

#verify_helper_is_currentObject

rubocop:disable Style/Next

[View source]

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
# File 'snapshot/lib/snapshot/runner.rb', line 119

def verify_helper_is_current
  return if Snapshot.config[:skip_helper_version_check]
  current_version = version_of_bundled_helper
  UI.verbose("Checking that helper files contain #{current_version}")

  helper_files = Update.find_helper
  if helper_files.empty?
    UI.error("Your Snapshot Helper file is missing, please place a copy")
    UI.error("in your project directory")
    UI.message("More information about Snapshot setup can be found here:")
    UI.message("https://docs.fastlane.tools/actions/snapshot/#quick-start")
    UI.user_error!("Please add a Snapshot Helper file to your project")
    return
  end

  helper_files.each do |path|
    content = File.read(path)

    unless content.include?(current_version)
      UI.error("Your '#{path}' is outdated, please run `fastlane snapshot update`")
      UI.error("to update your Helper file")
      UI.user_error!("Please update your Snapshot Helper file using `fastlane snapshot update`")
    end
  end
end

#version_of_bundled_helperObject

[View source]

107
108
109
110
111
112
113
114
115
116
# File 'snapshot/lib/snapshot/runner.rb', line 107

def version_of_bundled_helper
  asset_path = self.class.path_to_helper_file_from_gem
  regex_to_use = Helper.xcode_at_least?("9.0") ? /\n.*SnapshotHelperVersion \[.+\]/ : /\n.*SnapshotHelperXcode8Version \[.+\]/

  bundled_helper = File.read(asset_path)
  current_version = bundled_helper.match(regex_to_use)[0]

  # Something like "// SnapshotHelperVersion [1.2]", but be relaxed about whitespace
  return current_version.gsub(%r{^//\w*}, '').strip
end

#workObject

[View source]

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
# File 'snapshot/lib/snapshot/runner.rb', line 18

def work
  if File.exist?("./fastlane/snapshot.js") || File.exist?("./snapshot.js")
    UI.error("Found old snapshot configuration file 'snapshot.js'")
    UI.error("You updated to snapshot 1.0 which now uses UI Automation")
    UI.error("Please follow the migration guide: https://github.com/fastlane/fastlane/blob/master/snapshot/MigrationGuide.md")
    UI.error("And read the updated documentation: https://docs.fastlane.tools/actions/snapshot/")
    sleep(3) # to be sure the user sees this, as compiling clears the screen
  end

  Snapshot.config[:output_directory] = File.expand_path(Snapshot.config[:output_directory])

  verify_helper_is_current

  # Also print out the path to the used Xcode installation
  # We go 2 folders up, to not show "Contents/Developer/"
  values = Snapshot.config.values(ask: false)
  values[:xcode_path] = File.expand_path("../..", FastlaneCore::Helper.xcode_path)
  FastlaneCore::PrintTable.print_values(config: values, hide_keys: [], title: "Summary for snapshot #{Fastlane::VERSION}")

  clear_previous_screenshots if Snapshot.config[:clear_previous_screenshots]

  UI.success("Building and running project - this might take some time...")

  launcher_config = SimulatorLauncherConfiguration.new(snapshot_config: Snapshot.config)

  if Helper.xcode_at_least?(9)
    launcher = SimulatorLauncher.new(launcher_configuration: launcher_config)
    results = launcher.take_screenshots_simultaneously
  else
    launcher = SimulatorLauncherXcode8.new(launcher_configuration: launcher_config)
    results = launcher.take_screenshots_one_simulator_at_a_time
  end

  print_results(results)

  UI.test_failure!(launcher.collected_errors.uniq.join('; ')) if launcher.collected_errors.count > 0

  # Generate HTML report
  ReportsGenerator.new.generate

  # Clear the Derived Data
  unless Snapshot.config[:derived_data_path]
    # this should actually be launcher.derived_data_path
    FileUtils.rm_rf(TestCommandGeneratorBase.derived_data_path)
  end
end