snapshot 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 28f9044173c73c9227c4e372ca91977e262a3166
4
- data.tar.gz: 93c57e0423a893e5cb97ef1e3e7198cdeedb72c2
3
+ metadata.gz: 63d4849c32160441375a38343e1788f096de13b1
4
+ data.tar.gz: 3aeddc0b99d47752887b6164fb5b6bc13d4bae9d
5
5
  SHA512:
6
- metadata.gz: c98f7667067c7ab9e0daee297868b1c9938668152de527ecd63752db9a510a35b77f73e97f87faff5adc7f0f84eba82e164d8673808b9fb4a2f138fbc8df2bf1
7
- data.tar.gz: fb94311fe51e3f1f62e284fa46689797931e0f0cbc66d3f39d6b01420a8a4ea74487dff559063bbd8a9b57467fa176bde992f3b97ec77b758b096ffd4d9087e5
6
+ metadata.gz: 72791e5862dc34a5c23f357c4636519a3b7c180a1ed7ed038f20159bc6f29c2a683a490782a940b9bceece5bbd3ebfaa88f66f555d6e91921ccdf22feae2a88f
7
+ data.tar.gz: 962e41980b306165d10e226ba8a4228dde0f9dce9e79f3c513aafbadfe7088281673b7b39ede657e3e7d519558a2af12c1d2e7a63f631bc56b848d99e49bdc83
data/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
  <a href="https://github.com/KrauseFx/deliver">Deliver</a> &bull;
3
3
  <b>Snapshot</b> &bull;
4
4
  <a href="https://github.com/KrauseFx/frameit">FrameIt</a> &bull;
5
- <a href="https://github.com/KrauseFx/PEM">PEM</a>
5
+ <a href="https://github.com/KrauseFx/PEM">PEM</a> &bull;
6
+ <a href="https://github.com/KrauseFx/sigh">Sigh</a>
6
7
  </p>
7
8
  -------
8
9
 
@@ -10,7 +11,7 @@
10
11
  <img src="assets/snapshot.png">
11
12
  </p>
12
13
 
13
- Snapshot - Create hundreds of iOS app screenshots
14
+ Snapshot - Create iOS App Screenshots
14
15
  ============
15
16
 
16
17
  [![Twitter: @KauseFx](https://img.shields.io/badge/contact-@KrauseFx-blue.svg?style=flat)](https://twitter.com/KrauseFx)
@@ -41,13 +42,15 @@ Follow the developer on Twitter: [@KrauseFx](https://twitter.com/KrauseFx)
41
42
 
42
43
 
43
44
  -------
44
- [Features](#features) &bull;
45
- [Installation](#installation) &bull;
46
- [UI Automation](#ui-automation) &bull;
47
- [Quick Start](#quick-start) &bull;
48
- [Usage](#usage) &bull;
49
- [Tips](#tips) &bull;
50
- [Need help?](#need-help)
45
+ <p align="center">
46
+ <a href="#features">Features</a> &bull;
47
+ <a href="#installation">Installation</a> &bull;
48
+ <a href="#ui-automation">UI Automation</a> &bull;
49
+ <a href="#quick-start">Quick Start</a> &bull;
50
+ <a href="#usage">Usage</a> &bull;
51
+ <a href="#tips">Tips</a> &bull;
52
+ <a href="#need-help">Need help?</a>
53
+ </p>
51
54
 
52
55
  -------
53
56
 
@@ -56,7 +59,8 @@ Follow the developer on Twitter: [@KrauseFx](https://twitter.com/KrauseFx)
56
59
  - Create hundreds of screenshots in multiple languages on all simulators
57
60
  - Configure it once, store the configuration in git
58
61
  - Do something else, while the computer takes the screenshots for you
59
- - Very easy to integrate with ```deliver```
62
+ - Very easy to integrate with [```deliver```](https://github.com/KrauseFx/deliver)
63
+ - Generates a beautiful web page, which shows all screenshots on all devices. This is perfect to send to Q&A or the marketing team
60
64
  - ```Snapshot``` automatically waits for network requests to be finished before taking a screenshot (we don't want loading images in the App Store screenshots)
61
65
 
62
66
  After ```Snapshot``` successfully created new screenshots, it will generate a beautiful html file to get a quick overview of all screens:
@@ -184,12 +188,6 @@ By default, ```snapshot``` will look for your project in the current directory.
184
188
  project_path "./my_project/Project.xcworkspace"
185
189
  ```
186
190
 
187
- ### HTML Report Path
188
- After all screenshots were created, a HTML file will be generated, to quickly get an overview of all screens on all devices. You can set a custom export path, to easily integrate the HTML report as ```Jenkins``` test result page.
189
- ```ruby
190
- html_path "~/Desktop/screens.html"
191
- ```
192
-
193
191
  ### iOS Version
194
192
  I'll try to keep the script up to date. If you need to change the iOS version, you can do it like this:
195
193
 
@@ -238,6 +236,14 @@ end
238
236
  In case you want to skip this process, just add ```skip_alpha_removal``` to your ```Snapfile```.
239
237
 
240
238
  # Tips
239
+
240
+ ## Other helpful tools
241
+ Check out other tools in this collection to speed up your deployment process:
242
+ - [```deliver```](https://github.com/KrauseFx/deliver): Deploy screenshots, app metadata and app updates to the App Store using just one command.
243
+ - [```FrameIt```](https://github.com/KrauseFx/frameit): Want a device frame around your screenshot? Do it in an instant!
244
+ - [```PEM```](https://github.com/KrauseFx/pem): Tired of manually creating and maintaining your push certification profiles?
245
+ - [```sigh```](https://github.com/KrauseFx/sigh): Because you would rather spend your time building stuff than fighting provisioning.
246
+
241
247
  ## Specify a custom ```Snapfile```
242
248
 
243
249
  snapshot --snapfile ./SpecialSnapfile
data/bin/snapshot CHANGED
@@ -31,10 +31,11 @@ command :run do |c|
31
31
  c.syntax = 'snapshot'
32
32
  c.description = 'Run the script, to take all the screenshots'
33
33
  c.option '--snapfile STRING', String, 'Custom path for your Snapfile'
34
+ c.option '--noclean', 'Skips the clean process when running snapshot.'
34
35
 
35
36
  c.action do |args, options|
36
37
  Snapshot::SnapshotConfig.shared_instance(options.snapfile) if options.snapfile # to set the custom Snapfile path if given
37
- Snapshot::Runner.new.work
38
+ Snapshot::Runner.new.work(clean: !options.noclean)
38
39
  end
39
40
  end
40
41
 
@@ -45,4 +46,4 @@ command :init do |c|
45
46
  c.action do |args, options|
46
47
  Snapshot::SnapfileCreator.create('.')
47
48
  end
48
- end
49
+ end
@@ -1,4 +1,4 @@
1
- # Uncommend the lines below you want to change by removing the # in the beginning
1
+ # Uncomment the lines below you want to change by removing the # in the beginning
2
2
 
3
3
  # A list of devices you want to take the screenshots from
4
4
  devices([
@@ -30,10 +30,6 @@ screenshots_path "./screenshots"
30
30
  # By default, the latest version should be used automatically. If you want to change it, do it here
31
31
  # ios_version '8.1'
32
32
 
33
- # The path, on which the HTML file should be exported to
34
- # html_path './screenshots.html'
35
-
36
-
37
33
  # Custom Callbacks
38
34
 
39
35
  # setup_for_device_change do |device|
@@ -52,4 +48,4 @@ screenshots_path "./screenshots"
52
48
  # teardown_device do |device|
53
49
  # puts "Cleaning device #{device}"
54
50
  # system("./cleanup.sh")
55
- # end
51
+ # end
@@ -6,16 +6,18 @@ module Snapshot
6
6
 
7
7
 
8
8
  def initialize
9
- FileUtils.rm_rf(BUILD_DIR)
9
+
10
10
  end
11
11
 
12
- def build_app
12
+ def build_app(clean: true)
13
+ FileUtils.rm_rf(BUILD_DIR) if clean
14
+
13
15
  command = SnapshotConfig.shared_instance.build_command
14
16
 
15
17
  if not command
16
18
  # That's the default case, user did not provide a custom build_command
17
19
  raise "Could not find project. Please pass the path to your project using 'project_path'.".red unless SnapshotConfig.shared_instance.project_name
18
- command = generate_build_command
20
+ command = generate_build_command(clean: clean)
19
21
  end
20
22
 
21
23
  Helper.log.info "Building project '#{SnapshotConfig.shared_instance.project_name}' - this might take some time...".green
@@ -51,7 +53,7 @@ module Snapshot
51
53
  end
52
54
  end
53
55
 
54
- def generate_build_command
56
+ def generate_build_command(clean: true)
55
57
  scheme = SnapshotConfig.shared_instance.scheme
56
58
 
57
59
  proj_path = SnapshotConfig.shared_instance.project_path
@@ -59,16 +61,21 @@ module Snapshot
59
61
  proj_key = 'workspace' if proj_path.end_with?'.xcworkspace'
60
62
 
61
63
  build_command = (DependencyChecker.xctool_installed? ? 'xctool' : 'xcodebuild')
64
+
65
+ actions = []
66
+ actions << 'clean' if clean
67
+ actions << "build"
68
+
62
69
  [
63
70
  build_command,
64
- "-sdk iphonesimulator#{SnapshotConfig.shared_instance.ios_version}",
71
+ "-sdk iphonesimulator",
65
72
  "CONFIGURATION_BUILD_DIR='#{BUILD_DIR}/build'",
66
73
  "-#{proj_key} '#{proj_path}'",
67
74
  "-scheme '#{scheme}'",
68
75
  "DSTROOT='#{BUILD_DIR}'",
69
76
  "OBJROOT='#{BUILD_DIR}'",
70
77
  "SYMROOT='#{BUILD_DIR}'",
71
- "clean build"
78
+ actions.join(' ')
72
79
  ].join(' ')
73
80
  end
74
81
  end
@@ -5,6 +5,7 @@ module Snapshot
5
5
  self.check_simulators
6
6
  self.check_xctool
7
7
  self.check_for_automation_subfolder
8
+ self.check_simctl
8
9
  end
9
10
 
10
11
  def self.check_xcode_select
@@ -24,6 +25,7 @@ module Snapshot
24
25
  Helper.log.fatal '#############################################################'
25
26
  Helper.log.fatal "# You have to add new simulators using Xcode"
26
27
  Helper.log.fatal "# Xcode => Window => Devices"
28
+ Helper.log.fatal "# Please run `instruments -s` to verify your xcode path"
27
29
  Helper.log.fatal '#############################################################'
28
30
  raise "Create the new simulators and run this script again"
29
31
  end
@@ -48,5 +50,11 @@ module Snapshot
48
50
  raise "Seems like you have an 'Automation' folder in the current directory. You need to delete/rename it!".red
49
51
  end
50
52
  end
53
+
54
+ def self.check_simctl
55
+ unless `xcrun simctl`.include?"openurl"
56
+ raise "Could not find `xcrun simctl`. Make sure you have the latest version of Xcode and Mac OS installed.".red
57
+ end
58
+ end
51
59
  end
52
60
  end
@@ -40,10 +40,11 @@
40
40
  <% screens.each do |screen_path| %>
41
41
  <% next if screen_path.include?"_framed.png" %>
42
42
  <td>
43
+ <% path = screen_path.gsub("./screenshots/", "./") %>
43
44
  <% screen_size = FastImage.size(screen_path) %>
44
- <a href="<%= screen_path %>" target="_blank">
45
+ <a href="<%= path %>" target="_blank">
45
46
  <img class="screenshot"
46
- src="<%= screen_path %>",
47
+ src="<%= path %>",
47
48
  style="width: <%= [(screen_size[0] / divide_size_by).round, max_width].min %>px;" />
48
49
  </a>
49
50
  </td>
@@ -28,11 +28,10 @@ module Snapshot
28
28
  html_path = [lib_path, "snapshot/page.html.erb"].join('/')
29
29
  html = ERB.new(File.read(html_path)).result(binding) # http://www.rrn.dk/rubys-erb-templating-system
30
30
 
31
-
32
- export_path = SnapshotConfig.shared_instance.html_path
31
+ export_path = "#{screens_path}/screenshots.html"
33
32
  File.write(export_path, html)
34
33
 
35
- Helper.log.info "Successfully created HTML file with all the screenshots: #{export_path}".green
34
+ Helper.log.info "Successfully created HTML file with an overview of all the screenshots: '#{File.expand_path(export_path)}'".green
36
35
  end
37
36
 
38
37
  private
@@ -8,18 +8,23 @@ module Snapshot
8
8
  Snapshot::DependencyChecker.check_dependencies
9
9
  end
10
10
 
11
- def work
11
+ def work(clean: true)
12
12
  SnapshotConfig.shared_instance.js_file # to verify the file can be found
13
13
 
14
- Builder.new.build_app
14
+ Builder.new.build_app(clean: clean)
15
+ @app_path = Dir.glob("/tmp/snapshot/build/*.app").first
15
16
 
16
17
  counter = 0
17
18
  errors = []
19
+
18
20
  SnapshotConfig.shared_instance.devices.each do |device|
19
21
 
20
22
  SnapshotConfig.shared_instance.blocks[:setup_for_device_change].call(device) # Callback
21
23
 
22
24
  SnapshotConfig.shared_instance.languages.each do |language|
25
+
26
+ # uninstall_app(device)
27
+
23
28
  SnapshotConfig.shared_instance.blocks[:setup_for_language_change].call(language, device) # Callback
24
29
 
25
30
  begin
@@ -57,12 +62,11 @@ module Snapshot
57
62
 
58
63
  def run_tests(device, language)
59
64
  Helper.log.info "Running tests on #{device} in language #{language}".green
60
- app_path = Dir.glob("/tmp/snapshot/build/*.app").first
61
65
 
62
66
  clean_old_traces
63
67
 
64
68
  ENV['SNAPSHOT_LANGUAGE'] = language
65
- command = generate_test_command(device, language, app_path)
69
+ command = generate_test_command(device, language)
66
70
  Helper.log.debug command.yellow
67
71
 
68
72
  retry_run = false
@@ -98,6 +102,32 @@ module Snapshot
98
102
  return errors
99
103
  end
100
104
 
105
+ # def uninstall_app(device)
106
+ # def com(str)
107
+ # puts str.yellow
108
+ # puts `#{str}`
109
+ # sleep 1.0
110
+ # end
111
+
112
+ # def find_simulator(name)
113
+ # all = `instruments -s`.split("\n")
114
+ # all.each do |current|
115
+ # return current.match(/\[(.*)\]/)[1] if current.include?name
116
+ # end
117
+ # raise "Could not find simulator '#{name}' to install the app on."
118
+ # end
119
+
120
+ # udid = find_simulator(device)
121
+ # com("killall 'iOS Simulator'")
122
+ # com("xcrun simctl boot '#{udid}'")
123
+ # com("xcrun simctl uninstall '#{udid}' 'net.sunapps.123'") # TODO: Dynamic
124
+ # sleep 3
125
+ # com("xcrun simctl install '#{udid}' '#{@app_path}'")
126
+ # com("xcrun simctl shutdown '#{udid}'")
127
+ # sleep 1
128
+ # com("killall 'iOS Simulator'")
129
+ # end
130
+
101
131
  def parse_test_line(line)
102
132
  if line =~ /.*Target failed to run.*/
103
133
  return :retry
@@ -127,7 +157,7 @@ module Snapshot
127
157
  return Dir.glob("#{TRACE_DIR}/**/*.png").count
128
158
  end
129
159
 
130
- def generate_test_command(device, language, app_path)
160
+ def generate_test_command(device, language)
131
161
  script_path = SnapshotConfig.shared_instance.js_file
132
162
 
133
163
  [
@@ -135,7 +165,7 @@ module Snapshot
135
165
  "-w '#{device}'",
136
166
  "-D '#{TRACE_DIR}/trace'",
137
167
  "-t 'Automation'",
138
- "'#{app_path}'",
168
+ "'#{@app_path}'",
139
169
  "-e UIARESULTSPATH '#{TRACE_DIR}'",
140
170
  "-e UIASCRIPT '#{script_path}'",
141
171
  "-AppleLanguages '(#{language})'",
@@ -25,9 +25,6 @@ module Snapshot
25
25
  # @return (String) The path, in which the screenshots should be stored
26
26
  attr_accessor :screenshots_path
27
27
 
28
- # @return (String) The path, in which the HTML file should be exported to
29
- attr_accessor :html_path
30
-
31
28
  # @return (String) The build command, wich should build the app to '/tmp/snapshot'
32
29
  attr_accessor :build_command
33
30
 
@@ -48,12 +45,14 @@ module Snapshot
48
45
  path ||= './Snapfile'
49
46
  set_defaults
50
47
 
51
- if path and File.exists?path
48
+ if File.exists?path
49
+ Helper.log.info "Using '#{path}'".green
52
50
  self.snapshot_file = SnapshotFile.new(path, self)
53
51
  else
54
52
  if path != './Snapfile'
55
53
  raise "Could not find Snapfile at path '#{path}'. Make sure you pass the full path, including 'Snapfile'".red
56
54
  else
55
+ # Using default settings, since user didn't provide a path
57
56
  Helper.log.error "Could not find './Snapfile'. It is recommended to create a file using 'snapshot init' into the current directory. Using the defaults now.".red
58
57
  end
59
58
  end
@@ -81,8 +80,6 @@ module Snapshot
81
80
  self.project_path = (Dir.glob("./*.xcworkspace").first rescue nil) # prefer workspaces ofc
82
81
  self.project_path ||= (Dir.glob("./*.xcodeproj").first rescue nil)
83
82
 
84
- self.html_path = './screenshots.html'
85
-
86
83
  empty = Proc.new {}
87
84
  self.blocks = {
88
85
  setup_for_device_change: empty,
@@ -102,7 +99,7 @@ module Snapshot
102
99
 
103
100
  # Returns the file name of the project
104
101
  def project_name
105
- (self.project_path.split('/').last.split('.').first rescue nil)
102
+ File.basename(self.project_path, ".*" )
106
103
  end
107
104
 
108
105
  # The JavaScript UIAutomation file
@@ -120,7 +117,7 @@ module Snapshot
120
117
  # The scheme to use (either it's set, or there is only one, or user has to enter it)
121
118
  def scheme
122
119
  begin
123
- command = "cd '#{project_path.split('/')[0..-2].join('/')}'; xcodebuild -list"
120
+ command = "cd '#{File.expand_path('..', project_path)}'; xcodebuild -list"
124
121
  schemes = `#{command}`.split("Schemes:").last.split("\n").each { |a| a.strip! }.delete_if { |a| a == '' }
125
122
  Helper.log.debug "Found available schemes: #{schemes}"
126
123
 
@@ -36,14 +36,10 @@ module Snapshot
36
36
  when :js_file
37
37
  raise "js_file has to be an String".red unless value.kind_of?String
38
38
  raise "js_file at path '#{value}' not found".red unless File.exists?value
39
- @config.manual_js_file = value.gsub("~", ENV['HOME'])
39
+ @config.manual_js_file = File.expand_path(value)
40
40
  when :screenshots_path
41
41
  raise "screenshots_path has to be an String".red unless value.kind_of?String
42
- @config.screenshots_path = value.gsub("~", ENV['HOME'])
43
- when :html_path
44
- raise "html_path has to be an String".red unless value.kind_of?String
45
- @config.html_path = value.gsub("~", ENV['HOME'])
46
- @config.html_path = @config.html_path + "/screenshots.html" unless @config.html_path.include?".html"
42
+ @config.screenshots_path = File.expand_path(value)
47
43
  when :build_command
48
44
  raise "build_command has to be an String".red unless value.kind_of?String
49
45
  @config.build_command = value
@@ -52,10 +48,11 @@ module Snapshot
52
48
  when :project_path
53
49
  raise "project_path has to be an String".red unless value.kind_of?String
54
50
 
55
- if File.exists?value and (value.end_with?".xcworkspace" or value.end_with?".xcodeproj")
56
- @config.project_path = value.gsub("~", ENV['HOME'])
51
+ path = File.expand_path(value)
52
+ if File.exists?path and (path.end_with?".xcworkspace" or path.end_with?".xcodeproj")
53
+ @config.project_path = path
57
54
  else
58
- raise "The given project_path '#{value}' could not be found. Make sure to include the extension as well.".red
55
+ raise "The given project_path '#{path}' could not be found. Make sure to include the extension as well.".red
59
56
  end
60
57
 
61
58
  # Blocks
@@ -1,3 +1,3 @@
1
1
  module Snapshot
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snapshot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-24 00:00:00.000000000 Z
11
+ date: 2014-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json