class SC::Helpers::EntrySorter

Sorts a set of entries, respecting any “requires” found in the entries. To use the sorter, just call the class method EntrySorter.sort() passing the entries to sort along with any filenames you prefer to have added to the top. If you don't specify any filenames, then the entries will be sorted alphabetically except for requires.

When module_info.js is present, it will always be sorted first.

Attributes

preferred_filenames[R]

Public Class Methods

new(preferred_filenames = []) click to toggle source
# File lib/sproutcore/helpers/entry_sorter.rb, line 38
def initialize(preferred_filenames = [])
  @preferred_filenames = preferred_filenames
end
sort(entries, preferred_filenames = []) click to toggle source
# File lib/sproutcore/helpers/entry_sorter.rb, line 34
def self.sort(entries, preferred_filenames = [])
  self.new(preferred_filenames).sort(entries)
end

Public Instance Methods

sort(entries) click to toggle source
# File lib/sproutcore/helpers/entry_sorter.rb, line 44
def sort(entries)
  moduleInfoEntry = []
  bundleLoadedEntry = []

  all_entries = {}
  entries.each do |e|
    name = e.extensionless_filename
    all_entries[name] = e
  end


  # first remove bundle entries which MUST be first or last
  entries = entries.select do |entry|
    if entry.normalized_filename == 'module_info.js'
      moduleInfoEntry = [entry]
      false
    else
      true
    end
  end

  entries.sort_by! do |entry|
    name = entry.normalized_filename

    result = case name
    when /main\.js$/
      [2, name]
    when /(?:lproj|resources)\/.+_page\.js$/
      [1, name]
    when /lproj\/strings.js$/
      [-2, name]
    when /lproj\/layout.js$/
      [-2, name]
    else
      [-1, name]
    end

    # force preferred filenames to the front on the list
    result.unshift(@preferred_filenames.include?(name) ? -1 : 1)
  end

  # now process each entry to handle requires
  seen = Set.new
  ret = []
  while cur = entries.shift
    add_entry_to_set(cur, ret, seen, entries, all_entries)
  end

  return moduleInfoEntry + ret
end

Protected Instance Methods

add_entry_to_set(entry, ret, seen, entries, all_entries) click to toggle source

Adds the specified entry to the ordered array, adding required first

# File lib/sproutcore/helpers/entry_sorter.rb, line 114
def add_entry_to_set(entry, ret, seen, entries, all_entries)
  return if seen.include?(entry)

  seen << entry
  req = required_entries(entry[:required], entries, entry, all_entries)
  req.each do |required|
    add_entry_to_set(required, ret, seen, entries, all_entries)
  end
  ret << entry
end
required_entries(required, entries, requiring_entry, all_entries) click to toggle source

Converts a passed set of requires into entries

# File lib/sproutcore/helpers/entry_sorter.rb, line 98
def required_entries(required, entries, requiring_entry, all_entries)
  return [] unless required

  required.map do |filename|
    normalized_filename = filename.downcase
    entry = all_entries["source/#{normalized_filename}"] || all_entries["source/lproj/#{normalized_filename}"]

    unless entry
      SC.logger.warn "Could not find entry '#{filename}' required in #{requiring_entry.target[:target_name].to_s.sub(/^\//,'')}:#{requiring_entry[:filename]}"
    end

    entry
  end.compact
end