class Jpmobile::Resolver

Constants

DEFAULT_PATTERN
EXTENSIONS

Public Class Methods

new(path, pattern=nil) click to toggle source
# File lib/jpmobile/resolver.rb, line 6
def initialize(path, pattern=nil)
  raise ArgumentError, "path already is a Resolver class" if path.is_a?(Resolver)
  super(path, pattern || DEFAULT_PATTERN)
  @path = File.expand_path(path)
end

Private Instance Methods

build_query(path, details) click to toggle source

Helper for building query glob string based on resolver's pattern.

# File lib/jpmobile/resolver.rb, line 15
def build_query(path, details)
  if path.prefix.match(/^\//) and !File.exists?(path.prefix)
    path = Path.build(path.name, File.join(@path, path.prefix), path.partial)
  end

  query = @pattern.dup

  prefix = path.prefix.empty? ? "" : "#{escape_entry(path.prefix)}\\1"
  query.gsub!(/\:prefix(\/)?/, prefix)

  partial = escape_entry(path.partial? ? "_#{path.name}" : path.name)
  query.gsub!(/\:action/, partial)

  details.each do |ext, variants|
    query.gsub!(/\:#{ext}/, "{#{variants.compact.uniq.join(',')}}")
  end

  File.expand_path(query, @path)
end
query(path, details, formats) click to toggle source
# File lib/jpmobile/resolver.rb, line 35
def query(path, details, formats)
  query = build_query(path, details)

  # deals with case-insensitive file systems.
  sanitizer = Hash.new { |h,dir| h[dir] = Dir["#{dir}/*"] }

  template_paths = Dir[query].reject { |filename|
    File.directory?(filename) ||
      !sanitizer[File.dirname(filename)].include?(filename)
  }

  template_paths.map { |template|
    handler, format = extract_handler_and_format(template, formats)
    contents = File.binread template

    if format
      variant = template.match(/.+#{path}(.+)\.#{format.to_sym.to_s}.*$/) ? $1 : ''
      virtual_path = variant.blank? ? nil : path + variant
    else
      virtual_path = path.virtual
    end

    ActionView::Template.new(contents, File.expand_path(template), handler,
      :virtual_path => virtual_path,
      :format       => format,
      :updated_at   => mtime(template))
  }
end