compass 0.12.alpha.4 → 0.12.rc.0

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 (53) hide show
  1. data/VERSION.yml +2 -2
  2. data/bin/compass +4 -0
  3. data/features/command_line.feature +0 -10
  4. data/features/extensions.feature +0 -10
  5. data/features/step_definitions/command_line_steps.rb +0 -12
  6. data/frameworks/compass/stylesheets/compass/css3/_background-clip.scss +2 -2
  7. data/frameworks/compass/stylesheets/compass/css3/_font-face.scss +1 -1
  8. data/lib/compass/app_integration.rb +26 -11
  9. data/lib/compass/commands/project_structure.rb +93 -0
  10. data/lib/compass/commands/update_project.rb +0 -1
  11. data/lib/compass/commands/watch_project.rb +6 -1
  12. data/lib/compass/compiler.rb +2 -1
  13. data/lib/compass/configuration.rb +6 -1
  14. data/lib/compass/configuration/data.rb +9 -3
  15. data/lib/compass/configuration/helpers.rb +7 -21
  16. data/lib/compass/configuration/inheritance.rb +101 -0
  17. data/lib/compass/configuration/serialization.rb +17 -7
  18. data/lib/compass/errors.rb +1 -0
  19. data/lib/compass/installers/manifest.rb +10 -5
  20. data/lib/compass/sass_extensions/functions/display.rb +1 -0
  21. data/lib/compass/sass_extensions/functions/trig.rb +1 -1
  22. data/lib/compass/sass_extensions/sprites.rb +0 -1
  23. data/lib/compass/sass_extensions/sprites/image.rb +1 -1
  24. data/lib/compass/sprite_importer.rb +4 -1
  25. data/test/fixtures/stylesheets/compass/css/background-clip.css +10 -0
  26. data/test/fixtures/stylesheets/compass/css/fonts.css +1 -1
  27. data/test/fixtures/stylesheets/compass/sass/background-clip.scss +8 -0
  28. data/test/test_helper.rb +2 -2
  29. data/test/units/compiler_test.rb +11 -0
  30. data/test/units/configuration_test.rb +144 -0
  31. data/test/units/sprites/sprite_command_test.rb +4 -3
  32. metadata +12 -30
  33. data/examples/compass/compass_app_log.txt +0 -6
  34. data/features/rails_integration.feature +0 -32
  35. data/lib/compass/app_integration/merb.rb +0 -1
  36. data/lib/compass/app_integration/merb/runtime.rb +0 -63
  37. data/lib/compass/app_integration/rails.rb +0 -83
  38. data/lib/compass/app_integration/rails/actionpack2x.rb +0 -10
  39. data/lib/compass/app_integration/rails/actionpack2x/action_controller.rb +0 -15
  40. data/lib/compass/app_integration/rails/actionpack2x/sass_plugin.rb +0 -5
  41. data/lib/compass/app_integration/rails/actionpack2x/urls.rb +0 -18
  42. data/lib/compass/app_integration/rails/actionpack30.rb +0 -11
  43. data/lib/compass/app_integration/rails/actionpack30/railtie.rb +0 -46
  44. data/lib/compass/app_integration/rails/actionpack31.rb +0 -5
  45. data/lib/compass/app_integration/rails/actionpack31/helpers.rb +0 -28
  46. data/lib/compass/app_integration/rails/actionpack31/railtie.rb +0 -87
  47. data/lib/compass/app_integration/rails/configuration_defaults.rb +0 -123
  48. data/lib/compass/app_integration/rails/installer.rb +0 -182
  49. data/lib/compass/app_integration/rails/runtime.rb +0 -17
  50. data/lib/compass/app_integration/rails/templates/compass-install-rails.rb +0 -78
  51. data/test/integrations/rails_integration_test.rb +0 -51
  52. data/test/integrations/test_rails_helper.rb +0 -20
  53. data/test/units/rails_configuration_test.rb +0 -50
data/VERSION.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 12
4
- :state: alpha
5
- :build: 4
4
+ :state: rc
5
+ :build: 0
6
6
  :name: Alnilam
data/bin/compass CHANGED
@@ -21,6 +21,10 @@ fallback_load_path(File.join(File.dirname(__FILE__), '..', 'lib')) do
21
21
  require 'compass/exec'
22
22
  end
23
23
 
24
+ if defined?(Bundler)
25
+ Bundler.require :assets
26
+ end
27
+
24
28
  runner = Proc.new do
25
29
  Compass::Exec::SubCommandUI.new(ARGV).run!
26
30
  end
@@ -77,16 +77,6 @@ Feature: Command Line
77
77
  Then an error message is printed out: A bare project cannot be created when a framework is specified.
78
78
  And the command exits with a non-zero error code
79
79
 
80
- Scenario: Initializing a rails project
81
- Given ruby supports fork
82
- Given I'm in a newly created rails project: my_rails_project
83
- When I initialize a project using: compass init rails --sass-dir app/stylesheets --css-dir public/stylesheets/compiled
84
- Then a config file config/compass.rb is reported created
85
- Then a config file config/compass.rb is created
86
- And a sass file app/stylesheets/screen.scss is created
87
- And a sass file app/stylesheets/print.scss is created
88
- And a sass file app/stylesheets/ie.scss is created
89
-
90
80
  Scenario: Compiling an existing project.
91
81
  Given I am using the existing project in test/fixtures/stylesheets/compass
92
82
  When I run: compass compile
@@ -12,16 +12,6 @@ Feature: Extensions
12
12
  When I run: compass frameworks
13
13
  Then the list of frameworks includes "testing"
14
14
 
15
- @listframeworks
16
- Scenario: Extensions directory for rails projects
17
- Given ruby supports fork
18
- And I'm in a newly created rails project: extension_test_rails_project
19
- And I run: compass init rails
20
- And the "vendor/plugins/compass_extensions" directory exists
21
- And and I have a fake extension at vendor/plugins/compass_extensions/testing
22
- When I run: compass frameworks
23
- Then the list of frameworks includes "testing"
24
-
25
15
  @listframeworks
26
16
  Scenario: Shared extensions directory
27
17
  Given the "~/.compass/extensions" directory exists
@@ -6,7 +6,6 @@ require 'compass/exec'
6
6
  include Compass::TestCaseHelper
7
7
  include Compass::CommandLineHelper
8
8
  include Compass::IoHelper
9
- include Compass::RailsHelper
10
9
 
11
10
  Before do
12
11
  Compass.reset_configuration!
@@ -41,17 +40,6 @@ Given %r{^I am in the parent directory$} do
41
40
  Dir.chdir ".."
42
41
  end
43
42
 
44
- Given %r{^I'm in a newly created rails project: (.+)$} do |project_name|
45
- dir = File.join(Dir.pwd, project_name)
46
- @cleanup_directories << dir
47
- begin
48
- generate_rails_app project_name, Dir.pwd
49
- Dir.chdir dir
50
- rescue LoadError
51
- pending "Missing Ruby-on-rails gems: sudo gem install rails"
52
- end
53
- end
54
-
55
43
  Given /^I should clean up the directory: (\w+)$/ do |directory|
56
44
  @cleanup_directories << directory
57
45
  end
@@ -35,8 +35,8 @@ $default-background-clip: padding-box !default;
35
35
  @include experimental(background-clip, $clip,
36
36
  not -moz,
37
37
  not -webkit,
38
- -o,
39
- -ms,
38
+ not -o,
39
+ not -ms,
40
40
  -khtml,
41
41
  official
42
42
  );
@@ -30,7 +30,7 @@
30
30
  $weight: false,
31
31
  $style: false
32
32
  ) {
33
- $iefont: unquote("#{$eot}?iefix");
33
+ $iefont: unquote("#{$eot}?#iefix");
34
34
  @font-face {
35
35
  font-family: quote($name);
36
36
  @if $eot {
@@ -1,24 +1,39 @@
1
- %w(stand_alone rails merb).each do |lib|
2
- require "compass/app_integration/#{lib}"
3
- end
1
+ require "compass/app_integration/stand_alone"
4
2
 
5
3
  module Compass
6
4
  module AppIntegration
7
5
  module Helpers
8
- def lookup(project_type)
9
- eval "Compass::AppIntegration::#{camelize(project_type)}"
10
- rescue NameError
11
- raise Compass::Error, "No application integration exists for #{project_type}"
6
+ #attr_accessor :project_types
7
+ DEAFULT_PROJECT_TYPES = {
8
+ :stand_alone => "Compass::AppIntegration::StandAlone"
9
+ }
10
+
11
+ def init
12
+ @project_types ||= DEAFULT_PROJECT_TYPES.dup
13
+ end
14
+
15
+ def project_types
16
+ @project_types
12
17
  end
13
18
 
14
- protected
19
+ def default?
20
+ @project_types.keys === DEAFULT_PROJECT_TYPES.keys
21
+ end
22
+
23
+ def lookup(type)
24
+ unless @project_types[type].nil?
25
+ eval @project_types[type]
26
+ else
27
+ raise Compass::Error, "No application integration exists for #{type}"
28
+ end
29
+ end
15
30
 
16
- # Stolen from ActiveSupport
17
- def camelize(s)
18
- s.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
31
+ def register(type, klass)
32
+ @project_types[type] = klass
19
33
  end
20
34
 
21
35
  end
22
36
  extend Helpers
37
+ init
23
38
  end
24
39
  end
@@ -0,0 +1,93 @@
1
+ require 'compass/commands/project_base'
2
+ require 'compass/commands/update_project'
3
+
4
+ module Compass
5
+ module Commands
6
+ module StructureOptionsParser
7
+ def set_options(opts)
8
+ opts.banner = %Q{
9
+ Usage: compass structure [path/to/project] [options]
10
+
11
+ Description:
12
+ Display the import structure of your stylesheets.
13
+
14
+ Options:
15
+ }.strip.split("\n").map{|l| l.gsub(/^ {0,10}/,'')}.join("\n")
16
+
17
+ super
18
+ end
19
+ end
20
+ class ProjectStats < UpdateProject
21
+
22
+ register :structure
23
+
24
+ def initialize(working_path, options)
25
+ super
26
+ assert_project_directory_exists!
27
+ end
28
+
29
+ def perform
30
+ @compiler = new_compiler_instance
31
+ (options[:sass_files] || sorted_sass_files).each do |sass_file|
32
+ print_tree(Compass.projectize(sass_file))
33
+ end
34
+ end
35
+
36
+ def print_tree(file, depth = 0, importer = @compiler.importer)
37
+ puts ((depth > 0 ? "| " : " ") * depth) + "+- " + Compass.deprojectize(file)
38
+ @compiler.staleness_checker.send(:compute_dependencies, file, importer).each do |(dep, dep_importer)|
39
+ print_tree(dep, depth + 1, dep_importer)# unless Compass.deprojectize(dep)[0...1] == "/"
40
+ end
41
+ end
42
+
43
+ def sorted_sass_files
44
+ sass_files = @compiler.sass_files
45
+ sass_files.map! do |s|
46
+ filename = Compass.deprojectize(s, File.join(Compass.configuration.project_path, Compass.configuration.sass_dir))
47
+ [s, File.dirname(filename), File.basename(filename)]
48
+ end
49
+ sass_files = sass_files.sort_by do |s,d,f|
50
+ File.join(d, f[0] == ?_ ? f[1..-1] : f)
51
+ end
52
+ sass_files.map!{|s,d,f| s}
53
+ end
54
+
55
+ class << self
56
+
57
+ def option_parser(arguments)
58
+ parser = Compass::Exec::CommandOptionParser.new(arguments)
59
+ parser.extend(Compass::Exec::GlobalOptionsParser)
60
+ parser.extend(Compass::Exec::ProjectOptionsParser)
61
+ parser.extend(StructureOptionsParser)
62
+ end
63
+
64
+ def usage
65
+ option_parser([]).to_s
66
+ end
67
+
68
+ def description(command)
69
+ "Report statistics about your stylesheets"
70
+ end
71
+
72
+ def primary; false; end
73
+
74
+ def parse!(arguments)
75
+ parser = option_parser(arguments)
76
+ parser.parse!
77
+ parse_arguments!(parser, arguments)
78
+ parser.options
79
+ end
80
+
81
+ def parse_arguments!(parser, arguments)
82
+ if arguments.size > 0
83
+ parser.options[:project_name] = arguments.shift if File.directory?(arguments.first)
84
+ parser.options[:sass_files] = arguments
85
+ end
86
+ end
87
+
88
+ end
89
+
90
+ end
91
+ end
92
+ end
93
+
@@ -67,7 +67,6 @@ module Compass
67
67
  if options.include?(:debug_info) && options[:debug_info]
68
68
  compiler_opts[:sass][:debug_info] = options.delete(:debug_info)
69
69
  end
70
- puts compiler_opts.inspect
71
70
  compiler_opts
72
71
  end
73
72
 
@@ -81,6 +81,7 @@ module Compass
81
81
  action = FSSM::Backends::Default.to_s == "FSSM::Backends::Polling" ? "polling" : "watching"
82
82
 
83
83
  puts ">>> Compass is #{action} for changes. Press Ctrl-C to Stop."
84
+ $stdout.flush
84
85
 
85
86
  begin
86
87
  FSSM.monitor do |monitor|
@@ -100,14 +101,17 @@ module Compass
100
101
  path.glob glob
101
102
  path.update do |base, relative|
102
103
  puts ">>> Change detected to: #{relative}"
104
+ $stdout.flush
103
105
  callback.call(base, relative)
104
106
  end
105
107
  path.create do |base, relative|
106
108
  puts ">>> New file detected: #{relative}"
109
+ $stdout.flush
107
110
  callback.call(base, relative)
108
111
  end
109
112
  path.delete do |base, relative|
110
113
  puts ">>> File Removed: #{relative}"
114
+ $stdout.flush
111
115
  callback.call(base, relative)
112
116
  end
113
117
  end
@@ -138,7 +142,8 @@ module Compass
138
142
  compiler = new_compiler_instance(:quiet => true, :loud => [:identical, :overwrite, :create])
139
143
  if file = compiler.out_of_date?
140
144
  begin
141
- puts ">>> Change detected to: #{relative || compiler.relative_stylesheet_name(file)}"
145
+ puts ">>> Change detected at "+Time.now.strftime("%T")+" to: #{relative || compiler.relative_stylesheet_name(file)}"
146
+ $stdout.flush
142
147
  compiler.run
143
148
  GC.start
144
149
  rescue StandardError => e
@@ -12,6 +12,7 @@ module Compass
12
12
  sass_opts = options.delete(:sass) || {}
13
13
  self.options = options
14
14
  self.sass_options = options.dup
15
+ self.sass_options.delete(:quiet)
15
16
  self.sass_options.update(sass_opts)
16
17
  self.sass_options[:cache_location] ||= determine_cache_location
17
18
  self.sass_options[:importer] = self.importer = Sass::Importers::Filesystem.new(from)
@@ -36,7 +37,7 @@ module Compass
36
37
 
37
38
  def stylesheet_name(sass_file)
38
39
  if sass_file.index(from) == 0
39
- sass_file[(from.length + 1)..-6]
40
+ sass_file[(from.length + 1)..-6].sub(/\.css$/,'')
40
41
  else
41
42
  raise Compass::Error, "You must compile individual stylesheets from the project directory."
42
43
  end
@@ -25,7 +25,6 @@ module Compass
25
25
  attributes_for_directory(:fonts),
26
26
  attributes_for_directory(:extensions, nil),
27
27
  # Compilation options
28
- :sprite_load_path,
29
28
  :output_style,
30
29
  :environment,
31
30
  :relative_assets,
@@ -44,6 +43,12 @@ module Compass
44
43
  :chunky_png_options
45
44
  ].flatten
46
45
 
46
+ ARRAY_ATTRIBUTES = [
47
+ :sprite_load_path,
48
+ :required_libraries,
49
+ :loaded_frameworks,
50
+ :framework_path
51
+ ]
47
52
  # Registers a new configuration property.
48
53
  # Extensions can use this to add new configuration options to compass.
49
54
  #
@@ -57,10 +57,11 @@ module Compass
57
57
  chained_method :run_stylesheet_error
58
58
 
59
59
  inherited_accessor *ATTRIBUTES
60
- inherited_accessor :required_libraries, :loaded_frameworks, :framework_path #XXX we should make these arrays add up cumulatively.
61
60
 
62
61
  strip_trailing_separator *ATTRIBUTES.select{|a| a.to_s =~ /dir|path/}
63
62
 
63
+ inherited_array *ARRAY_ATTRIBUTES
64
+
64
65
  def initialize(name, attr_hash = nil)
65
66
  raise "I need a name!" unless name
66
67
  @name = name
@@ -91,7 +92,9 @@ module Compass
91
92
  # The block will be passed the root-relative url of the asset.
92
93
  # When called without a block, returns the block that was previously set.
93
94
  def asset_host(&block)
95
+ @set_attributes ||= {}
94
96
  if block_given?
97
+ @set_attributes[:asset_host] = true
95
98
  @asset_host = block
96
99
  else
97
100
  if @asset_host
@@ -116,16 +119,19 @@ module Compass
116
119
  #
117
120
  # asset_cache_buster :none
118
121
  def asset_cache_buster(simple = nil, &block)
122
+ @set_attributes ||= {}
119
123
  if block_given?
124
+ @set_attributes[:asset_cache_buster] = true
120
125
  @asset_cache_buster = block
121
126
  elsif !simple.nil?
122
127
  if simple == :none
128
+ @set_attributes[:asset_cache_buster] = true
123
129
  @asset_cache_buster = Proc.new {|_,_| nil}
124
130
  else
125
131
  raise ArgumentError, "Unexpected argument: #{simple.inspect}"
126
132
  end
127
133
  else
128
- if @asset_cache_buster
134
+ if set?(:asset_cache_buster)
129
135
  @asset_cache_buster
130
136
  elsif inherited_data.respond_to?(:asset_cache_buster)
131
137
  inherited_data.asset_cache_buster
@@ -173,7 +179,7 @@ module Compass
173
179
  private
174
180
 
175
181
  def assert_valid_keys!(attr_hash)
176
- illegal_attrs = attr_hash.keys - ATTRIBUTES
182
+ illegal_attrs = attr_hash.keys - ATTRIBUTES - ARRAY_ATTRIBUTES
177
183
  if illegal_attrs.size == 1
178
184
  raise Error, "#{illegal_attrs.first.inspect} is not a valid configuration attribute."
179
185
  elsif illegal_attrs.size > 0
@@ -84,13 +84,6 @@ module Compass
84
84
  end
85
85
  end
86
86
 
87
- def configure_rails!(app)
88
- return unless app.config.respond_to?(:sass)
89
- app.config.compass.to_sass_engine_options.each do |key, value|
90
- app.config.sass.send(:"#{key}=", value)
91
- end
92
- end
93
-
94
87
  def sass_engine_options
95
88
  configuration.to_sass_engine_options
96
89
  end
@@ -99,18 +92,9 @@ module Compass
99
92
  def add_project_configuration(*args)
100
93
  options = args.last.is_a?(Hash) ? args.pop : {}
101
94
  configuration_file_path = args.shift || detect_configuration_file
102
-
103
- # TODO make this better i don't think it belongs here but it gets the job done
104
- # This will allow compass to boot rails and load the config if its configured in the application.rb file via railtie
105
- # if File.exists?(projectize('config/boot.rb')) && configuration_file_path.nil?
106
- # require 'rails'
107
- # require projectize('config/application.rb')
108
- # options[:project_type] = :rails
109
- # end
110
-
111
-
95
+
112
96
  raise ArgumentError, "Too many arguments" if args.any?
113
- if data = configuration_for(configuration_file_path, nil, configuration_for(options[:defaults]))
97
+ if AppIntegration.default? && data = configuration_for(configuration_file_path, nil, configuration_for(options[:defaults]))
114
98
  if data.raw_project_type
115
99
  add_configuration(data.raw_project_type.to_sym)
116
100
  elsif options[:project_type]
@@ -118,10 +102,12 @@ module Compass
118
102
  else
119
103
  add_configuration(:stand_alone)
120
104
  end
121
-
122
- add_configuration(data)
105
+
106
+
107
+ add_configuration(data)
108
+
123
109
  else
124
- add_configuration(options[:project_type] || configuration.project_type_without_default || (yield if block_given?) || :stand_alone)
110
+ add_configuration(options[:project_type] || configuration.project_type_without_default || (yield if block_given?) || :stand_alone)
125
111
  end
126
112
  end
127
113
 
@@ -61,6 +61,101 @@ module Compass
61
61
  inherited_writer(*attributes)
62
62
  end
63
63
 
64
+ class ArrayProxy
65
+ def initialize(data, attr)
66
+ @data, @attr = data, attr
67
+ end
68
+ def to_ary
69
+ @data.send(:"read_inherited_#{@attr}_array")
70
+ end
71
+ def to_a
72
+ to_ary
73
+ end
74
+ def <<(v)
75
+ @data.send(:"add_to_#{@attr}", v)
76
+ end
77
+ def >>(v)
78
+ @data.send(:"remove_from_#{@attr}", v)
79
+ end
80
+ def serialize_to_config(prop)
81
+ if v = @data.raw(prop)
82
+ "#{prop} = #{v.inspect}"
83
+ else
84
+ s = ""
85
+ if added = @data.instance_variable_get("@added_to_#{@attr}")
86
+ added.each do |a|
87
+ s << "#{prop} << #{a.inspect}\n"
88
+ end
89
+ end
90
+ if removed = @data.instance_variable_get("@removed_from_#{@attr}")
91
+ removed.each do |r|
92
+ s << "#{prop} >> #{r.inspect}\n"
93
+ end
94
+ end
95
+ if s[-1..-1] == "\n"
96
+ s[0..-2]
97
+ else
98
+ s
99
+ end
100
+ end
101
+ end
102
+ def method_missing(m, *args, &block)
103
+ a = to_ary
104
+ if a.respond_to?(m)
105
+ a.send(m,*args, &block)
106
+ else
107
+ super
108
+ end
109
+ end
110
+ end
111
+
112
+ def inherited_array(*attributes)
113
+ inherited_reader(*attributes)
114
+ inherited_writer(*attributes)
115
+ attributes.each do |attr|
116
+ line = __LINE__ + 1
117
+ class_eval %Q{
118
+ def #{attr} # def sprite_load_paths
119
+ ArrayProxy.new(self, #{attr.inspect}) # ArrayProxy.new(self, :sprite_load_paths)
120
+ end # end
121
+ def #{attr}=(value) # def sprite_load_paths=(value)
122
+ @set_attributes ||= {} # @set_attributes ||= {}
123
+ @set_attributes[#{attr.inspect}] = true # @set_attributes[:sprite_load_paths] = true
124
+ @#{attr} = Array(value) # @sprite_load_paths = Array(value)
125
+ @added_to_#{attr} = [] # @added_to_sprite_load_paths = []
126
+ @removed_from_#{attr} = [] # @removed_from_sprite_load_paths = []
127
+ end # end
128
+ def read_inherited_#{attr}_array # def read_inherited_sprite_load_paths_array
129
+ if #{attr}_set? # if sprite_load_paths_set?
130
+ @#{attr} # Array(@#{attr})
131
+ else # else
132
+ value = if inherited_data # value = Array(read(:sprite_load_paths))
133
+ Array(inherited_data.#{attr})
134
+ else
135
+ Array(read(#{attr.inspect}))
136
+ end
137
+ value -= Array(@removed_from_#{attr}) # value -= Array(@removed_from_sprite_load_paths)
138
+ Array(@added_to_#{attr}) + value # Array(@added_to_sprite_load_paths) + value
139
+ end # end
140
+ end # end
141
+ def add_to_#{attr}(v) # def add_to_sprite_load_paths(v)
142
+ if #{attr}_set? # if sprite_load_paths_set?
143
+ raw_#{attr} << v # raw_sprite_load_paths << v
144
+ else # else
145
+ (@added_to_#{attr} ||= []) << v # (@added_to_sprite_load_paths ||= []) << v
146
+ end # end
147
+ end # end
148
+ def remove_from_#{attr}(v) # def remove_from_sprite_load_paths(v)
149
+ if #{attr}_set? # if sprite_load_paths_set?
150
+ raw_#{attr}.reject!{|e| e == v} # raw_sprite_load_path.reject!{|e| e == v}s
151
+ else # else
152
+ (@removed_from_#{attr} ||= []) << v # (@removed_from_sprite_load_paths ||= []) << v
153
+ end # end
154
+ end # end
155
+ }, __FILE__, line
156
+ end
157
+ end
158
+
64
159
  def chained_method(method)
65
160
  line = __LINE__ + 1
66
161
  class_eval %Q{
@@ -146,6 +241,12 @@ module Compass
146
241
  end
147
242
  end
148
243
 
244
+ # Reads the raw value that was set on this object.
245
+ # you generally should call raw_<attribute>() instead.
246
+ def raw(attribute)
247
+ instance_variable_get("@#{attribute}")
248
+ end
249
+
149
250
  # Read a value that is either inherited or set on this instance, if we get to the bottom-most configuration instance,
150
251
  # we ask for the default starting at the top level.
151
252
  def read(attribute)