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 lib/deliver/app_screenshot.rb, line 192
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? or size.count == 0

  # Walk up two directories and test if we need to handle a platform that doesn't support landscape
  path_component = Pathname.new(path).each_filename.to_a[-3]
  if path_component.eql? "appleTV"
    skip_landscape = true
  end

  # iMessage screenshots have same resolution as app screenshots so we need to distinguish them
  devices = path_component.eql?("iMessage") ? self.device_messages : self.devices

  devices.each do |device_type, array|
    array.each do |resolution|
      if skip_landscape
        if size[0] == resolution[0] and size[1] == resolution[1] # portrait
          return device_type
        end
      else
        if (size[0] == resolution[0] and size[1] == resolution[1]) or # portrait
           (size[1] == resolution[0] and size[0] == resolution[1]) # landscape
          return device_type
        end
      end
    end
  end

  UI.user_error!("Unsupported screen size #{size} for path '#{path}'")
end
device_messages() click to toggle source
# File lib/deliver/app_screenshot.rb, line 113
def self.device_messages
  return {
    ScreenSize::IOS_55_MESSAGES => [
      [1080, 1920],
      [1242, 2208]
    ],
    ScreenSize::IOS_47_MESSAGES => [
      [750, 1334]
    ],
    ScreenSize::IOS_40_MESSAGES => [
      [640, 1136],
      [640, 1096],
      [1136, 600] # landscape status bar is smaller
    ],
    ScreenSize::IOS_IPAD_MESSAGES => [
      [1024, 748],
      [1024, 768],
      [2048, 1496],
      [2048, 1536],
      [768, 1004],
      [768, 1024],
      [1536, 2008],
      [1536, 2048]
    ],
    ScreenSize::IOS_IPAD_PRO_MESSAGES => [
      [2732, 2048],
      [2048, 2732]
    ]
  }
end
devices() click to toggle source
# File lib/deliver/app_screenshot.rb, line 144
def self.devices
  return {
    ScreenSize::IOS_55 => [
      [1080, 1920],
      [1242, 2208]
    ],
    ScreenSize::IOS_47 => [
      [750, 1334]
    ],
    ScreenSize::IOS_40 => [
      [640, 1136],
      [640, 1096],
      [1136, 600] # landscape status bar is smaller
    ],
    ScreenSize::IOS_35 => [
      [640, 960],
      [640, 920],
      [960, 600] # landscape status bar is smaller
    ],
    ScreenSize::IOS_IPAD => [
      [1024, 748],
      [1024, 768],
      [2048, 1496],
      [2048, 1536],
      [768, 1004],
      [768, 1024],
      [1536, 2008],
      [1536, 2048]
    ],
    ScreenSize::IOS_IPAD_PRO => [
      [2732, 2048],
      [2048, 2732]
    ],
    ScreenSize::MAC => [
      [1280, 800],
      [1440, 900],
      [2880, 1800],
      [2560, 1600]
    ],
    ScreenSize::IOS_APPLE_WATCH => [
      [312, 390]
    ],
    ScreenSize::APPLE_TV => [
      [1920, 1080]
    ]
  }
end
new(path, language, screen_size = nil) click to toggle source

@param path (String) path to the screenshot file @param path (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.
# File lib/deliver/app_screenshot.rb, line 50
def initialize(path, language, screen_size = nil)
  self.path = path
  self.language = language
  screen_size ||= self.class.calculate_screen_size(path)

  self.screen_size = screen_size

  UI.error("Looks like the screenshot given (#{path}) does not match the requirements of #{screen_size}") unless self.is_valid?
end

Public Instance Methods

device_type() click to toggle source

The iTC API requires a different notation for the device

# File lib/deliver/app_screenshot.rb, line 61
def device_type
  matching = {
    ScreenSize::IOS_35 => "iphone35",
    ScreenSize::IOS_40 => "iphone4",
    ScreenSize::IOS_47 => "iphone6",
    ScreenSize::IOS_55 => "iphone6Plus",
    ScreenSize::IOS_IPAD => "ipad",
    ScreenSize::IOS_IPAD_PRO => "ipadPro",
    ScreenSize::IOS_40_MESSAGES => "iphone4",
    ScreenSize::IOS_47_MESSAGES => "iphone6",
    ScreenSize::IOS_55_MESSAGES => "iphone6Plus",
    ScreenSize::IOS_IPAD_MESSAGES => "ipad",
    ScreenSize::IOS_IPAD_PRO_MESSAGES => "ipadPro",
    ScreenSize::MAC => "desktop",
    ScreenSize::IOS_APPLE_WATCH => "watch",
    ScreenSize::APPLE_TV => "appleTV"
  }
  return matching[self.screen_size]
end
formatted_name() click to toggle source

Nice name

# File lib/deliver/app_screenshot.rb, line 82
def formatted_name
  matching = {
    ScreenSize::IOS_35 => "iPhone 4",
    ScreenSize::IOS_40 => "iPhone 5",
    ScreenSize::IOS_47 => "iPhone 6",
    ScreenSize::IOS_55 => "iPhone 6 Plus",
    ScreenSize::IOS_IPAD => "iPad",
    ScreenSize::IOS_IPAD_PRO => "iPad Pro",
    ScreenSize::IOS_40_MESSAGES => "iPhone 5 (iMessage)",
    ScreenSize::IOS_47_MESSAGES => "iPhone 6 (iMessage)",
    ScreenSize::IOS_55_MESSAGES => "iPhone 6 Plus (iMessage)",
    ScreenSize::IOS_IPAD_MESSAGES => "iPad (iMessage)",
    ScreenSize::IOS_IPAD_PRO_MESSAGES => "iPad Pro (iMessage)",
    ScreenSize::MAC => "Mac",
    ScreenSize::IOS_APPLE_WATCH => "Watch",
    ScreenSize::APPLE_TV => "Apple TV"
  }
  return matching[self.screen_size]
end
is_messages?() click to toggle source
# File lib/deliver/app_screenshot.rb, line 109
def is_messages?
  return [ScreenSize::IOS_40_MESSAGES, ScreenSize::IOS_47_MESSAGES, ScreenSize::IOS_55_MESSAGES, ScreenSize::IOS_IPAD_MESSAGES, ScreenSize::IOS_IPAD_PRO_MESSAGES].include?(self.screen_size)
end
is_valid?() click to toggle source

Validates the given screenshots (size and format)

# File lib/deliver/app_screenshot.rb, line 103
def is_valid?
  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