deliver 1.6.6 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d4b948ca3c2697a5a602658d3887efc6a1fd88e
4
- data.tar.gz: b003a658e9fc50e32f234bb16b7b4319d8dae43d
3
+ metadata.gz: f073822a6cd5ae489648e54a348982bc98b71122
4
+ data.tar.gz: a7deac2ad9c35042803c15bb4aff5b3d5ad21b36
5
5
  SHA512:
6
- metadata.gz: 3020c6e2f2abd1972cbd7bc9c6706ca555f74e22a9a0d56adb740f526e6a94ff5d8fdea264284d9eb9f61b0a286d61f98c53dfd44cd045acba14314b7fd42b98
7
- data.tar.gz: 30c7a6d82d5909ef53e4deb1dafdd2cbbf0a60fff0c9e4c95e288875521f852ead56db5ec6ca1f21f3badf2750990e8d0080d797cca0c36992ff26a3bfc3c30a
6
+ metadata.gz: d4c40f724deea58194fe74a1bbedb431f126a267ddbfa43ddf4427f5cadf6543d1ae4ad0183b5041946c94d32c3842476076ecab8fd9cf12693bdd29ebebf97f
7
+ data.tar.gz: e25d930ab3d631813f91bac218101961ad1ecce5ad04ad1acbb941c0768dec7bffd1aba26db5838a9e4bad325487400c59842e523070e673ca93db5f907b3646
data/README.md CHANGED
@@ -29,8 +29,8 @@
29
29
  deliver
30
30
  ============
31
31
 
32
- [![Twitter: @KauseFx](https://img.shields.io/badge/contact-@KrauseFx-blue.svg?style=flat)](https://twitter.com/KrauseFx)
33
- [![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/KrauseFx/deliver/blob/master/LICENSE)
32
+ [![Twitter: @KauseFx](https://img.shields.io/badge/contact-@FastlaneTools-blue.svg?style=flat)](https://twitter.com/FastlaneTools)
33
+ [![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/fastlane/deliver/blob/master/LICENSE)
34
34
  [![Gem](https://img.shields.io/gem/v/deliver.svg?style=flat)](http://rubygems.org/gems/deliver)
35
35
  [![Build Status](https://img.shields.io/travis/fastlane/deliver/master.svg?style=flat)](https://travis-ci.org/fastlane/deliver)
36
36
 
@@ -38,7 +38,7 @@ deliver
38
38
 
39
39
  `deliver` can upload ipa files, app screenshots and more to iTunes Connect from the command line.
40
40
 
41
- Get in contact with the developer on Twitter: [@KrauseFx](https://twitter.com/KrauseFx)
41
+ Get in contact with the developer on Twitter: [@FastlaneTools](https://twitter.com/FastlaneTools)
42
42
 
43
43
  -------
44
44
  <p align="center">
@@ -1,6 +1,6 @@
1
1
  ###################### More Options ######################
2
2
  # If you want to have even more control, check out the documentation
3
- # https://github.com/KrauseFx/deliver/blob/master/Deliverfile.md
3
+ # https://github.com/fastlane/deliver/blob/master/Deliverfile.md
4
4
 
5
5
 
6
6
  ###################### Automatically generated ######################
@@ -1,4 +1,5 @@
1
1
  Put all screenshots you want to use inside the folder of its language (e.g. en-US).
2
- The device type will automatically be recognized using the image resolution.
2
+ The device type will automatically be recognized using the image resolution. Apple TV screenshots
3
+ should be stored in a subdirectory named appleTV with language folders inside of it.
3
4
 
4
5
  The screenshots can be named whatever you want, but keep in mind they are sorted alphabetically.
@@ -1,9 +1,10 @@
1
+ <!DOCTYPE html>
1
2
  <html>
2
3
  <head>
3
4
  <title>deliver - <%= @app_name %></title>
4
- <meta http-equiv="content-type" content="text/html; charset=UTF-16">
5
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
5
6
  <style>
6
- #app-name {
7
+ .app-name {
7
8
  font-size: 42px;
8
9
  font-family: 'Helvetica Neue', HelveticaNeue, Helvetica Neue;
9
10
  font-weight: 300;
@@ -12,7 +13,7 @@
12
13
  margin-right: 25px;
13
14
  }
14
15
 
15
- #app-urls {
16
+ .app-urls {
16
17
  margin-left: 25px;
17
18
  font-size: 14px;
18
19
  margin-top: 4px;
@@ -40,7 +41,7 @@
40
41
  margin-right: 10px;
41
42
  }
42
43
 
43
- #app-keyword {
44
+ .app-keyword {
44
45
  margin-left: 25px;
45
46
  margin-right: 25px;
46
47
  margin-top: 22px;
@@ -53,24 +54,24 @@
53
54
 
54
55
 
55
56
 
56
- #app-description {
57
+ .app-description {
57
58
  margin-left: 25px;
58
59
  margin-right: 25px;
59
60
  margin-top: 22px;
60
61
  }
61
62
 
62
- #app-description-text {
63
+ .app-description-text {
63
64
  font-weight: 300;
64
65
  }
65
66
 
66
- #app-changelog {
67
+ .app-changelog {
67
68
  margin-left: 25px;
68
69
  margin-right: 25px;
69
70
  margin-top: 22px;
70
71
  font-weight: 300;
71
72
  }
72
73
 
73
- #app-screenshots {
74
+ .app-screenshots {
74
75
  margin-left: 15px;
75
76
  margin-right: 15px;
76
77
  margin-top: 22px;
@@ -112,16 +113,16 @@
112
113
  <body>
113
114
  <% @languages.each do |language| %>
114
115
  <% if @options[:name] %>
115
- <div id="app-name">
116
+ <div class="app-name">
116
117
  <%= language %>: <%= @options[:name][language] %>
117
118
  </div>
118
119
  <% else %>
119
- <div id="app-name">
120
+ <div class="app-name">
120
121
  <%= language %>
121
122
  </div>
122
123
  <% end %>
123
124
 
124
- <div id="app-urls">
125
+ <div class="app-urls">
125
126
  <% all_keys = [:support_url, :marketing_url] %>
126
127
  <% all_keys.each do |key| %>
127
128
  <% value = @options[key][language] if @options[key] %>
@@ -134,7 +135,7 @@
134
135
  </div>
135
136
 
136
137
  <% if @options[:keywords] and @options[:keywords][language] %>
137
- <div id="app-keyword">
138
+ <div class="app-keyword">
138
139
  <div class="cat-headline">Keywords</div>
139
140
  <ul class="app-keyword-list">
140
141
  <% @options[:keywords][language].split(" ").each do |keyword| %>
@@ -145,22 +146,22 @@
145
146
  <% end %>
146
147
 
147
148
  <% if @options[:description] %>
148
- <div id="app-description">
149
+ <div class="app-description">
149
150
  <div class="cat-headline">Description</div>
150
- <div id="app-description-text">
151
+ <div class="app-description-text">
151
152
  <%= (@options[:description][language] || '').gsub("\n", "<br />") %>
152
153
  </div>
153
154
  </div>
154
155
  <% end %>
155
156
 
156
157
  <% if @options[:release_notes] %>
157
- <div id="app-changelog">
158
+ <div class="app-changelog">
158
159
  <div class="cat-headline">Changelog</div>
159
160
  <%= (@options[:release_notes][language] || '').gsub("\n", "<br />") %>
160
161
  </div>
161
162
  <% end %>
162
163
 
163
- <div id="app-screenshots">
164
+ <div class="app-screenshots">
164
165
  <div class="cat-headline">Screenshots</div>
165
166
 
166
167
  <% if options[:skip_screenshots] %>
@@ -170,24 +171,19 @@
170
171
  </p>
171
172
  </div>
172
173
  <% elsif @screenshots.count > 0 %>
173
- <% last_size = nil %>
174
174
  <% sc = @screenshots.find_all { |s| s.language == language } %>
175
- <% sc.sort {|a, b| [a.screen_size, a.path] <=> [b.screen_size, b.path]}.each do |screenshot| %>
175
+ <% sc_by_size = sc.group_by { |i| i.screen_size } %>
176
176
 
177
- <% new_row = (last_size != screenshot.screen_size or last_size == nil) %>
177
+ <% sc_by_size.keys.sort.each do |screen_size| %>
178
+ <% screenshots = sc_by_size[screen_size].sort { |a, b| [a.path] <=> [b.path] } %>
179
+ <%# we are guaranteed to have at least one element because of the group_by %>
180
+ <h4><%= screenshots[0].formatted_name %></h4>
181
+ <div class="app-screenshot-row">
178
182
 
179
- <% if new_row and last_size != nil %>
180
- </div>
183
+ <% screenshots.each_with_index do |screenshot, index| %>
184
+ <a href="<%= screenshot.path %>" target="_blank"><img class="app-screenshot" src="<%= screenshot.path %>" title="Screenshot #<%=index%> for <%=language%>"></a>
181
185
  <% end %>
182
-
183
- <% if new_row %>
184
- <h4><%= screenshot.formatted_name %></h4>
185
- <div class="app-screenshot-row">
186
- <% end %>
187
-
188
- <a href="<%= screenshot.path %>" target="_blank"><img class="app-screenshot" src="<%= screenshot.path %>"></a>
189
-
190
- <% last_size = screenshot.screen_size %>
186
+ </div>
191
187
  <% end %>
192
188
  <% else %>
193
189
  <!-- no screenshots -->
@@ -21,6 +21,8 @@ module Deliver
21
21
  IOS_APPLE_WATCH = "iOS-Apple-Watch"
22
22
  # Mac
23
23
  MAC = "Mac"
24
+ # Apple TV
25
+ APPLE_TV = "Apple-TV"
24
26
  end
25
27
 
26
28
  # @return [Deliver::ScreenSize] the screen size (device type)
@@ -55,7 +57,8 @@ module Deliver
55
57
  ScreenSize::IOS_IPAD => "ipad",
56
58
  ScreenSize::IOS_IPAD_PRO => "ipadPro",
57
59
  ScreenSize::MAC => "desktop",
58
- ScreenSize::IOS_APPLE_WATCH => "watch"
60
+ ScreenSize::IOS_APPLE_WATCH => "watch",
61
+ ScreenSize::APPLE_TV => "appleTV"
59
62
  }
60
63
  return matching[self.screen_size]
61
64
  end
@@ -70,7 +73,8 @@ module Deliver
70
73
  ScreenSize::IOS_IPAD => "iPad",
71
74
  ScreenSize::IOS_IPAD_PRO => "iPad Pro",
72
75
  ScreenSize::MAC => "Mac",
73
- ScreenSize::IOS_APPLE_WATCH => "Watch"
76
+ ScreenSize::IOS_APPLE_WATCH => "Watch",
77
+ ScreenSize::APPLE_TV => "Apple TV"
74
78
  }
75
79
  return matching[self.screen_size]
76
80
  end
@@ -84,12 +88,8 @@ module Deliver
84
88
  end
85
89
  # rubocop:enable Style/PredicateName
86
90
 
87
- def self.calculate_screen_size(path)
88
- size = FastImage.size(path)
89
-
90
- raise "Could not find or parse file at path '#{path}'" if size.nil? or size.count == 0
91
-
92
- devices = {
91
+ def self.devices
92
+ return {
93
93
  ScreenSize::IOS_55 => [
94
94
  [1080, 1920],
95
95
  [1242, 2208]
@@ -129,14 +129,35 @@ module Deliver
129
129
  ],
130
130
  ScreenSize::IOS_APPLE_WATCH => [
131
131
  [312, 390]
132
+ ],
133
+ ScreenSize::APPLE_TV => [
134
+ [1920, 1080]
132
135
  ]
133
136
  }
137
+ end
138
+
139
+ def self.calculate_screen_size(path)
140
+ size = FastImage.size(path)
141
+
142
+ raise "Could not find or parse file at path '#{path}'" if size.nil? or size.count == 0
143
+
144
+ # Walk up two directories and test if we need to handle a platform that doesn't support landscape
145
+ path_component = Pathname.new(path).each_filename.to_a[-3]
146
+ if path_component.eql? "appleTV"
147
+ skip_landscape = true
148
+ end
134
149
 
135
- devices.each do |device_type, array|
150
+ self.devices.each do |device_type, array|
136
151
  array.each do |resolution|
137
- if (size[0] == resolution[0] and size[1] == resolution[1]) or # portrait
138
- (size[1] == resolution[0] and size[0] == resolution[1]) # landscape
139
- return device_type
152
+ if skip_landscape
153
+ if size[0] == resolution[0] and size[1] == resolution[1] # portrait
154
+ return device_type
155
+ end
156
+ else
157
+ if (size[0] == resolution[0] and size[1] == resolution[1]) or # portrait
158
+ (size[1] == resolution[0] and size[0] == resolution[1]) # landscape
159
+ return device_type
160
+ end
140
161
  end
141
162
  end
142
163
  end
@@ -21,7 +21,7 @@ module Deliver
21
21
  program :description, Deliver::DESCRIPTION
22
22
  program :help, 'Author', 'Felix Krause <deliver@krausefx.com>'
23
23
  program :help, 'Website', 'https://fastlane.tools'
24
- program :help, 'GitHub', 'https://github.com/krausefx/deliver'
24
+ program :help, 'GitHub', 'https://github.com/fastlane/deliver'
25
25
  program :help_formatter, :compact
26
26
 
27
27
  FastlaneCore::CommanderGenerator.new.generate(Deliver::Options.available_options)
@@ -20,7 +20,14 @@ module Deliver
20
20
 
21
21
  Helper.log.info "Downloading existing screenshot '#{file_name}'"
22
22
 
23
- containing_folder = File.join(folder_path, "screenshots", screenshot.language)
23
+ # If the screen shot is for an appleTV we need to store it in a way that we'll know it's an appleTV
24
+ # screen shot later as the screen size is the same as an iPhone 6 Plus in landscape.
25
+ if screenshot.device_type == "appleTV"
26
+ containing_folder = File.join(folder_path, "screenshots", "appleTV", screenshot.language)
27
+ else
28
+ containing_folder = File.join(folder_path, "screenshots", screenshot.language)
29
+ end
30
+
24
31
  begin
25
32
  FileUtils.mkdir_p(containing_folder)
26
33
  rescue
@@ -2,7 +2,10 @@ require 'fastlane_core/languages'
2
2
 
3
3
  module Deliver
4
4
  module Loader
5
- ALL_LANGUAGES = FastlaneCore::Languages::ALL_LANGUAGES.map(&:downcase).freeze
5
+ # The directory 'appleTV' is a special folder that will cause our screenshot gathering code to iterate
6
+ # through it as well searching for language folders.
7
+ APPLE_TV_DIR_NAME = "appleTV"
8
+ ALL_LANGUAGES = (FastlaneCore::Languages::ALL_LANGUAGES + [APPLE_TV_DIR_NAME]).map(&:downcase).freeze
6
9
 
7
10
  def self.language_folders(root)
8
11
  Dir.glob(File.join(root, '*')).select do |path|
@@ -54,21 +54,33 @@ module Deliver
54
54
 
55
55
  def collect_screenshots(options)
56
56
  return [] if options[:skip_screenshots]
57
+ return collect_screenshots_for_languages(options[:screenshots_path])
58
+ end
57
59
 
60
+ def collect_screenshots_for_languages(path)
58
61
  screenshots = []
59
62
  extensions = '{png,jpg,jpeg}'
60
- Loader.language_folders(options[:screenshots_path]).each do |lng_folder|
63
+
64
+ Loader.language_folders(path).each do |lng_folder|
65
+ language = File.basename(lng_folder)
66
+
67
+ # Check to see if we need to traverse multiple platforms or just a single platform
68
+ if language == Loader::APPLE_TV_DIR_NAME
69
+ screenshots.concat(collect_screenshots_for_languages(File.join(path, language)))
70
+ next
71
+ end
72
+
61
73
  files = Dir.glob(File.join(lng_folder, "*.#{extensions}"))
62
74
  next if files.count == 0
63
75
 
64
76
  prefer_framed = Dir.glob(File.join(lng_folder, "*_framed.#{extensions}")).count > 0
65
77
 
66
78
  language = File.basename(lng_folder)
67
- files.each do |path|
68
- if path.downcase.include?("_framed.")
79
+ files.each do |file_path|
80
+ if file_path.downcase.include?("_framed.")
69
81
  # That's cool
70
82
  else
71
- if path.downcase.include?("watch")
83
+ if file_path.downcase.include?("watch")
72
84
  # Watch doesn't support frames (yet)
73
85
  else
74
86
  # That might not be cool... if that screenshot is not framed but we only want framed
@@ -76,7 +88,7 @@ module Deliver
76
88
  end
77
89
  end
78
90
 
79
- screenshots << AppScreenshot.new(path, language)
91
+ screenshots << AppScreenshot.new(file_path, language)
80
92
  end
81
93
  end
82
94
 
@@ -1,4 +1,4 @@
1
1
  module Deliver
2
- VERSION = "1.6.6"
2
+ VERSION = "1.7.0"
3
3
  DESCRIPTION = 'Upload screenshots, metadata and your app to the App Store using a single command'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deliver
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.6
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-01 00:00:00.000000000 Z
11
+ date: 2016-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fastlane_core
@@ -289,7 +289,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
289
289
  version: '0'
290
290
  requirements: []
291
291
  rubyforge_project:
292
- rubygems_version: 2.4.6
292
+ rubygems_version: 2.4.0
293
293
  signing_key:
294
294
  specification_version: 4
295
295
  summary: Upload screenshots, metadata and your app to the App Store using a single