Sha256: 640fb015639538f246ac20132551ab4c512ef71e9c7e67f004cb75dbf1f260d6

Contents?: true

Size: 1.77 KB

Versions: 1

Compression:

Stored size: 1.77 KB

Contents

module Rail
  class Pipeline
    extend Forwardable

    def_delegators :@host, :root, :gems, :helpers, :compress?

    def initialize(host)
      @host = host
    end

    def process(request)
      Thread.current[:request] = request

      path = request.path

      case path
      when '', 'index.html'
        path = 'layouts/application'
      end

      path = "#{ path }.html" if File.extname(path).empty?

      asset = sprockets[path]
      code, body = asset ? [ 200, asset ] : [ 404, [ 'Not found' ] ]

      [ code, {}, body ]
    end

    private

    def sprockets
      @sprockets ||= build_sprockets
    end

    def build_sprockets
      environment = Sprockets::Environment.new

      paths.each do |directory|
        environment.append_path(directory)
      end

      if compress?
        environment.js_compressor = :uglify
        environment.css_compressor = :scss
      end

      # TODO: Find a per-instance way to configure HAML.
      Haml::Options.defaults[:ugly] = compress?

      helpers.each do |helper|
        environment.context_class.class_eval do
          include helper
        end
      end

      environment.context_class.class_eval do
        define_method(:request) do
          Thread.current[:request]
        end
      end

      environment
    end

    def paths
      (application_paths + gems.map { |name| gem_paths(name) }).flatten
    end

    def application_paths
      [
        File.join(root, 'app/assets/javascripts'),
        File.join(root, 'app/assets/stylesheets'),
        File.join(root, 'app/views')
      ]
    end

    def gem_paths(name)
      gem = Gem::Specification.find_by_name(name)
      [
        File.join(gem.gem_dir, 'lib/assets/javascripts'),
        File.join(gem.gem_dir, 'lib/assets/stylesheets')
      ]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rail-0.0.2 lib/rail/pipeline.rb