class AdobeCRX::UberPackageManager

Public Class Methods

new(client) click to toggle source
# File lib/adobe_crx/uber_package_manager.rb, line 4
def initialize(client)
  @client = client
end

Public Instance Methods

export_uber_package(uber_package_definition, dest_dir = nil) click to toggle source
# File lib/adobe_crx/uber_package_manager.rb, line 27
def export_uber_package(uber_package_definition, dest_dir = nil)
  manifest_file = File.open(uber_package_definition, "rb")
  uber = AdobeCRX::UberPackage.from_json manifest_file.read
  
  uber_dir = dest_dir ? dest_dir : "#{Dir.tmpdir}/uber_packages/#{uber.name}"
  FileUtils.mkpath uber_dir
  
  #export the packages to the uber_dir
  uber.packages.each do |package|
    puts "exporting #{package.name}..."
    @client.export_package package, "#{uber_dir}/#{package.name}.zip"
  end
end
generate_uber_package_definition(name, root_path, options = {}) click to toggle source
# File lib/adobe_crx/uber_package_manager.rb, line 8
def generate_uber_package_definition(name, root_path, options = {})
  opts = {
    :target_package_size => 0,
    :root_package_depth => 1 #if 0, what's the point of creating an uber package?
  }.merge(options)
  
  root_node = get_node_structure(root_path, opts, 0)
  
  uber = AdobeCRX::UberPackage.new name
  root_package = AdobeCRX::Package.new "#{name}-root"
  uber.packages << root_package
  root_filter = AdobeCRX::PackageFilter.new root_path
  root_package.filters << root_filter
  root_package.properties[:size] = root_node.size
  process_node_for_uber(name, root_node, uber.packages, root_package, opts, 0)
  
  JSON.pretty_generate(JSON.parse(uber.to_json))
end
import_uber_package(uber_package_definition, uber_package_dir) click to toggle source
# File lib/adobe_crx/uber_package_manager.rb, line 41
def import_uber_package(uber_package_definition, uber_package_dir)
  manifest_file = File.open(uber_package_definition, "rb")
  uber = AdobeCRX::UberPackage.from_json manifest_file.read
  
  #import the packages to the target crx instance
  uber.packages.each do |package|
    puts "importing #{package.name}..."
    p_file = "#{uber_package_dir}/#{package.name}.zip"
    if File.exist? p_file
      @client.import_package p_file
    else
      puts "ERROR: package does not exist at '#{p_file}'"
    end 
  end
end

Private Instance Methods

get_node_structure(path, options, current_level, parent_node = nil) click to toggle source
# File lib/adobe_crx/uber_package_manager.rb, line 59
def get_node_structure(path, options, current_level, parent_node = nil)
  if options[:root_package_depth] > current_level
    node = AdobeCRX::Node.new path
    @client.get_child_resources(path).each do |child_path|
      get_node_structure(child_path, options, current_level + 1, node)
    end
  elsif options[:target_package_size] > 0
    node = @client.get_node_structure path
  else
    node = AdobeCRX::Node.new path
    @client.get_child_resources(path).each do |child_path|
      node.children << AdobeCRX::Node.new(child_path)
    end
  end
  if parent_node
    parent_node.children << node
  end
  node
end
process_node_for_uber(name, node, packages, current_package, options, current_level) click to toggle source
# File lib/adobe_crx/uber_package_manager.rb, line 79
def process_node_for_uber(name, node, packages, current_package, options, current_level)
  #puts "#{node.path}: #{current_package.properties[:size]}, #{node.size}, #{node.children_size}, #{node.total_size}"
  if options[:root_package_depth] > 0 && options[:root_package_depth] > current_level
    node.children.each do |child|
      process_node_for_uber(name, child, packages, current_package, options, current_level + 1)
    end
  elsif options[:root_package_depth] > 0 && options[:root_package_depth] == current_level
    current_package.filters[0].rules << AdobeCRX::PackageFilterRule.new('exclude', node.path)
    current_package.filters[0].rules << AdobeCRX::PackageFilterRule.new('exclude', "#{node.path}/.*")
    new_package = AdobeCRX::Package.new "#{name}-#{node.path}".gsub('/', '-').gsub(' ', '_').gsub("%20", '_')
    packages << new_package
    new_filter = AdobeCRX::PackageFilter.new node.path
    new_package.filters << new_filter
    new_package.properties[:size] = node.size
    node.children.each do |child|
      process_node_for_uber(name, child, packages, new_package, options, current_level + 1)
    end
  elsif node.total_size > 0
    branch_to_new_package = (
      ((node.size + current_package.properties[:size]) > options[:target_package_size]) || 
      ((node.children_size + current_package.properties[:size]) > options[:target_package_size])
    )
    
    if branch_to_new_package
      current_package.filters[0].rules << AdobeCRX::PackageFilterRule.new('exclude', node.path)
      current_package.filters[0].rules << AdobeCRX::PackageFilterRule.new('exclude', "#{node.path}/.*")
      new_package = AdobeCRX::Package.new "#{name}-#{node.path}".gsub('/', '-').gsub(' ', '_').gsub("%20", '_')
      packages << new_package
      new_filter = AdobeCRX::PackageFilter.new node.path
      new_package.filters << new_filter
      new_package.properties[:size] = node.size
      node.children.each do |child|
        process_node_for_uber(name, child, packages, new_package, options, current_level + 1)
      end
    else
      current_package.properties[:size] = current_package.properties[:size] + node.size
      node.children.each do |child|
        process_node_for_uber(name, child, packages, current_package, options, current_level + 1)
      end
    end
  end
end