Skip to content

Sprockets 2.x compat #212

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 2, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ source "https://rubygems.org"
gemspec

gem "rails", github: 'rails/rails', branch: '4-1-stable'
gem "sprockets-rails", github: 'rails/sprockets-rails', branch: '2-1-stable'

gem "sqlite3"
156 changes: 74 additions & 82 deletions lib/sass/rails/importer.rb
Original file line number Diff line number Diff line change
@@ -1,104 +1,96 @@
require 'sprockets/sass_importer'

module Sprockets
class SassImporter < Sass::Importers::Filesystem
GLOB = /\*|\[.+\]/

attr_reader :context
private :context

def extensions
{
'css' => :scss,
'css.scss' => :scss,
'css.sass' => :sass,
'css.erb' => :scss,
'scss.erb' => :scss,
'sass.erb' => :sass,
'css.scss.erb' => :scss,
'css.sass.erb' => :sass
}.merge!(super)
end

def find_relative(name, base, options)
if name =~ GLOB
glob_imports(name, Pathname.new(base), options)
else
engine_from_path(name, File.dirname(base), options)
module Sass
module Rails
class SassImporter < Sass::Importers::Filesystem
GLOB = /\*|\[.+\]/

attr_reader :context
def initialize(context, *args)
@context = context
super(*args)
end
end

def find(name, options)
if name =~ GLOB
nil # globs must be relative
else
engine_from_path(name, root, options)
def extensions
{
'css' => :scss,
'css.scss' => :scss,
'css.sass' => :sass,
'css.erb' => :scss,
'scss.erb' => :scss,
'sass.erb' => :sass,
'css.scss.erb' => :scss,
'css.sass.erb' => :sass
}.merge!(super)
end
end

def each_globbed_file(glob, base_pathname, options)
Dir["#{base_pathname}/#{glob}"].sort.each do |filename|
next if filename == options[:filename]
yield filename if File.directory?(filename) || context.asset_requirable?(filename)
def find_relative(name, base, options)
if name =~ GLOB
glob_imports(name, Pathname.new(base), options)
else
engine_from_path(name, File.dirname(base), options)
end
end
end

def glob_imports(glob, base_pathname, options)
contents = ""
each_globbed_file(glob, base_pathname.dirname, options) do |filename|
if File.directory?(filename)
depend_on(filename)
elsif context.asset_requirable?(filename)
depend_on(filename)
contents << "@import #{Pathname.new(filename).relative_path_from(base_pathname.dirname).to_s.inspect};\n"
def find(name, options)
if name =~ GLOB
nil # globs must be relative
else
engine_from_path(name, root, options)
end
end
return nil if contents.empty?
Sass::Engine.new(contents, options.merge(
:filename => base_pathname.to_s,
:importer => self,
:syntax => :scss
))
end

private

def depend_on(filename)
context.depend_on(filename)
context.depend_on(globbed_file_parent(filename))
end
private

def each_globbed_file(glob, base_pathname, options)
Dir["#{base_pathname}/#{glob}"].sort.each do |filename|
next if filename == options[:filename]
if File.directory?(filename)
context.depend_on(filename)
context.depend_on(File.expand_path('..', filename))
elsif context.asset_requirable?(filename)
context.depend_on(File.dirname(filename))
yield filename
end
end
end

def globbed_file_parent(filename)
if File.directory?(filename)
File.expand_path('..', filename)
else
File.dirname(filename)
def glob_imports(glob, base_pathname, options)
contents = ""
each_globbed_file(glob, base_pathname.dirname, options) do |filename|
contents << "@import #{Pathname.new(filename).relative_path_from(base_pathname.dirname).to_s.inspect};\n"
end
return nil if contents.empty?
Sass::Engine.new(contents, options.merge(
:filename => base_pathname.to_s,
:importer => self,
:syntax => :scss
))
end
end

def engine_from_path(name, dir, options)
full_filename, syntax = Sass::Util.destructure(find_real_file(dir, name, options))
return unless full_filename && File.readable?(full_filename)

engine = Sass::Engine.new(evaluate(full_filename), options.merge(
syntax: syntax,
filename: full_filename,
importer: self
))
def engine_from_path(name, dir, options)
full_filename, syntax = Sass::Util.destructure(find_real_file(dir, name, options))
return unless full_filename && File.readable?(full_filename)

if engine && (filename = engine.options[:filename])
@context.depend_on(filename)
context.depend_on full_filename
engine = Sass::Engine.new(evaluate(full_filename), options.merge(
syntax: syntax,
filename: full_filename,
importer: self
))

engine
end

engine
end
def evaluate(filename)
attributes = context.environment.attributes_for(filename)
processors = context.environment.preprocessors(attributes.content_type) +
attributes.engines.reverse - [Sass::Rails::ScssTemplate, Sass::Rails::SassTemplate]

def evaluate(filename)
attributes = context.environment.attributes_for(filename)
processors = context.environment.preprocessors(attributes.content_type) +
attributes.engines.reverse - [Sprockets::ScssTemplate, Sprockets::SassTemplate]
context.evaluate(filename, processors: processors)
end

context.evaluate(filename, processors: processors)
end
end
end
end
3 changes: 3 additions & 0 deletions lib/sass/rails/railtie.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ module SassContext
end

if app.assets
app.assets.register_engine '.sass', Sass::Rails::SassTemplate
app.assets.register_engine '.scss', Sass::Rails::ScssTemplate

app.assets.context_class.extend(SassContext)
app.assets.context_class.sass_config = app.config.sass
end
Expand Down
54 changes: 34 additions & 20 deletions lib/sass/rails/template.rb
Original file line number Diff line number Diff line change
@@ -1,28 +1,42 @@
require "sprockets/sass_template"

module Sprockets
class SassTemplate
def evaluate(context, locals, &block)
cache_store = SassCacheStore.new(context.environment)
module Sass
module Rails
class SassTemplate < Sprockets::SassTemplate

options = {
:filename => eval_file,
:line => line,
:syntax => syntax,
:cache_store => cache_store,
:importer => SassImporter.new(context, context.pathname),
:load_paths => context.environment.paths.map { |path| SassImporter.new(context, path) },
:sprockets => {
:context => context,
:environment => context.environment
def evaluate(context, locals, &block)
cache_store = Sprockets::SassCacheStore.new(context.environment)

options = {
:filename => eval_file,
:line => line,
:syntax => syntax,
:cache_store => cache_store,
:importer => SassImporter.new(context, context.pathname.to_s),
:load_paths => context.environment.paths.map { |path| SassImporter.new(context, path.to_s) },
:sprockets => {
:context => context,
:environment => context.environment
}
}
}

sass_config = context.environment.context_class.sass_config.merge(options)
::Sass::Engine.new(data, sass_config).render
rescue ::Sass::SyntaxError => e
context.__LINE__ = e.sass_backtrace.first[:line]
raise e
sass_config = context.environment.context_class.sass_config.merge(options)

::Sass::Engine.new(data, sass_config).render
rescue ::Sass::SyntaxError => e
context.__LINE__ = e.sass_backtrace.first[:line]
raise e
end
end

class ScssTemplate < SassTemplate
def self.default_mime_type
'text/css'
end

def syntax
:scss
end
end
end
end
Loading