module Deliver::Loader

Constants

APPLE_TV_DIR_NAME

The directory 'appleTV' and `iMessage` are special folders that will cause our screenshot gathering code to iterate through it as well searching for language folders.

DEFAULT_DIR_NAME
EXCEPTION_DIRECTORIES
EXPANDABLE_DIR_NAMES
FRAMEIT_FONTS_DIR_NAME
IMESSAGE_DIR_NAME
META_DIR_NAMES
SPECIAL_DIR_NAMES
SUPPLY_DIR_NAME

Some exception directories may exist from other actions that should not be iterated through

Public Class Methods

language_folders(root, ignore_validation, expand_sub_folders = false) click to toggle source

Returns the list of language folders

@param roort [String] A directory path to get the list of language folders @param ignore_validation [Boolean] Set false not to raise the error when finding invalid folder name @param expand_sub_folders [Boolean] Set true to expand special folders; such as β€œiMessage” to nested language folders @return [Array<LanguageFolder>] The list of LanguageFolder whose each of them

# File deliver/lib/deliver/loader.rb, line 125
def self.language_folders(root, ignore_validation, expand_sub_folders = false)
  folders = Dir.glob(File.join(root, '*'))
               .select { |path| File.directory?(path) }
               .map { |path| LanguageFolder.new(path, nested: false) }
               .reject(&:skip?)

  selected_folders, rejected_folders = folders.partition(&:valid?)

  if !ignore_validation && !rejected_folders.empty?
    rejected_folders = rejected_folders.map(&:basename)
    UI.user_error!("Unsupported directory name(s) for screenshots/metadata in '#{root}': #{rejected_folders.join(', ')}" \
                   "\nValid directory names are: #{LanguageFolder.allowed_directory_names_with_case}" \
                   "\n\nEnable 'ignore_language_directory_validation' to prevent this validation from happening")
  end

  # Expand selected_folders for the special directories
  if expand_sub_folders
    selected_folders = selected_folders.flat_map do |folder|
      if folder.expandable?
        Dir.glob(File.join(folder.path, '*'))
           .select { |p| File.directory?(p) }
           .map { |p| LanguageFolder.new(p, nested: true) }
           .select(&:valid?)
      else
        folder
      end
    end
  end

  selected_folders
end
load_app_screenshots(root, ignore_validation) click to toggle source

Returns the list of valid app screenshot. When detecting invalid screenshots, this will cause an error.

@param root [String] A directory path @param ignore_validation [String] Set false not to raise the error when finding invalid folder name @return [Array<Deliver::AppScreenshot>] The list of AppScreenshot that exist under given `root` directory

# File deliver/lib/deliver/loader.rb, line 86
def self.load_app_screenshots(root, ignore_validation)
  screenshots = language_folders(root, ignore_validation, true).flat_map do |language_folder|
    paths = if language_folder.framed_file_paths.count > 0
              UI.important("Framed screenshots are detected! πŸ–Ό Non-framed screenshot files may be skipped. πŸƒ")
              # watchOS screenshots can be picked up even when framed ones were found since frameit doesn't support watchOS screenshots
              framed_or_watch, skipped = language_folder.file_paths.partition { |path| path.downcase.include?('framed') || path.downcase.include?('watch') }
              skipped.each { |path| UI.important("πŸƒ Skipping screenshot file: #{path}") }
              framed_or_watch
            else
              language_folder.file_paths
            end
    paths.map { |path| AppScreenshot.new(path, language_folder.language) }
  end

  errors = []
  valid_screenshots = screenshots.select { |screenshot| Deliver::AppScreenshotValidator.validate(screenshot, errors) }

  errors_to_skip, errors_to_crash = errors.partition(&:to_skip)

  unless errors_to_skip.empty?
    UI.important("πŸƒ Screenshots to be skipped are detected!")
    errors_to_skip.each { |error| UI.message(error) }
  end

  unless errors_to_crash.empty?
    UI.important("🚫 Invalid screenshots were detected! Here are the reasons:")
    errors_to_crash.each { |error| UI.error(error) }
    UI.user_error!("Canceled uploading screenshots. Please check the error messages above and fix the screenshots.")
  end

  valid_screenshots
end