deliver/lib/deliver/app_screenshot_iterator.rb in fastlane-2.156.1 vs deliver/lib/deliver/app_screenshot_iterator.rb in fastlane-2.157.0

- old
+ new

@@ -11,18 +11,18 @@ # Iterate app_screenshot_set over localizations # # @yield [localization, app_screenshot_set] # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreVersionLocalization] localization # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshotSet] app_screenshot_set - def each_app_screenshot_set(&block) - return enum_for(__method__) unless block_given? + def each_app_screenshot_set(localizations = @localizations, &block) + return enum_for(__method__, localizations) unless block_given? # Collect app_screenshot_sets from localizations in parallel but # limit the number of threads working at a time with using `lazy` and `force` controls # to not attack App Store Connect - results = @localizations.each_slice(NUMBER_OF_THREADS).lazy.map do |localizations| - localizations.map do |localization| + results = localizations.each_slice(NUMBER_OF_THREADS).lazy.map do |localizations_grouped| + localizations_grouped.map do |localization| Thread.new do [localization, localization.get_app_screenshot_sets] end end end.flat_map do |threads| @@ -61,38 +61,35 @@ # @yieldparam [optional, Deliver::AppScreenshot] screenshot # @yieldparam [optional, Integer] index a number reperesents which position the screenshot will be def each_local_screenshot(screenshots_per_language, &block) return enum_for(__method__, screenshots_per_language) unless block_given? - # Iterate over all the screenshots per language and display_type - # and then enqueue them to worker one by one if it's not duplciated on App Store Connect - screenshots_per_language.map do |language, screenshots_for_language| - localization = @localizations.find { |l| l.locale == language } - [localization, screenshots_for_language] - end.reject do |localization, _| - localization.nil? - end.each do |localization, screenshots_for_language| - iterate_over_screenshots_per_language(localization, screenshots_for_language, &block) + # filter unnecessary localizations + supported_localizations = @localizations.reject { |l| screenshots_per_language[l.locale].nil? } + + # build a hash that can access app_screenshot_set corresponding to given locale and display_type + # via parallelized each_app_screenshot_set to gain performance + app_screenshot_set_per_locale_and_display_type = each_app_screenshot_set(supported_localizations) + .each_with_object({}) do |(localization, app_screenshot_set), hash| + hash[localization.locale] ||= {} + hash[localization.locale][app_screenshot_set.screenshot_display_type] = app_screenshot_set end - end - private + # iterate over screenshots per localization + screenshots_per_language.each do |language, screenshots_for_language| + localization = supported_localizations.find { |l| l.locale == language } + screenshots_per_display_type = screenshots_for_language.reject { |screenshot| screenshot.device_type.nil? }.group_by(&:device_type) - def iterate_over_screenshots_per_language(localization, screenshots_for_language, &block) - app_screenshot_sets_per_display_type = localization.get_app_screenshot_sets.map { |set| [set.screenshot_display_type, set] }.to_h - screenshots_per_display_type = screenshots_for_language.reject { |screenshot| screenshot.device_type.nil? }.group_by(&:device_type) + screenshots_per_display_type.each do |display_type, screenshots| + # create AppScreenshotSet for given display_type if it doesn't exsit + app_screenshot_set = app_screenshot_set_per_locale_and_display_type[language][display_type] + app_screenshot_set ||= localization.create_app_screenshot_set(attributes: { screenshotDisplayType: display_type }) - screenshots_per_display_type.each do |display_type, screenshots| - # Create AppScreenshotSet for given display_type if it doesn't exsit - app_screenshot_set = app_screenshot_sets_per_display_type[display_type] - app_screenshot_set ||= localization.create_app_screenshot_set(attributes: { screenshotDisplayType: display_type }) - iterate_over_screenshots_per_display_type(localization, app_screenshot_set, screenshots, &block) - end - end - - def iterate_over_screenshots_per_display_type(localization, app_screenshot_set, screenshots, &block) - screenshots.each.with_index do |screenshot, index| - yield(localization, app_screenshot_set, screenshot, index) + # iterate over screenshots per display size with index + screenshots.each.with_index do |screenshot, index| + yield(localization, app_screenshot_set, screenshot, index) + end + end end end end end