class Fastlane::Helper::App

Constants

ATTRS
INFO_PLIST

Public Class Methods

new(app_path, options = {}) click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 42
def initialize(app_path, options = {})
  @group    = options[:group] || false
  @app_path = app_path

  return nil unless app_path
  return nil if app_path.empty?
  return nil unless File.exist?(app_path)

  # size
  @size        = FileHelper.file_size(app_path)
  @format_size = FileHelper.format_size(@size)

  # info.plist
  info_plist_path = File.expand_path(INFO_PLIST, app_path)
  @info = InfoPlist.new(info_plist_path)
end

Public Instance Methods

categories() click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 132
def categories
  return @categories if @categories

  #
  # 去除 file categories 中, name == 'Unknown' 重复的 Unknown FileCategory
  categories_rejected = category_app_files.reject { |c|
    c.name == FileCategory::UNKNOWN
  }
  # pp categories_rejected.count

  #
  # 再追加 平铺(flatten) 之后的 UNKNOWN FileCategory
  categories_rejected.push(flatten_unknown_category)

  #
  # sort FileCategory
  categories_sorted = categories_rejected.sort { |a, b|
    b.size <=> a.size
  }

  # sort FileCategory.files
  @categories = categories_sorted.map { |e|
    e.file_infos = e.file_infos.sort { |a, b|
      b.size <=> a.size
    }
    e
  }
  # pp @categories.count
  # pp @categories

  @categories
end
category_app_files() click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 88
def category_app_files
  return @category_app_files if @category_app_files

  #
  # 解析生成 FileCategory(文件类型)/FileInfo(文件) 结构
  # [
  #   #<FileCategory:0x01>, @name="分类1", @file_infos=[#<FileInfo:0x01>, #<FileInfo:0x02>, ... #<FileInfo:0x0N>],
  #   #<FileCategory:0x01>, @name="分类2", @file_infos=[#<FileInfo:0x01>, #<FileInfo:0x02>, ... #<FileInfo:0x0N>],
  #   ...
  #   #<FileCategory:0x01>, @name="分类3", @file_infos=[#<FileInfo:0x01>, #<FileInfo:0x02>, ... #<FileInfo:0x0N>],
  # ]
  @category_app_files = group_app_files.map { |k ,v|
    FileCategory.categories(k, v, executable: @info.executable)
  }.compact.flatten
  # pp file_categories.count
  # pp file_categories

  @category_app_files
end
flatten_unknown_category() click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 108
def flatten_unknown_category
  return @unknown_category if @unknown_category

  #
  # 从 grouped 之后的 文件类型, 移除出来的 重复的 name == 'Unknown' 的 UNKNOWN FileCategory
  categories_unknowned = category_app_files.select { |c|
    c.name == FileCategory::UNKNOWN
  }
  # pp categories_unknowned

  #
  # 平铺 UNKNOWN FileCategory 中的, 多个 FileCategory/FileInfo数组
  unknown_files_infos = []
  categories_unknowned.each_with_object(unknown_files_infos) { |e, mem|
    mem.concat(e.file_infos).compact.flatten
  }
  unknown_files_infos.uniq! { |e| e.name }

  #
  # 重新创建 FileCategory, 并归属包含的 FileInfo
  @unknown_category = FileCategory.categories(FileCategory::UNKNOWN_FILES, unknown_files_infos)
  @unknown_category
end
generate_hash() click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 171
def generate_hash
  return @result_hash if @result_hash
  @result_hash = to_hash
  @result_hash
end
generate_json() click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 165
def generate_json
  return @result_json if @result_json
  @result_json = JSON.generate(generate_hash)
  @result_json
end
group_app_files() click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 75
def group_app_files
  return @group_app_files if @group_app_files

  #
  # 按照 type 对 [#<FileInfo:0x01>, #<FileInfo:0x02>, ... #<FileInfo:0x0N>] 进行【分组】
  @group_app_files = parse_app_files.group_by { |e|
    e.type
  }
  # pp @group_app_files

  @group_app_files
end
parse_app_files() click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 59
def parse_app_files
  return @files if @files

  files = FileHelper.glob_files('*', @app_path)
  # pp files
  return nil unless files
  return nil if files.empty?

  #
  # 解析 具体文件 => FileInfo
  @file_infos = files.map {|f|
    FileInfo.new(f)
  }
  @file_infos
end
to_hash() click to toggle source
# File lib/fastlane/plugin/analyze_ios_ipa/helper/app.rb, line 18
def to_hash
  h = {
    size:        @size,
    format_size: @format_size,
    info: {
      executable:          @info.executable,
      device_capabilities: @info.device_capabilities,
      app_type:            @info.app_type, #=> 只有自己项目使用
      identifier:          @info.identifier,
      display_name:        @info.display_name,
      version:             @info.version,
      short_version:       @info.short_version
    }
  }

  if group?
    h[:categories] = categories.map(&:to_hash)
  else
    h[:files]      = parse_app_files.map(&:to_hash)
  end

  h
end