class Deliver::AppScreenshot
AppScreenshot
represents one screenshots for one specific locale and device type.
Attributes
language[RW]
path[RW]
screen_size[RW]
@return [Deliver::ScreenSize] the screen size (device type)
specified at {Deliver::ScreenSize}
Public Class Methods
calculate_screen_size(path)
click to toggle source
# File deliver/lib/deliver/app_screenshot.rb, line 340 def self.calculate_screen_size(path) size = FastImage.size(path) UI.user_error!("Could not find or parse file at path '#{path}'") if size.nil? || size.count == 0 # iMessage screenshots have same resolution as app screenshots so we need to distinguish them path_component = Pathname.new(path).each_filename.to_a[-3] devices = path_component.eql?("iMessage") ? self.device_messages : self.devices devices.each do |screen_size, resolutions| if resolutions.include?(size) filename = Pathname.new(path).basename.to_s return resolve_ipadpro_conflict_if_needed(screen_size, filename) end end nil end
device_messages()
click to toggle source
# File deliver/lib/deliver/app_screenshot.rb, line 182 def self.device_messages # This list does not include iPad Pro 12.9-inch (3rd generation) # because it has same resoluation as IOS_IPAD_PRO and will clobber return { ScreenSize::IOS_65_MESSAGES => [ [1242, 2688], [2688, 1242], [1284, 2778], [2778, 1284] ], ScreenSize::IOS_61_MESSAGES => [ [828, 1792], [1792, 828] ], ScreenSize::IOS_58_MESSAGES => [ [1125, 2436], [2436, 1125], [1170, 2532], [2532, 1170] ], ScreenSize::IOS_55_MESSAGES => [ [1242, 2208], [2208, 1242] ], ScreenSize::IOS_47_MESSAGES => [ [750, 1334], [1334, 750] ], ScreenSize::IOS_40_MESSAGES => [ [640, 1096], [640, 1136], [1136, 600], [1136, 640] ], ScreenSize::IOS_IPAD_MESSAGES => [ [1024, 748], [1024, 768], [2048, 1496], [2048, 1536], [768, 1004], [768, 1024], [1536, 2008], [1536, 2048] ], ScreenSize::IOS_IPAD_10_5_MESSAGES => [ [1668, 2224], [2224, 1668] ], ScreenSize::IOS_IPAD_11_MESSAGES => [ [1668, 2388], [2388, 1668] ], ScreenSize::IOS_IPAD_PRO_MESSAGES => [ [2732, 2048], [2048, 2732] ] } end
devices()
click to toggle source
reference: help.apple.com/app-store-connect/#/devd274dd925
# File deliver/lib/deliver/app_screenshot.rb, line 242 def self.devices # This list does not include iPad Pro 12.9-inch (3rd generation) # because it has same resoluation as IOS_IPAD_PRO and will clobber return { ScreenSize::IOS_65 => [ [1242, 2688], [2688, 1242], [1284, 2778], [2778, 1284] ], ScreenSize::IOS_61 => [ [828, 1792], [1792, 828] ], ScreenSize::IOS_58 => [ [1125, 2436], [2436, 1125], [1170, 2532], [2532, 1170] ], ScreenSize::IOS_55 => [ [1242, 2208], [2208, 1242] ], ScreenSize::IOS_47 => [ [750, 1334], [1334, 750] ], ScreenSize::IOS_40 => [ [640, 1096], [640, 1136], [1136, 600], [1136, 640] ], ScreenSize::IOS_35 => [ [640, 920], [640, 960], [960, 600], [960, 640] ], ScreenSize::IOS_IPAD => [ # 9.7 inch [1024, 748], [1024, 768], [2048, 1496], [2048, 1536], [768, 1004], # portrait without status bar [768, 1024], [1536, 2008], # portrait without status bar [1536, 2048] ], ScreenSize::IOS_IPAD_10_5 => [ [1668, 2224], [2224, 1668] ], ScreenSize::IOS_IPAD_11 => [ [1668, 2388], [2388, 1668] ], ScreenSize::IOS_IPAD_PRO => [ [2732, 2048], [2048, 2732] ], ScreenSize::MAC => [ [1280, 800], [1440, 900], [2560, 1600], [2880, 1800] ], ScreenSize::IOS_APPLE_WATCH => [ [312, 390] ], ScreenSize::IOS_APPLE_WATCH_SERIES4 => [ [368, 448] ], ScreenSize::APPLE_TV => [ [1920, 1080], [3840, 2160] ] } end
new(path, language, screen_size = nil)
click to toggle source
@param path (String
) path to the screenshot file @param language (String
) Language of this screenshot (e.g. English) @param screen_size
(Deliver::AppScreenshot::ScreenSize
) the screen size, which
will automatically be calculated when you don't set it. (Deprecated)
# File deliver/lib/deliver/app_screenshot.rb, line 86 def initialize(path, language, screen_size = nil) UI.deprecated('`screen_size` for Deliver::AppScreenshot.new is deprecated in favor of the default behavior to calculate size automatically. Passed value is no longer validated.') if screen_size self.path = path self.language = language self.screen_size = screen_size || self.class.calculate_screen_size(path) end
resolve_ipadpro_conflict_if_needed(screen_size, filename)
click to toggle source
# File deliver/lib/deliver/app_screenshot.rb, line 323 def self.resolve_ipadpro_conflict_if_needed(screen_size, filename) is_3rd_gen = [ "iPad Pro (12.9-inch) (3rd generation)", # Default simulator has this name "iPad Pro (12.9-inch) (4th generation)", # Default simulator has this name "IPAD_PRO_3GEN_129", # Screenshots downloaded from App Store Connect has this name "ipadPro129" # Legacy: screenshots downloaded from iTunes Connect used to have this name ].any? { |key| filename.include?(key) } if is_3rd_gen if screen_size == ScreenSize::IOS_IPAD_PRO return ScreenSize::IOS_IPAD_PRO_12_9 elsif screen_size == ScreenSize::IOS_IPAD_PRO_MESSAGES return ScreenSize::IOS_IPAD_PRO_12_9_MESSAGES end end screen_size end
Public Instance Methods
device_type()
click to toggle source
The iTC API requires a different notation for the device
# File deliver/lib/deliver/app_screenshot.rb, line 94 def device_type matching = { ScreenSize::IOS_35 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPHONE_35, ScreenSize::IOS_40 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPHONE_40, ScreenSize::IOS_47 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPHONE_47, # also 7 & 8 ScreenSize::IOS_55 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPHONE_55, # also 7 Plus & 8 Plus ScreenSize::IOS_58 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPHONE_58, ScreenSize::IOS_65 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPHONE_65, ScreenSize::IOS_IPAD => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPAD_97, ScreenSize::IOS_IPAD_10_5 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPAD_105, ScreenSize::IOS_IPAD_11 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPAD_PRO_3GEN_11, ScreenSize::IOS_IPAD_PRO => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPAD_PRO_129, ScreenSize::IOS_IPAD_PRO_12_9 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_IPAD_PRO_3GEN_129, ScreenSize::IOS_40_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPHONE_40, ScreenSize::IOS_47_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPHONE_47, # also 7 & 8 ScreenSize::IOS_55_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPHONE_55, # also 7 Plus & 8 Plus ScreenSize::IOS_58_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPHONE_58, ScreenSize::IOS_65_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPHONE_65, ScreenSize::IOS_IPAD_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPAD_97, ScreenSize::IOS_IPAD_PRO_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPAD_PRO_129, ScreenSize::IOS_IPAD_PRO_12_9_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPAD_PRO_3GEN_129, ScreenSize::IOS_IPAD_10_5_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPAD_105, ScreenSize::IOS_IPAD_11_MESSAGES => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::IMESSAGE_APP_IPAD_PRO_3GEN_11, ScreenSize::MAC => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_DESKTOP, ScreenSize::IOS_APPLE_WATCH => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_SERIES_3, ScreenSize::IOS_APPLE_WATCH_SERIES4 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_SERIES_4, ScreenSize::APPLE_TV => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_APPLE_TV } return matching[self.screen_size] end
formatted_name()
click to toggle source
Nice name
# File deliver/lib/deliver/app_screenshot.rb, line 126 def formatted_name matching = { ScreenSize::IOS_35 => "iPhone 4", ScreenSize::IOS_40 => "iPhone 5", ScreenSize::IOS_47 => "iPhone 6", # also 7 & 8 ScreenSize::IOS_55 => "iPhone 6 Plus", # also 7 Plus & 8 Plus ScreenSize::IOS_58 => "iPhone XS", ScreenSize::IOS_61 => "iPhone XR", ScreenSize::IOS_65 => "iPhone XS Max", ScreenSize::IOS_IPAD => "iPad", ScreenSize::IOS_IPAD_10_5 => "iPad 10.5", ScreenSize::IOS_IPAD_11 => "iPad 11", ScreenSize::IOS_IPAD_PRO => "iPad Pro", ScreenSize::IOS_IPAD_PRO_12_9 => "iPad Pro (12.9-inch) (3rd generation)", ScreenSize::IOS_40_MESSAGES => "iPhone 5 (iMessage)", ScreenSize::IOS_47_MESSAGES => "iPhone 6 (iMessage)", # also 7 & 8 ScreenSize::IOS_55_MESSAGES => "iPhone 6 Plus (iMessage)", # also 7 Plus & 8 Plus ScreenSize::IOS_58_MESSAGES => "iPhone XS (iMessage)", ScreenSize::IOS_61_MESSAGES => "iPhone XR (iMessage)", ScreenSize::IOS_65_MESSAGES => "iPhone XS Max (iMessage)", ScreenSize::IOS_IPAD_MESSAGES => "iPad (iMessage)", ScreenSize::IOS_IPAD_PRO_MESSAGES => "iPad Pro (iMessage)", ScreenSize::IOS_IPAD_PRO_12_9_MESSAGES => "iPad Pro (12.9-inch) (3rd generation) (iMessage)", ScreenSize::IOS_IPAD_10_5_MESSAGES => "iPad 10.5 (iMessage)", ScreenSize::IOS_IPAD_11_MESSAGES => "iPad 11 (iMessage)", ScreenSize::MAC => "Mac", ScreenSize::IOS_APPLE_WATCH => "Watch", ScreenSize::IOS_APPLE_WATCH_SERIES4 => "Watch Series4", ScreenSize::APPLE_TV => "Apple TV" } return matching[self.screen_size] end
is_messages?()
click to toggle source
# File deliver/lib/deliver/app_screenshot.rb, line 167 def is_messages? return [ ScreenSize::IOS_40_MESSAGES, ScreenSize::IOS_47_MESSAGES, ScreenSize::IOS_55_MESSAGES, ScreenSize::IOS_58_MESSAGES, ScreenSize::IOS_65_MESSAGES, ScreenSize::IOS_IPAD_MESSAGES, ScreenSize::IOS_IPAD_PRO_MESSAGES, ScreenSize::IOS_IPAD_PRO_12_9_MESSAGES, ScreenSize::IOS_IPAD_10_5_MESSAGES, ScreenSize::IOS_IPAD_11_MESSAGES ].include?(self.screen_size) end
is_valid?()
click to toggle source
Validates the given screenshots (size and format)
# File deliver/lib/deliver/app_screenshot.rb, line 160 def is_valid? UI.deprecated('Deliver::AppScreenshot#is_valid? is deprecated in favor of Deliver::AppScreenshotValidator') return false unless ["png", "PNG", "jpg", "JPG", "jpeg", "JPEG"].include?(self.path.split(".").last) return self.screen_size == self.class.calculate_screen_size(self.path) end