compass-rails 1.0.0.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/Appraisals +17 -0
- data/Gemfile +22 -0
- data/Guardfile +9 -0
- data/LICENSE +22 -0
- data/README.md +191 -0
- data/Rakefile +34 -0
- data/compass-rails.gemspec +21 -0
- data/gemfiles/rails2.gemfile +21 -0
- data/gemfiles/rails2.gemfile.lock +87 -0
- data/gemfiles/rails3.gemfile +21 -0
- data/gemfiles/rails3.gemfile.lock +134 -0
- data/gemfiles/rails31.gemfile +22 -0
- data/gemfiles/rails31.gemfile.lock +151 -0
- data/gemfiles/rails32.gemfile +22 -0
- data/gemfiles/rails32.gemfile.lock +148 -0
- data/lib/compass-rails.rb +207 -0
- data/lib/compass-rails/configuration.rb +1 -0
- data/lib/compass-rails/configuration/3_1.rb +51 -0
- data/lib/compass-rails/configuration/default.rb +75 -0
- data/lib/compass-rails/installer.rb +30 -0
- data/lib/compass-rails/patches.rb +6 -0
- data/lib/compass-rails/patches/3_1.rb +28 -0
- data/lib/compass-rails/patches/importer.rb +26 -0
- data/lib/compass-rails/patches/sprite_importer.rb +38 -0
- data/lib/compass-rails/railties.rb +11 -0
- data/lib/compass-rails/railties/2_3.rb +56 -0
- data/lib/compass-rails/railties/3_0.rb +48 -0
- data/lib/compass-rails/railties/3_1.rb +90 -0
- data/lib/compass-rails/version.rb +5 -0
- data/lib/compass/app_integration/rails.rb +10 -0
- data/test/fixtures/.gitkeep +0 -0
- data/test/helpers/command_helper.rb +120 -0
- data/test/helpers/debug_helper.rb +12 -0
- data/test/helpers/file_helper.rb +53 -0
- data/test/helpers/rails_helper.rb +65 -0
- data/test/helpers/rails_project.rb +186 -0
- data/test/integrations/.gitkeep +0 -0
- data/test/integrations/rails3_test.rb +37 -0
- data/test/integrations/rails_23_test.rb +28 -0
- data/test/integrations/rails_31_test.rb +47 -0
- data/test/integrations/rails_32_test.rb +46 -0
- data/test/test_helper.rb +15 -0
- data/test/units/.gitkeep +0 -0
- metadata +160 -0
@@ -0,0 +1,207 @@
|
|
1
|
+
require 'compass'
|
2
|
+
require "compass-rails/version"
|
3
|
+
require "compass-rails/configuration"
|
4
|
+
|
5
|
+
module CompassRails
|
6
|
+
|
7
|
+
RAILS_32 = %r{^3.2}
|
8
|
+
RAILS_31 = %r{^3.1}
|
9
|
+
RAILS_23 = %r{^2.3}
|
10
|
+
RAILS_3 = %r{^3.0}
|
11
|
+
|
12
|
+
extend self
|
13
|
+
|
14
|
+
def load_rails
|
15
|
+
return if defined?(::Rails) && !::Rails.application.nil?
|
16
|
+
rails_config_path = Dir.pwd
|
17
|
+
until File.exists?(File.join(rails_config_path, 'config', 'application.rb')) do
|
18
|
+
raise 'Rails application not found' if rails_config_path == '/'
|
19
|
+
rails_config_path = File.join(rails_config_path, '..')
|
20
|
+
end
|
21
|
+
#load the rails config
|
22
|
+
require "#{rails_config_path}/config/application.rb"
|
23
|
+
if rails31? || rails32?
|
24
|
+
require 'sass-rails'
|
25
|
+
require 'sprockets/railtie'
|
26
|
+
require 'rails/engine'
|
27
|
+
@app ||= ::Rails.application.initialize!(:assets)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def setup_fake_rails_env_paths(sprockets_env)
|
33
|
+
return unless rails_loaded?
|
34
|
+
keys = ['app/assets', 'lib/assets', 'vendor/assets']
|
35
|
+
local = keys.map {|path| ::Rails.root.join(path) }.map { |path| [File.join(path, 'images'), File.join(path, 'stylesheets')] }.flatten!
|
36
|
+
sprockets_env.send(:trail).paths.unshift(*local)
|
37
|
+
paths = []
|
38
|
+
::Rails::Engine.subclasses.each do |subclass|
|
39
|
+
paths = subclass.paths
|
40
|
+
keys.each do |key|
|
41
|
+
sprockets_env.send(:trail).paths.unshift(*paths[key].existent_directories)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def sass_config
|
47
|
+
load_rails
|
48
|
+
::Rails.application.config.sass
|
49
|
+
end
|
50
|
+
|
51
|
+
def sprockets
|
52
|
+
load_rails
|
53
|
+
@sprockets ||= ::Rails.application.assets
|
54
|
+
end
|
55
|
+
|
56
|
+
def context
|
57
|
+
load_rails
|
58
|
+
@context ||= begin
|
59
|
+
sprockets.version = ::Rails.env + "-#{sprockets.version}"
|
60
|
+
setup_fake_rails_env_paths(sprockets)
|
61
|
+
context = ::Rails.application.assets.context_class
|
62
|
+
context.extend(::Sprockets::Helpers::IsolatedHelper)
|
63
|
+
context.extend(::Sprockets::Helpers::RailsHelper)
|
64
|
+
context.extend(::Sass::Rails::Railtie::SassContext)
|
65
|
+
context.sass_config = sass_config
|
66
|
+
|
67
|
+
context
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def installer(*args)
|
72
|
+
CompassRails::Installer.new(*args)
|
73
|
+
end
|
74
|
+
|
75
|
+
def rails_loaded?
|
76
|
+
defined?(::Rails)
|
77
|
+
end
|
78
|
+
|
79
|
+
def rails_version
|
80
|
+
Gem.loaded_specs["rails"].version.to_s
|
81
|
+
end
|
82
|
+
|
83
|
+
def rails3?
|
84
|
+
return false unless defined?(::Rails)
|
85
|
+
rails_version =~ RAILS_3
|
86
|
+
end
|
87
|
+
|
88
|
+
def rails31?
|
89
|
+
return false unless defined?(::Rails)
|
90
|
+
rails_version =~ RAILS_31
|
91
|
+
end
|
92
|
+
|
93
|
+
def rails32?
|
94
|
+
return false unless defined?(::Rails)
|
95
|
+
rails_version =~ RAILS_32
|
96
|
+
end
|
97
|
+
|
98
|
+
def rails2?
|
99
|
+
rails_version =~ RAILS_23
|
100
|
+
end
|
101
|
+
|
102
|
+
def booted!
|
103
|
+
CompassRails.const_set(:BOOTED, true)
|
104
|
+
end
|
105
|
+
|
106
|
+
def booted?
|
107
|
+
defined?(CompassRails::BOOTED) && CompassRails::BOOTED
|
108
|
+
end
|
109
|
+
|
110
|
+
def configuration
|
111
|
+
load_rails unless rails2?
|
112
|
+
config = Compass::Configuration::Data.new('rails')
|
113
|
+
config.extend(Configuration::Default)
|
114
|
+
if (rails31? || rails32?)
|
115
|
+
if asset_pipeline_enabled?
|
116
|
+
require "compass-rails/configuration/3_1"
|
117
|
+
config.extend(Configuration::Rails3_1)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
config
|
121
|
+
end
|
122
|
+
|
123
|
+
def env
|
124
|
+
env_production? ? :production : :development
|
125
|
+
end
|
126
|
+
|
127
|
+
def prefix
|
128
|
+
::Rails.application.config.assets.prefix
|
129
|
+
end
|
130
|
+
|
131
|
+
def env_production?
|
132
|
+
if defined?(::Rails) && ::Rails.respond_to?(:env)
|
133
|
+
::Rails.env.production?
|
134
|
+
elsif defined?(RAILS_ENV)
|
135
|
+
RAILS_ENV == "production"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def root
|
140
|
+
@root ||= begin
|
141
|
+
if defined?(::Rails) && ::Rails.respond_to?(:root)
|
142
|
+
::Rails.root
|
143
|
+
elsif defined?(RAILS_ROOT)
|
144
|
+
Pathname.new(RAILS_ROOT)
|
145
|
+
else
|
146
|
+
Pathname.new(Dir.pwd)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def check_for_double_boot!
|
152
|
+
if booted?
|
153
|
+
Compass::Util.compass_warn("Warning: Compass was booted twice. Compass-rails has got your back; please remove your compass initializer.")
|
154
|
+
else
|
155
|
+
booted!
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def sass_plugin_enabled?
|
160
|
+
unless rails31?
|
161
|
+
defined?(Sass::Plugin) && !Sass::Plugin.options[:never_update]
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Rails 2.x projects use this in their compass initializer.
|
166
|
+
def initialize!(config = nil)
|
167
|
+
check_for_double_boot!
|
168
|
+
config ||= Compass.detect_configuration_file(root)
|
169
|
+
Compass.add_project_configuration(config, :project_type => :rails)
|
170
|
+
Compass.discover_extensions!
|
171
|
+
Compass.configure_sass_plugin!
|
172
|
+
Compass.handle_configuration_change! if sass_plugin_enabled?
|
173
|
+
end
|
174
|
+
|
175
|
+
def configure_rails!(app)
|
176
|
+
return unless app.config.respond_to?(:sass)
|
177
|
+
app.config.compass.to_sass_engine_options.each do |key, value|
|
178
|
+
app.config.sass.send(:"#{key}=", value)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def boot_config
|
183
|
+
config = if (config_file = Compass.detect_configuration_file) && (config_data = Compass.configuration_for(config_file))
|
184
|
+
config_data
|
185
|
+
else
|
186
|
+
Compass::Configuration::Data.new("compass_rails_boot")
|
187
|
+
end
|
188
|
+
config.top_level.project_type = :rails
|
189
|
+
config
|
190
|
+
end
|
191
|
+
|
192
|
+
def asset_pipeline_enabled?
|
193
|
+
return false unless rails_loaded?
|
194
|
+
rails_config = ::Rails.application.config
|
195
|
+
rails_config.respond_to?(:assets) && rails_config.assets.try(:enabled)
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
Compass::AppIntegration.register(:rails, "::CompassRails")
|
201
|
+
Compass.add_configuration(CompassRails.boot_config)
|
202
|
+
|
203
|
+
require "compass-rails/patches"
|
204
|
+
require "compass-rails/railties"
|
205
|
+
require "compass-rails/installer"
|
206
|
+
|
207
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
require "compass-rails/configuration/default"
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module CompassRails
|
2
|
+
module Configuration
|
3
|
+
module Rails3_1
|
4
|
+
|
5
|
+
def default_images_dir
|
6
|
+
File.join("app", "assets", "images")
|
7
|
+
end
|
8
|
+
|
9
|
+
def default_fonts_dir
|
10
|
+
File.join("app", "assets", "fonts")
|
11
|
+
end
|
12
|
+
|
13
|
+
def default_javascripts_dir
|
14
|
+
File.join("app", "assets", "javascripts")
|
15
|
+
end
|
16
|
+
|
17
|
+
def default_css_dir
|
18
|
+
File.join('public', CompassRails.prefix)
|
19
|
+
end
|
20
|
+
|
21
|
+
def default_http_path
|
22
|
+
File.join(CompassRails.prefix)
|
23
|
+
end
|
24
|
+
|
25
|
+
def default_http_images_path
|
26
|
+
"#{top_level.http_path}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_http_generated_images_path
|
30
|
+
"#{top_level.http_path}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def default_http_javascripts_path
|
34
|
+
"#{top_level.http_path}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def default_http_fonts_path
|
38
|
+
"#{top_level.http_path}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_http_stylesheets_path
|
42
|
+
"#{top_level.http_path}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def default_preferred_syntax
|
46
|
+
::Rails.application.config.sass.preferred_syntax rescue nil
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module CompassRails
|
2
|
+
module Configuration
|
3
|
+
module Default
|
4
|
+
|
5
|
+
def project_type_without_default
|
6
|
+
:rails
|
7
|
+
end
|
8
|
+
|
9
|
+
def default_sass_dir
|
10
|
+
File.join("app", "assets", "stylesheets")
|
11
|
+
end
|
12
|
+
|
13
|
+
def default_css_dir
|
14
|
+
File.join("public", "stylesheets")
|
15
|
+
end
|
16
|
+
|
17
|
+
def default_images_dir
|
18
|
+
File.join("public", "images")
|
19
|
+
end
|
20
|
+
|
21
|
+
def default_fonts_dir
|
22
|
+
File.join("public", "fonts")
|
23
|
+
end
|
24
|
+
|
25
|
+
def default_javascripts_dir
|
26
|
+
File.join("public", "javascripts")
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_http_images_path
|
30
|
+
# Relies on the fact that this will be loaded after the "normal"
|
31
|
+
# defaults, so that method_missing finds http_root_relative
|
32
|
+
http_root_relative "images"
|
33
|
+
end
|
34
|
+
|
35
|
+
def default_http_generated_images_path
|
36
|
+
# Relies on the fact that this will be loaded after the "normal"
|
37
|
+
# defaults, so that method_missing finds http_root_relative
|
38
|
+
http_root_relative "images"
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_http_javascripts_path
|
42
|
+
http_root_relative "javascripts"
|
43
|
+
end
|
44
|
+
|
45
|
+
def default_http_fonts_path
|
46
|
+
http_root_relative "fonts"
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_http_stylesheets_path
|
50
|
+
http_root_relative "stylesheets"
|
51
|
+
end
|
52
|
+
|
53
|
+
def default_extensions_dir
|
54
|
+
File.join("vendor", "plugins", "compass_extensions")
|
55
|
+
end
|
56
|
+
|
57
|
+
def default_cache_dir
|
58
|
+
File.join("tmp", "sass-cache")
|
59
|
+
end
|
60
|
+
|
61
|
+
def default_project_path
|
62
|
+
project_path = CompassRails.root
|
63
|
+
end
|
64
|
+
|
65
|
+
def default_http_path
|
66
|
+
"/" # XXX Where is/was this stored in the Rails config?
|
67
|
+
end
|
68
|
+
|
69
|
+
def default_environment
|
70
|
+
CompassRails.env
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module CompassRails
|
2
|
+
class Installer < Compass::Installers::ManifestInstaller
|
3
|
+
|
4
|
+
SASS_FILE_REGEX = %r{(.*)(?:\.css)?\.(sass|scss)}
|
5
|
+
|
6
|
+
def completed_configuration
|
7
|
+
@completed_configuration ||= CompassRails.configuration
|
8
|
+
end
|
9
|
+
|
10
|
+
def install_stylesheet(from, to, options)
|
11
|
+
if CompassRails.rails_loaded? && CompassRails.asset_pipeline_enabled?
|
12
|
+
_, name, ext = SASS_FILE_REGEX.match(to).to_a
|
13
|
+
to = "#{name}.css.#{ext}"
|
14
|
+
end
|
15
|
+
super(from, to, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def write_configuration_files
|
19
|
+
config_file = CompassRails.root.join('config', 'compass.rb')
|
20
|
+
unless config_file.exist?
|
21
|
+
write_file config_file.to_s, CompassRails.configuration.serialize
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def prepare
|
26
|
+
write_configuration_files
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Sass::Script::Functions
|
2
|
+
def generated_image_url(path, only_path = nil)
|
3
|
+
asset_url(path, Sass::Script::String.new("image"))
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
module Compass::RailsImageFunctionPatch
|
9
|
+
private
|
10
|
+
|
11
|
+
def image_path_for_size(image_file)
|
12
|
+
begin
|
13
|
+
file = ::Rails.application.assets.find_asset(image_file)
|
14
|
+
return file
|
15
|
+
rescue ::Sprockets::FileOutsidePaths
|
16
|
+
return super(image_file)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module Sass::Script::Functions
|
22
|
+
include Compass::RailsImageFunctionPatch
|
23
|
+
end
|
24
|
+
|
25
|
+
# Wierd that this has to be re-included to pick up sub-modules. Ruby bug?
|
26
|
+
class Sass::Script::Functions::EvaluationContext
|
27
|
+
include Sass::Script::Functions
|
28
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'compass/compiler'
|
2
|
+
module Compass
|
3
|
+
class Compiler
|
4
|
+
attr_accessor :sass_options
|
5
|
+
STYLESHEET = /stylesheet/
|
6
|
+
def sass_options
|
7
|
+
if CompassRails.asset_pipeline_enabled?
|
8
|
+
@sass_options[:custom] ||= {}
|
9
|
+
@sass_options[:custom] = {:resolver => ::Sass::Rails::Resolver.new(CompassRails.context)}
|
10
|
+
@sass_options[:load_paths] ||= []
|
11
|
+
unless @sass_options[:load_paths].any? {|k| k.is_a?(::Sass::Rails::Importer) }
|
12
|
+
::Rails.application.assets.paths.each do |path|
|
13
|
+
next unless path.to_s =~ STYLESHEET
|
14
|
+
Dir["#{path}/**/*"].each do |pathname|
|
15
|
+
# args are: sprockets environment, the logical_path ex. 'stylesheets', and the full path name for the render
|
16
|
+
context = ::CompassRails.context.new(::Rails.application.assets, File.basename(path), Pathname.new(pathname))
|
17
|
+
@sass_options[:load_paths] << ::Sass::Rails::Importer.new(context)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
@sass_options
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'sprockets'
|
2
|
+
require 'compass/sprite_importer'
|
3
|
+
|
4
|
+
module Compass
|
5
|
+
class SpriteImporter < Sass::Importers::Base
|
6
|
+
|
7
|
+
alias :old_find :find
|
8
|
+
|
9
|
+
def find(uri, options)
|
10
|
+
|
11
|
+
if old = old_find(uri, options)
|
12
|
+
@_options = options
|
13
|
+
self.class.files(uri).each do |file|
|
14
|
+
if pathname = resolve(file)
|
15
|
+
context.depend_on(pathname)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
old
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def resolve(uri)
|
26
|
+
resolver.resolve(Pathname.new(uri))
|
27
|
+
end
|
28
|
+
|
29
|
+
def context
|
30
|
+
resolver.context
|
31
|
+
end
|
32
|
+
|
33
|
+
def resolver
|
34
|
+
@_options[:custom][:resolver]
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|