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.
Files changed (46) hide show
  1. data/.gitignore +18 -0
  2. data/.travis.yml +5 -0
  3. data/Appraisals +17 -0
  4. data/Gemfile +22 -0
  5. data/Guardfile +9 -0
  6. data/LICENSE +22 -0
  7. data/README.md +191 -0
  8. data/Rakefile +34 -0
  9. data/compass-rails.gemspec +21 -0
  10. data/gemfiles/rails2.gemfile +21 -0
  11. data/gemfiles/rails2.gemfile.lock +87 -0
  12. data/gemfiles/rails3.gemfile +21 -0
  13. data/gemfiles/rails3.gemfile.lock +134 -0
  14. data/gemfiles/rails31.gemfile +22 -0
  15. data/gemfiles/rails31.gemfile.lock +151 -0
  16. data/gemfiles/rails32.gemfile +22 -0
  17. data/gemfiles/rails32.gemfile.lock +148 -0
  18. data/lib/compass-rails.rb +207 -0
  19. data/lib/compass-rails/configuration.rb +1 -0
  20. data/lib/compass-rails/configuration/3_1.rb +51 -0
  21. data/lib/compass-rails/configuration/default.rb +75 -0
  22. data/lib/compass-rails/installer.rb +30 -0
  23. data/lib/compass-rails/patches.rb +6 -0
  24. data/lib/compass-rails/patches/3_1.rb +28 -0
  25. data/lib/compass-rails/patches/importer.rb +26 -0
  26. data/lib/compass-rails/patches/sprite_importer.rb +38 -0
  27. data/lib/compass-rails/railties.rb +11 -0
  28. data/lib/compass-rails/railties/2_3.rb +56 -0
  29. data/lib/compass-rails/railties/3_0.rb +48 -0
  30. data/lib/compass-rails/railties/3_1.rb +90 -0
  31. data/lib/compass-rails/version.rb +5 -0
  32. data/lib/compass/app_integration/rails.rb +10 -0
  33. data/test/fixtures/.gitkeep +0 -0
  34. data/test/helpers/command_helper.rb +120 -0
  35. data/test/helpers/debug_helper.rb +12 -0
  36. data/test/helpers/file_helper.rb +53 -0
  37. data/test/helpers/rails_helper.rb +65 -0
  38. data/test/helpers/rails_project.rb +186 -0
  39. data/test/integrations/.gitkeep +0 -0
  40. data/test/integrations/rails3_test.rb +37 -0
  41. data/test/integrations/rails_23_test.rb +28 -0
  42. data/test/integrations/rails_31_test.rb +47 -0
  43. data/test/integrations/rails_32_test.rb +46 -0
  44. data/test/test_helper.rb +15 -0
  45. data/test/units/.gitkeep +0 -0
  46. metadata +160 -0
@@ -0,0 +1,11 @@
1
+ if defined?(::Rails)
2
+ if CompassRails.rails2?
3
+ require "compass-rails/railties/2_3"
4
+ elsif CompassRails.rails31? || CompassRails.rails32?
5
+ require "compass-rails/railties/3_1"
6
+ elsif CompassRails.rails3?
7
+ require "compass-rails/railties/3_0"
8
+ else
9
+ $stderr.puts "Unsupported rails environment for compass"
10
+ end
11
+ end
@@ -0,0 +1,56 @@
1
+ #rails 2.x doesn't have railties so gona do this the long way
2
+ require "sass/plugin/rack" #unless defined?(Sass::Plugin::Rack)
3
+
4
+ module ActionController
5
+ class Base
6
+ def process_with_compass(*args)
7
+ Sass::Plugin.rails_controller = self
8
+ begin
9
+ process_without_compass(*args)
10
+ ensure
11
+ Sass::Plugin.rails_controller = nil
12
+ end
13
+ end
14
+ alias_method_chain :process, :compass
15
+ end
16
+ end
17
+
18
+
19
+ module Sass::Plugin
20
+ class << self
21
+ attr_accessor :rails_controller
22
+ end
23
+ end
24
+
25
+ module Compass::SassExtensions::Functions::Urls::ImageUrl
26
+ def image_url_with_rails_integration(path, only_path = Sass::Script::Bool.new(false), cache_buster = Sass::Script::Bool.new(true))
27
+ if (@controller = Sass::Plugin.rails_controller) && @controller.respond_to?(:request) && @controller.request
28
+ begin
29
+ if only_path.to_bool
30
+ Sass::Script::String.new image_path(path.value)
31
+ else
32
+ Sass::Script::String.new "url(#{image_path(path.value)})"
33
+ end
34
+ ensure
35
+ @controller = nil
36
+ end
37
+ else
38
+ image_url_without_rails_integration(path, only_path, cache_buster)
39
+ end
40
+ end
41
+ alias_method_chain :image_url, :rails_integration
42
+ end
43
+
44
+
45
+ class Sass::Script::Functions::EvaluationContext
46
+ include Sass::Script::Functions
47
+ private
48
+ include ActionView::Helpers::AssetTagHelper
49
+ end
50
+
51
+ unless Compass.detect_configuration_file.nil?
52
+ Compass.add_configuration(CompassRails.configuration)
53
+ CompassRails.initialize!
54
+ else
55
+ CompassRails.initialize!(CompassRails.configuration)
56
+ end
@@ -0,0 +1,48 @@
1
+ #3.0.11
2
+ require 'compass'
3
+ require 'rails'
4
+
5
+ class Rails::Railtie::Configuration
6
+ # Adds compass configuration accessor to the application configuration.
7
+ #
8
+ # If a configuration file for compass exists, it will be read in and
9
+ # the project's configuration values will already be set on the config
10
+ # object.
11
+ #
12
+ # For example:
13
+ #
14
+ # module MyApp
15
+ # class Application < Rails::Application
16
+ # config.compass.line_comments = !Rails.env.production?
17
+ # config.compass.fonts_dir = "app/assets/fonts"
18
+ # end
19
+ # end
20
+ #
21
+ # It is suggested that you create a compass configuration file if you
22
+ # want a quicker boot time when using the compass command line tool.
23
+ #
24
+ # For more information on available configuration options see:
25
+ # http://compass-style.org/help/tutorials/configuration-reference/
26
+ def compass
27
+ @compass ||= begin
28
+ data = if (config_file = Compass.detect_configuration_file) && (config_data = Compass.configuration_for(config_file))
29
+ config_data
30
+ else
31
+ Compass::Configuration::Data.new("project")
32
+ end
33
+ data.project_type = :rails # Forcing this makes sure all the rails defaults will be loaded.
34
+ data
35
+ end
36
+ end
37
+ end
38
+
39
+ module CompassRails
40
+ class Railtie < Rails::Railtie
41
+
42
+ initializer "compass.initialize_rails" do |app|
43
+ # Configure compass for use within rails, and provide the project configuration
44
+ # that came via the rails boot process.
45
+ CompassRails.initialize!(app.config.compass)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,90 @@
1
+ #3.1.3
2
+ require 'compass'
3
+ require 'rails/railtie'
4
+
5
+ class Rails::Railtie::Configuration
6
+ # Adds compass configuration accessor to the application configuration.
7
+ #
8
+ # If a configuration file for compass exists, it will be read in and
9
+ # the project's configuration values will already be set on the config
10
+ # object.
11
+ #
12
+ # For example:
13
+ #
14
+ # module MyApp
15
+ # class Application < Rails::Application
16
+ # config.compass.line_comments = !Rails.env.production?
17
+ # config.compass.fonts_dir = "app/assets/fonts"
18
+ # end
19
+ # end
20
+ #
21
+ # It is suggested that you create a compass configuration file if you
22
+ # want a quicker boot time when using the compass command line tool.
23
+ #
24
+ # For more information on available configuration options see:
25
+ # http://compass-style.org/help/tutorials/configuration-reference/
26
+ def compass
27
+ @compass ||= begin
28
+ data = if (config_file = Compass.detect_configuration_file) && (config_data = Compass.configuration_for(config_file))
29
+ config_data
30
+ else
31
+ Compass::Configuration::Data.new("rails_config")
32
+ end
33
+ data.project_type = :rails # Forcing this makes sure all the rails defaults will be loaded.
34
+ data.inherit_from!(Compass.configuration) #force this
35
+ Compass.add_project_configuration(data)
36
+ Compass.configuration.on_sprite_saved do |filename|
37
+ # This is a huge hack based on reading through the sprockets internals.
38
+ # Sprockets needs an API for adding assets during precompilation.
39
+ # At a minimum sprockets should provide this API:
40
+ #
41
+ # #filename is a path in the asset source directory
42
+ # Rails.application.assets.new_asset!(filename)
43
+ #
44
+ # # logical_path is how devs refer to it, data is the contents of it.
45
+ # Rails.application.assets.new_asset!(logical_path, data)
46
+ #
47
+ # I would also like to select one of the above calls based on whether
48
+ # the user is precompiling or not:
49
+ #
50
+ # Rails.application.assets.precompiling? #=> true or false
51
+ #
52
+ # But even the above is not an ideal API. The issue is that compass sprites need to
53
+ # avoid generation if the sprite file is already generated (which can be quite time
54
+ # consuming). To do this, compass has it's own uniqueness hash based on the user's
55
+ # inputs instead of being based on the file contents. So if we could provide our own
56
+ # hash or some metadata that is opaque to sprockets that could be read from the
57
+ # asset's attributes, we could avoid cluttering the assets directory with generated
58
+ # sprites and always just use the logical_path + data version of the api.
59
+ if Rails.application.config.assets.digests.try(:any?)
60
+ asset = Rails.application.assets.find_asset(filename)
61
+ pathname = Pathname.new(filename)
62
+ logical_path = filename[(Compass.configuration.generated_images_path.length+1)..-1]
63
+ # Force the asset into the cache so find_asset will find it.
64
+ cached_assets = Rails.application.assets.instance_variable_get("@assets")
65
+ cached_assets[logical_path] = cached_assets[filename] = asset
66
+
67
+ target = Pathname.new(File.join(Rails.public_path, Rails.application.config.assets.prefix))
68
+ asset = Rails.application.assets.find_asset(logical_path)
69
+ filename = target.join(asset.digest_path)
70
+ asset.write_to(filename)
71
+ end
72
+ end
73
+ data
74
+ end
75
+ @compass
76
+ end
77
+ end
78
+
79
+ module CompassRails
80
+ class Railtie < Rails::Railtie
81
+
82
+ initializer "compass.initialize_rails", :group => :all do |app|
83
+ # Configure compass for use within rails, and provide the project configuration
84
+ # that came via the rails boot process.
85
+ CompassRails.check_for_double_boot!
86
+ Compass.discover_extensions!
87
+ CompassRails.configure_rails!(app)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,5 @@
1
+ module CompassRails
2
+ unless defined?(::CompassRails::VERSION)
3
+ VERSION = "1.0.0.rc.1"
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ module Compass
2
+ module AppIntegration
3
+ module Rails
4
+ extend self
5
+ def initialize!
6
+ Compass::Util.compass_warn("WARNING: Please remove the call to Compass::AppIntegration::Rails.initialize! from #{caller[0].sub(/:.*$/,'')};\nWARNING: This is done automatically now. If this is default compass initializer you can just remove the file.")
7
+ end
8
+ end
9
+ end
10
+ end
File without changes
@@ -0,0 +1,120 @@
1
+ require 'appraisal'
2
+ require 'appraisal/command'
3
+ module Kernal
4
+ module Captures
5
+ def capture_output
6
+ buffer = []
7
+ real_stdout, $stdout = $stdout, StringIO.new
8
+ buffer << yield
9
+ buffer << $stdout.string
10
+ return buffer.join
11
+ ensure
12
+ $stdout = real_stdout
13
+ end
14
+
15
+ def capture_all_output
16
+ capture_output do
17
+ capture_warning do
18
+ yield
19
+ end
20
+ end
21
+ end
22
+
23
+
24
+ def capture_warning
25
+ buffer = []
26
+ real_stderr, $stderr = $stderr, StringIO.new
27
+ buffer << yield
28
+ buffer << $stderr.string
29
+ return buffer.join
30
+ ensure
31
+ $stderr = real_stderr
32
+ end
33
+ end
34
+ end
35
+
36
+ include Kernal::Captures
37
+
38
+ module CompassRails
39
+ module Test
40
+ module CommandHelper
41
+ include DebugHelper
42
+ GEMFILES_DIR = Pathname.new(ROOT_PATH).join('gemfiles')
43
+ BUNDLER_COMMAND = 'bundle'
44
+
45
+ def run_command(command, gemfile=nil)
46
+ debug("Running: #{command} with gemfile: #{gemfile}".foreground(:cyan))
47
+ capture_all_output { CompassRails::Test::CommandRunner.new(command, gemfile).run }
48
+ end
49
+
50
+ def bundle(gemfile=nil)
51
+ run_command(BUNDLER_COMMAND, gemfile)
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+
58
+ # Executes commands with a clean environment
59
+ class CompassRails::Test::CommandRunner
60
+ BUNDLER_ENV_VARS = %w(RUBYOPT BUNDLE_PATH BUNDLE_BIN_PATH BUNDLE_GEMFILE).freeze
61
+
62
+ def self.from_args(gemfile)
63
+ command = ([$0] + ARGV.slice(1, ARGV.size)).join(' ')
64
+ new(command, gemfile)
65
+ end
66
+
67
+ def initialize(command, gemfile = nil)
68
+ @original_env = {}
69
+ @gemfile = gemfile
70
+ if command =~ /^bundle/
71
+ @command = command
72
+ else
73
+ @command = "bundle exec #{command}"
74
+ end
75
+ end
76
+
77
+ def run
78
+ announce
79
+ with_clean_env do
80
+ %x{#{@command}}
81
+ end
82
+ end
83
+
84
+ def exec
85
+ announce
86
+ with_clean_env { Kernel.exec(@command) }
87
+ end
88
+
89
+ private
90
+
91
+ def with_clean_env
92
+ unset_bundler_env_vars
93
+ ENV['BUNDLE_GEMFILE'] = @gemfile
94
+ yield
95
+ ensure
96
+ restore_env
97
+ end
98
+
99
+ def announce
100
+ return
101
+ if @gemfile
102
+ puts ">> BUNDLE_GEMFILE=#{@gemfile} #{@command}"
103
+ else
104
+ puts ">> #{@command}"
105
+ end
106
+ end
107
+
108
+ def unset_bundler_env_vars
109
+ BUNDLER_ENV_VARS.each do |key|
110
+ @original_env[key] = ENV[key]
111
+ ENV[key] = nil
112
+ end
113
+ end
114
+
115
+ def restore_env
116
+ @original_env.each { |key, value| ENV[key] = value }
117
+ end
118
+ end
119
+
120
+
@@ -0,0 +1,12 @@
1
+ module CompassRails
2
+ module Test
3
+ module DebugHelper
4
+
5
+ def debug(message)
6
+ puts "#{message}\n".bright #if ENV['DEBUG']
7
+ $stdout.flush
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,53 @@
1
+ module CompassRails
2
+ module Test
3
+ module FileHelper
4
+ include DebugHelper
5
+
6
+ def mkdir_p(dir)
7
+ debug("Creating Directory: #{dir}".foreground(:green))
8
+ ::FileUtils.mkdir_p dir
9
+ assert File.directory?(dir), "mkdir_p: #{dir} failed"
10
+ end
11
+
12
+ def rm_rf(path)
13
+ debug("Removing: #{path}".foreground(:red))
14
+ ::FileUtils.rm_rf(path)
15
+ assert !File.directory?(path), "rm_rf: #{path} failed"
16
+ end
17
+
18
+ def cd(path, &block)
19
+ debug("Entered: #{path}".foreground(:yellow))
20
+ Dir.chdir(path, &block)
21
+ end
22
+
23
+ def inject_at_bottom(file_name, string)
24
+ content = File.read(file_name)
25
+ content = "#{content}#{string}"
26
+ File.open(file_name, 'w') { |file| file << content }
27
+ end
28
+
29
+ def touch(file)
30
+ debug("Touching File: #{file}".foreground(:green))
31
+ ::FileUtils.touch(file)
32
+ end
33
+
34
+ def inject_into_file(file_name, replacment, position, anchor)
35
+ case position
36
+ when :after
37
+ replace(file_name, Regexp.escape(anchor), "#{anchor}#{replacment}")
38
+ when :before
39
+ replace(file_name, Regexp.escape(anchor), "#{replacment}#{anchor}")
40
+ else
41
+ raise Compass::FilesystemConflict.new("You need to specify :before or :after")
42
+ end
43
+ end
44
+
45
+ def replace(destination, regexp, string)
46
+ content = File.read(destination)
47
+ content.gsub!(Regexp.new(regexp), string)
48
+ File.open(destination, 'wb') { |file| file.write(content) }
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,65 @@
1
+
2
+ module CompassRails
3
+ module Test
4
+ module RailsHelpers
5
+ include FileHelper
6
+ include DebugHelper
7
+ include CommandHelper
8
+ RAILS_3_2 = "3.2"
9
+ RAILS_3_1 = "3.1"
10
+ RAILS_3 = "3.0"
11
+ RAILS_2 = "2.3"
12
+
13
+ WORKING_DIR = File.join(ROOT_PATH, 'rails-temp')
14
+
15
+ GEMFILES = {
16
+ RAILS_3_2 => GEMFILES_DIR.join("rails32.gemfile").to_s,
17
+ RAILS_3_1 => GEMFILES_DIR.join("rails31.gemfile").to_s,
18
+ RAILS_3 => GEMFILES_DIR.join("rails3.gemfile").to_s,
19
+ RAILS_2 => GEMFILES_DIR.join("rails2.gemfile").to_s
20
+ }
21
+
22
+ GENERTOR_OPTIONS = {
23
+ RAILS_3_2 => ['-q', '-G', '-O', '--skip-bundle'],
24
+ RAILS_3_1 => ['-q', '-G', '-O', '--skip-bundle'],
25
+ RAILS_3 => ['-q', '-G', '-O', '--skip-bundle'],
26
+ RAILS_2 => ['-q']
27
+ }
28
+
29
+ GENERATOR_COMMAND = {
30
+ RAILS_3_2 => 'new',
31
+ RAILS_3_1 => 'new',
32
+ RAILS_3 => 'new',
33
+ RAILS_2 => ''
34
+ }
35
+
36
+ def rails_command(options, version)
37
+ debug("Running Rails command with: rails #{options.join(' ')}".foreground(:cyan))
38
+ run_command("rails #{options.join(' ')}", GEMFILES[version])
39
+ end
40
+
41
+ # Generate a rails application without polluting our current set of requires
42
+ # with the rails libraries. This will allow testing against multiple versions of rails
43
+ # by manipulating the load path.
44
+ def generate_rails_app(name, version, options=[])
45
+ options += GENERTOR_OPTIONS[version]
46
+ rails_command([GENERATOR_COMMAND[version], name, *options], version)
47
+ end
48
+
49
+ def within_rails_app(named, version, &block)
50
+ dir = "#{named}-#{version}"
51
+ rm_rf File.join(WORKING_DIR, dir)
52
+ mkdir_p WORKING_DIR
53
+ cd(WORKING_DIR) do
54
+ generate_rails_app(dir, version)
55
+ cd(dir) do
56
+ yield RailsProject.new(File.join(WORKING_DIR, dir), version)
57
+ end
58
+ end
59
+ rm_rf File.join(WORKING_DIR, dir)
60
+ end
61
+
62
+
63
+ end
64
+ end
65
+ end