class IOSAssetUpdater

Provides a way to update iOS Assets with new ones

Public Class Methods

copy(source, destination) click to toggle source
# File lib/ios_asset_updater.rb, line 89
def self.copy(source, destination)
  log_separator
  log("#{'Copying ->'.light_green} #{source}")
  FileUtils.cp(source, destination)
end
create_hash(files) click to toggle source
# File lib/ios_asset_updater.rb, line 67
def self.create_hash(files)
  new_hash = {}
  files.each do |file|
    properties = {}
    properties[:extension] = File.extname(file)
    properties[:basename] = File.basename(file)
    properties[:name] = File.basename(file, properties[:extension])
    properties[:dir] = File.dirname(file)
    properties[:contents_path] = "#{properties[:dir]}/Contents.json"

    new_hash[file] = properties
  end
  new_hash
end
delete(path) click to toggle source
# File lib/ios_asset_updater.rb, line 119
def self.delete(path)
  File.delete(path)
  log("Deleted outdated file -> #{path}".light_red)
end
extension_equal?(source_file_path, destination_file_path) click to toggle source
# File lib/ios_asset_updater.rb, line 95
def self.extension_equal?(source_file_path, destination_file_path)
  source_file_path_basename = File.basename(source_file_path)
  destination_file_path_basename = File.basename(destination_file_path)

  source_file_path_basename.eql?(destination_file_path_basename)
end
files_in_dir(dir) click to toggle source
# File lib/ios_asset_updater.rb, line 63
def self.files_in_dir(dir)
  Dir["#{dir}/**/*.{jpg,png}"]
end
find_path(search_file_name, destination_files) click to toggle source
# File lib/ios_asset_updater.rb, line 82
def self.find_path(search_file_name, destination_files)
  destination_files.find do |file|
    file.include?("#{search_file_name}.jpg") ||
      file.include?("#{search_file_name}.png")
  end
end
log(msg) click to toggle source
# File lib/ios_asset_updater.rb, line 137
def self.log(msg)
  time = Time.new
  prefix = "[#{time.strftime('%H:%M:%S')}]: "
  puts("#{prefix}#{msg}")
end
log_not_found(not_found) click to toggle source
# File lib/ios_asset_updater.rb, line 124
def self.log_not_found(not_found)
  return if not_found.nil? || not_found.empty?

  log("The following #{not_found.length} files were not found:".yellow)
  not_found.each do |not_found_path|
    log("▸ #{not_found_path}")
  end
end
log_separator() click to toggle source
# File lib/ios_asset_updater.rb, line 133
def self.log_separator
  log('---'.cyan)
end
update(source, destination) click to toggle source

Copies image files (.jpg, .png) from a source, and update corresponding assets in an iOS project folder. Names have to match exactly for the update to take place, but the file extensions can be different. If necessary, Contents.json is updated to reflect the changes. Params:

source

Source folder containing images

destination

Destination folder, tipically an iOS project

# File lib/ios_asset_updater.rb, line 17
def self.update(source, destination)
  if source.empty? || destination.empty?
    log('You must provide source and destination folders'.light_red)
    return false
  end

  log("Searching image assets (png,jpg) in #{source}".light_blue)

  source_files = files_in_dir(source)
  source_hash = create_hash(source_files)

  destination_files = files_in_dir(destination)
  destination_hash = create_hash(destination_files)

  not_found = []

  source_files.each do |source_file_path|
    source_file = source_hash[source_file_path]

    destination_file_path = find_path(source_file[:name], destination_files)

    if destination_file_path.nil? || destination_file_path.empty?
      not_found.push(source_file_path)
      next
    end

    destination_file = destination_hash[destination_file_path]

    copy(source_file_path, destination_file[:dir])

    if extension_equal?(source_file[:basename], destination_file[:basename])
      log("#{'File extensions are equal ->'.light_green} "\
        'No need for updating Contents.json')
      next
    end

    update_contents_json(source_file, destination_file)

    delete(destination_file_path)
  end

  log_not_found(not_found)

  return true
end
update_contents_json(source_file, destination_file) click to toggle source
# File lib/ios_asset_updater.rb, line 102
def self.update_contents_json(source_file, destination_file)
  log('File extensions are different. Updating Contents.json'.light_green)

  contents_json_file = File.read(destination_file[:contents_path])
  contents_json = JSON.parse(contents_json_file)

  image_json = contents_json['images'].find do |content|
    content['filename'].match(destination_file[:basename])
  end

  image_json['filename'] = source_file[:basename]

  File.open(destination_file[:contents_path], 'w') do |f|
    f.write(JSON.pretty_generate(contents_json))
  end
end