sass 3.3.0 → 3.4.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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +58 -50
  4. data/Rakefile +1 -4
  5. data/VERSION +1 -1
  6. data/VERSION_DATE +1 -1
  7. data/VERSION_NAME +1 -1
  8. data/bin/sass +1 -1
  9. data/bin/scss +1 -1
  10. data/lib/sass/cache_stores/filesystem.rb +6 -2
  11. data/lib/sass/css.rb +1 -3
  12. data/lib/sass/engine.rb +37 -46
  13. data/lib/sass/environment.rb +13 -17
  14. data/lib/sass/error.rb +6 -9
  15. data/lib/sass/exec/base.rb +187 -0
  16. data/lib/sass/exec/sass_convert.rb +264 -0
  17. data/lib/sass/exec/sass_scss.rb +424 -0
  18. data/lib/sass/exec.rb +5 -771
  19. data/lib/sass/features.rb +7 -0
  20. data/lib/sass/importers/base.rb +7 -2
  21. data/lib/sass/importers/filesystem.rb +9 -25
  22. data/lib/sass/importers.rb +0 -1
  23. data/lib/sass/media.rb +1 -4
  24. data/lib/sass/plugin/compiler.rb +200 -83
  25. data/lib/sass/plugin/staleness_checker.rb +1 -1
  26. data/lib/sass/plugin.rb +3 -3
  27. data/lib/sass/script/css_lexer.rb +1 -1
  28. data/lib/sass/script/functions.rb +622 -268
  29. data/lib/sass/script/lexer.rb +99 -34
  30. data/lib/sass/script/parser.rb +24 -23
  31. data/lib/sass/script/tree/funcall.rb +1 -1
  32. data/lib/sass/script/tree/interpolation.rb +20 -2
  33. data/lib/sass/script/tree/selector.rb +26 -0
  34. data/lib/sass/script/tree/string_interpolation.rb +1 -1
  35. data/lib/sass/script/tree.rb +1 -0
  36. data/lib/sass/script/value/base.rb +7 -5
  37. data/lib/sass/script/value/bool.rb +0 -5
  38. data/lib/sass/script/value/color.rb +39 -21
  39. data/lib/sass/script/value/helpers.rb +107 -0
  40. data/lib/sass/script/value/list.rb +0 -15
  41. data/lib/sass/script/value/null.rb +0 -5
  42. data/lib/sass/script/value/number.rb +62 -14
  43. data/lib/sass/script/value/string.rb +59 -11
  44. data/lib/sass/script/value.rb +0 -1
  45. data/lib/sass/scss/css_parser.rb +8 -2
  46. data/lib/sass/scss/parser.rb +190 -328
  47. data/lib/sass/scss/rx.rb +15 -6
  48. data/lib/sass/scss/static_parser.rb +298 -1
  49. data/lib/sass/selector/abstract_sequence.rb +28 -13
  50. data/lib/sass/selector/comma_sequence.rb +92 -13
  51. data/lib/sass/selector/pseudo.rb +256 -0
  52. data/lib/sass/selector/sequence.rb +94 -24
  53. data/lib/sass/selector/simple.rb +14 -25
  54. data/lib/sass/selector/simple_sequence.rb +97 -33
  55. data/lib/sass/selector.rb +57 -194
  56. data/lib/sass/shared.rb +1 -1
  57. data/lib/sass/source/map.rb +26 -12
  58. data/lib/sass/stack.rb +0 -6
  59. data/lib/sass/supports.rb +2 -3
  60. data/lib/sass/tree/at_root_node.rb +1 -0
  61. data/lib/sass/tree/charset_node.rb +1 -1
  62. data/lib/sass/tree/directive_node.rb +8 -2
  63. data/lib/sass/tree/error_node.rb +18 -0
  64. data/lib/sass/tree/extend_node.rb +1 -1
  65. data/lib/sass/tree/function_node.rb +4 -0
  66. data/lib/sass/tree/keyframe_rule_node.rb +15 -0
  67. data/lib/sass/tree/prop_node.rb +1 -1
  68. data/lib/sass/tree/rule_node.rb +12 -7
  69. data/lib/sass/tree/visitors/check_nesting.rb +38 -10
  70. data/lib/sass/tree/visitors/convert.rb +16 -18
  71. data/lib/sass/tree/visitors/cssize.rb +29 -29
  72. data/lib/sass/tree/visitors/deep_copy.rb +5 -0
  73. data/lib/sass/tree/visitors/perform.rb +45 -33
  74. data/lib/sass/tree/visitors/set_options.rb +14 -0
  75. data/lib/sass/tree/visitors/to_css.rb +15 -14
  76. data/lib/sass/util/subset_map.rb +1 -1
  77. data/lib/sass/util.rb +222 -99
  78. data/lib/sass/version.rb +5 -5
  79. data/lib/sass.rb +0 -5
  80. data/test/sass/cache_test.rb +62 -20
  81. data/test/sass/callbacks_test.rb +1 -1
  82. data/test/sass/compiler_test.rb +19 -10
  83. data/test/sass/conversion_test.rb +58 -1
  84. data/test/sass/css2sass_test.rb +23 -4
  85. data/test/sass/encoding_test.rb +219 -0
  86. data/test/sass/engine_test.rb +136 -199
  87. data/test/sass/exec_test.rb +2 -2
  88. data/test/sass/extend_test.rb +236 -19
  89. data/test/sass/functions_test.rb +295 -253
  90. data/test/sass/importer_test.rb +31 -21
  91. data/test/sass/logger_test.rb +1 -1
  92. data/test/sass/more_results/more_import.css +1 -1
  93. data/test/sass/plugin_test.rb +14 -13
  94. data/test/sass/results/compact.css +1 -1
  95. data/test/sass/results/complex.css +4 -4
  96. data/test/sass/results/expanded.css +1 -1
  97. data/test/sass/results/import.css +1 -1
  98. data/test/sass/results/import_charset_ibm866.css +2 -2
  99. data/test/sass/results/mixins.css +17 -17
  100. data/test/sass/results/nested.css +1 -1
  101. data/test/sass/results/parent_ref.css +2 -2
  102. data/test/sass/results/script.css +3 -3
  103. data/test/sass/results/scss_import.css +1 -1
  104. data/test/sass/script_conversion_test.rb +10 -7
  105. data/test/sass/script_test.rb +288 -74
  106. data/test/sass/scss/css_test.rb +141 -24
  107. data/test/sass/scss/rx_test.rb +4 -4
  108. data/test/sass/scss/scss_test.rb +457 -18
  109. data/test/sass/source_map_test.rb +115 -25
  110. data/test/sass/superselector_test.rb +191 -0
  111. data/test/sass/templates/scss_import.scss +2 -1
  112. data/test/sass/test_helper.rb +1 -1
  113. data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
  114. data/test/sass/util/normalized_map_test.rb +1 -1
  115. data/test/sass/util/subset_map_test.rb +2 -2
  116. data/test/sass/util_test.rb +31 -1
  117. data/test/sass/value_helpers_test.rb +5 -7
  118. data/test/test_helper.rb +2 -2
  119. data/vendor/listen/CHANGELOG.md +1 -228
  120. data/vendor/listen/Gemfile +5 -15
  121. data/vendor/listen/README.md +111 -77
  122. data/vendor/listen/Rakefile +0 -42
  123. data/vendor/listen/lib/listen/adapter.rb +195 -82
  124. data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
  125. data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
  126. data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
  127. data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
  128. data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
  129. data/vendor/listen/lib/listen/directory_record.rb +96 -61
  130. data/vendor/listen/lib/listen/listener.rb +135 -37
  131. data/vendor/listen/lib/listen/turnstile.rb +9 -5
  132. data/vendor/listen/lib/listen/version.rb +1 -1
  133. data/vendor/listen/lib/listen.rb +33 -19
  134. data/vendor/listen/listen.gemspec +6 -0
  135. data/vendor/listen/spec/listen/adapter_spec.rb +43 -77
  136. data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
  137. data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
  138. data/vendor/listen/spec/listen/listener_spec.rb +128 -39
  139. data/vendor/listen/spec/listen_spec.rb +15 -21
  140. data/vendor/listen/spec/spec_helper.rb +4 -0
  141. data/vendor/listen/spec/support/adapter_helper.rb +52 -15
  142. data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
  143. data/vendor/listen/spec/support/listeners_helper.rb +30 -7
  144. metadata +25 -22
  145. data/ext/mkrf_conf.rb +0 -27
  146. data/lib/sass/importers/deprecated_path.rb +0 -51
  147. data/lib/sass/script/value/deprecated_false.rb +0 -55
  148. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  149. data/vendor/listen/lib/listen/multi_listener.rb +0 -143
  150. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
  151. data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
@@ -1,143 +0,0 @@
1
- module Listen
2
- class MultiListener < Listener
3
- attr_reader :directories, :directories_records, :adapter
4
-
5
- # Initializes the multiple directories listener.
6
- #
7
- # @param [String] directories the directories to listen to
8
- # @param [Hash] options the listen options
9
- # @option options [Regexp] ignore a pattern for ignoring paths
10
- # @option options [Regexp] filter a pattern for filtering paths
11
- # @option options [Float] latency the delay between checking for changes in seconds
12
- # @option options [Boolean] force_polling whether to force the polling adapter or not
13
- # @option options [String, Boolean] polling_fallback_message to change polling fallback message or remove it
14
- #
15
- # @yield [modified, added, removed] the changed files
16
- # @yieldparam [Array<String>] modified the list of modified files
17
- # @yieldparam [Array<String>] added the list of added files
18
- # @yieldparam [Array<String>] removed the list of removed files
19
- #
20
- def initialize(*args, &block)
21
- options = args.last.is_a?(Hash) ? args.pop : {}
22
- directories = args
23
-
24
- @block = block
25
- @directories = directories.map { |d| Pathname.new(d).realpath.to_s }
26
- @directories_records = @directories.map { |d| DirectoryRecord.new(d) }
27
-
28
- ignore(*options.delete(:ignore)) if options[:ignore]
29
- filter(*options.delete(:filter)) if options[:filter]
30
-
31
- @adapter_options = options
32
- end
33
-
34
- # Starts the listener by initializing the adapter and building
35
- # the directory record concurrently, then it starts the adapter to watch
36
- # for changes.
37
- #
38
- # @param [Boolean] blocking whether or not to block the current thread after starting
39
- #
40
- def start(blocking = true)
41
- t = Thread.new { @directories_records.each { |r| r.build } }
42
- @adapter = initialize_adapter
43
- t.join
44
- @adapter.start(blocking)
45
- end
46
-
47
- # Unpauses the listener.
48
- #
49
- # @return [Listen::Listener] the listener
50
- #
51
- def unpause
52
- @directories_records.each { |r| r.build }
53
- @adapter.paused = false
54
- self
55
- end
56
-
57
- # Adds ignored paths to the listener.
58
- #
59
- # @param (see Listen::DirectoryRecord#ignore)
60
- #
61
- # @return [Listen::Listener] the listener
62
- #
63
- def ignore(*paths)
64
- @directories_records.each { |r| r.ignore(*paths) }
65
- self
66
- end
67
-
68
- # Replaces ignored paths in the listener.
69
- #
70
- # @param (see Listen::DirectoryRecord#ignore!)
71
- #
72
- # @return [Listen::Listener] the listener
73
- #
74
- def ignore!(*paths)
75
- @directories_records.each { |r| r.ignore!(*paths) }
76
- self
77
- end
78
-
79
- # Adds file filters to the listener.
80
- #
81
- # @param (see Listen::DirectoryRecord#filter)
82
- #
83
- # @return [Listen::Listener] the listener
84
- #
85
- def filter(*regexps)
86
- @directories_records.each { |r| r.filter(*regexps) }
87
- self
88
- end
89
-
90
- # Replaces file filters in the listener.
91
- #
92
- # @param (see Listen::DirectoryRecord#filter!)
93
- #
94
- # @return [Listen::Listener] the listener
95
- #
96
- def filter!(*regexps)
97
- @directories_records.each { |r| r.filter!(*regexps) }
98
- self
99
- end
100
-
101
- # Runs the callback passing it the changes if there are any.
102
- #
103
- # @param (see Listen::DirectoryRecord#fetch_changes)
104
- #
105
- def on_change(directories_to_search, options = {})
106
- changes = fetch_records_changes(directories_to_search, options)
107
- unless changes.values.all? { |paths| paths.empty? }
108
- @block.call(changes[:modified],changes[:added],changes[:removed])
109
- end
110
- end
111
-
112
- private
113
-
114
- # Initializes an adapter passing it the callback and adapters' options.
115
- #
116
- def initialize_adapter
117
- callback = lambda { |changed_dirs, options| self.on_change(changed_dirs, options) }
118
- Adapter.select_and_initialize(@directories, @adapter_options, &callback)
119
- end
120
-
121
- # Returns the sum of all the changes to the directories records
122
- #
123
- # @param (see Listen::DirectoryRecord#fetch_changes)
124
- #
125
- # @return [Hash] the changes
126
- #
127
- def fetch_records_changes(directories_to_search, options)
128
- @directories_records.inject({}) do |h, r|
129
- # directory records skips paths outside their range, so passing the
130
- # whole `directories` array is not a problem.
131
- record_changes = r.fetch_changes(directories_to_search, options.merge(:relative_paths => DEFAULT_TO_RELATIVE_PATHS))
132
-
133
- if h.empty?
134
- h.merge!(record_changes)
135
- else
136
- h.each { |k, v| h[k] += record_changes[k] }
137
- end
138
-
139
- h
140
- end
141
- end
142
- end
143
- end
@@ -1,107 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Listen::DependencyManager do
4
- let(:dependency) { Listen::DependencyManager::Dependency.new('listen', '~> 0.0.1') }
5
-
6
- subject { Class.new { extend Listen::DependencyManager } }
7
-
8
- before { described_class.clear_loaded }
9
-
10
- describe '.add_loaded' do
11
- it 'adds a dependency to the list of loaded dependencies' do
12
- described_class.add_loaded dependency
13
- described_class.already_loaded?(dependency).should be_true
14
- end
15
- end
16
-
17
- describe '.already_loaded?' do
18
- it 'returns false when a dependency is not in the list of loaded dependencies' do
19
- described_class.already_loaded?(dependency).should be_false
20
- end
21
-
22
- it 'returns true when a dependency is in the list of loaded dependencies' do
23
- described_class.add_loaded dependency
24
- described_class.already_loaded?(dependency).should be_true
25
- end
26
- end
27
-
28
- describe '.clear_loaded' do
29
- it 'clears the whole list of loaded dependencies' do
30
- described_class.add_loaded dependency
31
- described_class.already_loaded?(dependency).should be_true
32
- described_class.clear_loaded
33
- described_class.already_loaded?(dependency).should be_false
34
- end
35
- end
36
-
37
- describe '#dependency' do
38
- it 'registers a new dependency for the managed class' do
39
- subject.dependency 'listen', '~> 0.0.1'
40
- subject.dependencies_loaded?.should be_false
41
- end
42
- end
43
-
44
- describe '#load_depenencies' do
45
- before { subject.dependency 'listen', '~> 0.0.1' }
46
-
47
- context 'when dependencies can be loaded' do
48
- before { subject.stub(:gem, :require) }
49
-
50
- it 'loads all the registerd dependencies' do
51
- subject.load_depenencies
52
- subject.dependencies_loaded?.should be_true
53
- end
54
- end
55
-
56
- context 'when dependencies can not be loaded' do
57
- it 'raises an error' do
58
- expect {
59
- subject.load_depenencies
60
- }.to raise_error(described_class::Error)
61
- end
62
-
63
- context 'when running under bundler' do
64
- before { subject.should_receive(:running_under_bundler?).and_return(true) }
65
-
66
- it 'includes the Gemfile declaration to satisfy the dependency' do
67
- begin
68
- subject.load_depenencies
69
- rescue described_class::Error => e
70
- e.message.should include("gem 'listen', '~> 0.0.1'")
71
- end
72
- end
73
- end
74
-
75
- context 'when not running under bundler' do
76
- before { subject.should_receive(:running_under_bundler?).and_return(false) }
77
-
78
- it 'includes the command to install the dependency' do
79
- begin
80
- subject.load_depenencies
81
- rescue described_class::Error => e
82
- e.message.should include("gem install --version '~> 0.0.1' listen")
83
- end
84
- end
85
- end
86
- end
87
- end
88
-
89
- describe '#dependencies_loaded?' do
90
- it 'return false when dependencies are not loaded' do
91
- subject.dependency 'listen', '~> 0.0.1'
92
- subject.dependencies_loaded?.should be_false
93
- end
94
-
95
- it 'return true when dependencies are loaded' do
96
- subject.stub(:gem, :require)
97
-
98
- subject.dependency 'listen', '~> 0.0.1'
99
- subject.load_depenencies
100
- subject.dependencies_loaded?.should be_true
101
- end
102
-
103
- it 'return true when there are no dependencies to load' do
104
- subject.dependencies_loaded?.should be_true
105
- end
106
- end
107
- end
@@ -1,174 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Listen::MultiListener do
4
- let(:adapter) { mock(Listen::Adapter, :start => true).as_null_object }
5
- let(:watched_directories) { [File.dirname(__FILE__), File.expand_path('../..', __FILE__)] }
6
-
7
- subject { described_class.new(*watched_directories) }
8
-
9
- before do
10
- Listen::Adapter.stub(:select_and_initialize) { adapter }
11
- # Don't build a record of the files inside the base directory.
12
- Listen::DirectoryRecord.any_instance.stub(:build)
13
- end
14
-
15
- it_should_behave_like 'a listener to changes on a file-system'
16
-
17
- describe '#initialize' do
18
- context 'with no options' do
19
- it 'sets the directories' do
20
- subject.directories.should =~ watched_directories
21
- end
22
-
23
- it 'converts the passed paths into absolute paths - #21' do
24
- paths = watched_directories.map { |d| File.join(d, '..') }
25
- described_class.new(*paths).directories.should =~ watched_directories.map{ |d| File.expand_path('..', d) }
26
- end
27
- end
28
-
29
- context 'with custom options' do
30
- subject do
31
- args = watched_directories << {:ignore => /\.ssh/, :filter => [/.*\.rb/,/.*\.md/], :latency => 0.5, :force_polling => true}
32
- described_class.new(*args)
33
- end
34
-
35
- it 'passes the custom ignored paths to each directory record' do
36
- subject.directories_records.each do |r|
37
- r.ignoring_patterns.should include /\.ssh/
38
- end
39
- end
40
-
41
- it 'passes the custom filters to each directory record' do
42
- subject.directories_records.each do |r|
43
- r.filtering_patterns.should =~ [/.*\.rb/,/.*\.md/]
44
- end
45
- end
46
-
47
- it 'sets adapter_options' do
48
- subject.instance_variable_get(:@adapter_options).should eq(:latency => 0.5, :force_polling => true)
49
- end
50
- end
51
- end
52
-
53
- describe '#start' do
54
- it 'selects and initializes an adapter' do
55
- Listen::Adapter.should_receive(:select_and_initialize).with(watched_directories, {}) { adapter }
56
- subject.start
57
- end
58
-
59
- it 'builds all directories records' do
60
- subject.directories_records.each do |r|
61
- r.should_receive(:build)
62
- end
63
- subject.start
64
- end
65
- end
66
-
67
- context 'with a started listener' do
68
- before do
69
- subject.stub(:initialize_adapter) { adapter }
70
- subject.start
71
- end
72
-
73
- describe '#unpause' do
74
- it 'rebuilds all directories records' do
75
- subject.directories_records.each do |r|
76
- r.should_receive(:build)
77
- end
78
- subject.unpause
79
- end
80
- end
81
- end
82
-
83
- describe '#ignore' do
84
- it 'delegates the work to each directory record' do
85
- subject.directories_records.each do |r|
86
- r.should_receive(:ignore).with 'some_directory'
87
- end
88
- subject.ignore 'some_directory'
89
- end
90
- end
91
-
92
- describe '#ignore!' do
93
- it 'delegates the work to each directory record' do
94
- subject.directories_records.each do |r|
95
- r.should_receive(:ignore!).with 'some_directory'
96
- end
97
- subject.ignore! 'some_directory'
98
- end
99
- end
100
-
101
- describe '#filter' do
102
- it 'delegates the work to each directory record' do
103
- subject.directories_records.each do |r|
104
- r.should_receive(:filter).with /\.txt$/
105
- end
106
- subject.filter /\.txt$/
107
- end
108
- end
109
-
110
- describe '#filter!' do
111
- it 'delegates the work to each directory record' do
112
- subject.directories_records.each do |r|
113
- r.should_receive(:filter!).with /\.txt$/
114
- end
115
- subject.filter! /\.txt$/
116
- end
117
- end
118
-
119
- describe '#on_change' do
120
- let(:directories) { %w{dir1 dir2 dir3} }
121
- let(:changes) { {:modified => [], :added => [], :removed => []} }
122
- let(:callback) { Proc.new { @called = true } }
123
-
124
- before do
125
- @called = false
126
- subject.stub(:fetch_records_changes => changes)
127
- end
128
-
129
- it 'fetches the changes of all directories records' do
130
- subject.unstub(:fetch_records_changes)
131
-
132
- subject.directories_records.each do |record|
133
- record.should_receive(:fetch_changes).with(
134
- directories, hash_including(:relative_paths => described_class::DEFAULT_TO_RELATIVE_PATHS)
135
- ).and_return(changes)
136
- end
137
- subject.on_change(directories)
138
- end
139
-
140
- context 'with no changes to report' do
141
- if RUBY_VERSION[/^1.8/]
142
- it 'does not run the callback' do
143
- subject.change(&callback)
144
- subject.on_change(directories)
145
- @called.should be_false
146
- end
147
- else
148
- it 'does not run the callback' do
149
- callback.should_not_receive(:call)
150
- subject.change(&callback)
151
- subject.on_change(directories)
152
- end
153
- end
154
- end
155
-
156
- context 'with changes to report' do
157
- let(:changes) { {:modified => %w{path1}, :added => [], :removed => %w{path2}} }
158
-
159
- if RUBY_VERSION[/^1.8/]
160
- it 'runs the callback passing it the changes' do
161
- subject.change(&callback)
162
- subject.on_change(directories)
163
- @called.should be_true
164
- end
165
- else
166
- it 'runs the callback passing it the changes' do
167
- callback.should_receive(:call).with(changes[:modified], changes[:added], changes[:removed])
168
- subject.change(&callback)
169
- subject.on_change(directories)
170
- end
171
- end
172
- end
173
- end
174
- end