sass 3.1.15 → 3.1.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/README.md +4 -5
  2. data/Rakefile +2 -2
  3. data/VERSION +1 -1
  4. data/lib/sass/css.rb +144 -48
  5. data/lib/sass/engine.rb +3 -1
  6. data/lib/sass/plugin/compiler.rb +25 -32
  7. data/lib/sass/plugin/listener.rb +59 -0
  8. data/lib/sass/script/lexer.rb +1 -1
  9. data/lib/sass/script/list.rb +1 -0
  10. data/lib/sass/scss/parser.rb +90 -4
  11. data/lib/sass/scss/rx.rb +5 -0
  12. data/lib/sass/scss/static_parser.rb +1 -1
  13. data/lib/sass/selector/abstract_sequence.rb +11 -2
  14. data/lib/sass/selector/simple.rb +6 -0
  15. data/lib/sass/tree/comment_node.rb +1 -1
  16. data/lib/sass/tree/node.rb +2 -2
  17. data/lib/sass/tree/visitors/check_nesting.rb +2 -2
  18. data/lib/sass/tree/visitors/cssize.rb +1 -1
  19. data/lib/sass/util.rb +3 -2
  20. data/test/sass/conversion_test.rb +10 -0
  21. data/test/sass/css2sass_test.rb +24 -0
  22. data/test/sass/engine_test.rb +1 -0
  23. data/test/sass/scss/css_test.rb +53 -0
  24. data/vendor/listen/CHANGELOG.md +72 -0
  25. data/vendor/listen/Gemfile +35 -0
  26. data/vendor/listen/Guardfile +8 -0
  27. data/vendor/{fssm → listen}/LICENSE +1 -1
  28. data/vendor/listen/README.md +297 -0
  29. data/vendor/listen/Rakefile +47 -0
  30. data/vendor/listen/Vagrantfile +96 -0
  31. data/vendor/listen/lib/listen.rb +38 -0
  32. data/vendor/listen/lib/listen/adapter.rb +159 -0
  33. data/vendor/listen/lib/listen/adapters/darwin.rb +84 -0
  34. data/vendor/listen/lib/listen/adapters/linux.rb +99 -0
  35. data/vendor/listen/lib/listen/adapters/polling.rb +66 -0
  36. data/vendor/listen/lib/listen/adapters/windows.rb +82 -0
  37. data/vendor/listen/lib/listen/directory_record.rb +257 -0
  38. data/vendor/listen/lib/listen/listener.rb +186 -0
  39. data/vendor/listen/lib/listen/multi_listener.rb +121 -0
  40. data/vendor/listen/lib/listen/turnstile.rb +28 -0
  41. data/vendor/listen/lib/listen/version.rb +3 -0
  42. data/vendor/listen/listen.gemspec +26 -0
  43. data/vendor/listen/spec/listen/adapter_spec.rb +142 -0
  44. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +31 -0
  45. data/vendor/listen/spec/listen/adapters/linux_spec.rb +30 -0
  46. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  47. data/vendor/listen/spec/listen/adapters/windows_spec.rb +24 -0
  48. data/vendor/listen/spec/listen/directory_record_spec.rb +807 -0
  49. data/vendor/listen/spec/listen/listener_spec.rb +151 -0
  50. data/vendor/listen/spec/listen/multi_listener_spec.rb +151 -0
  51. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  52. data/vendor/listen/spec/listen_spec.rb +73 -0
  53. data/vendor/listen/spec/spec_helper.rb +16 -0
  54. data/vendor/listen/spec/support/adapter_helper.rb +538 -0
  55. data/vendor/listen/spec/support/directory_record_helper.rb +35 -0
  56. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  57. data/vendor/listen/spec/support/listeners_helper.rb +133 -0
  58. data/vendor/listen/spec/support/platform_helper.rb +11 -0
  59. metadata +40 -40
  60. data/vendor/fssm/Gemfile +0 -3
  61. data/vendor/fssm/README.markdown +0 -83
  62. data/vendor/fssm/Rakefile +0 -11
  63. data/vendor/fssm/example.rb +0 -12
  64. data/vendor/fssm/ext/rakefile.rb +0 -14
  65. data/vendor/fssm/fssm.gemspec +0 -27
  66. data/vendor/fssm/lib/fssm.rb +0 -74
  67. data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
  68. data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
  69. data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
  70. data/vendor/fssm/lib/fssm/backends/rbfsevent.rb +0 -42
  71. data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
  72. data/vendor/fssm/lib/fssm/monitor.rb +0 -36
  73. data/vendor/fssm/lib/fssm/path.rb +0 -94
  74. data/vendor/fssm/lib/fssm/pathname.rb +0 -36
  75. data/vendor/fssm/lib/fssm/state/directory.rb +0 -75
  76. data/vendor/fssm/lib/fssm/state/file.rb +0 -24
  77. data/vendor/fssm/lib/fssm/support.rb +0 -87
  78. data/vendor/fssm/lib/fssm/tree.rb +0 -176
  79. data/vendor/fssm/lib/fssm/version.rb +0 -3
  80. data/vendor/fssm/profile/prof-cache.rb +0 -40
  81. data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
  82. data/vendor/fssm/profile/prof-pathname-rubinius.rb +0 -35
  83. data/vendor/fssm/profile/prof-pathname.rb +0 -68
  84. data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
  85. data/vendor/fssm/profile/prof.html +0 -2379
  86. data/vendor/fssm/spec/count_down_latch.rb +0 -151
  87. data/vendor/fssm/spec/monitor_spec.rb +0 -202
  88. data/vendor/fssm/spec/path_spec.rb +0 -96
  89. data/vendor/fssm/spec/root/duck/quack.txt +0 -0
  90. data/vendor/fssm/spec/root/file.css +0 -0
  91. data/vendor/fssm/spec/root/file.rb +0 -0
  92. data/vendor/fssm/spec/root/file.yml +0 -0
  93. data/vendor/fssm/spec/root/moo/cow.txt +0 -0
  94. data/vendor/fssm/spec/spec_helper.rb +0 -14
@@ -1,151 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # coding: utf-8
3
-
4
- require 'thread'
5
-
6
- class CountDownLatch
7
- attr_reader :count
8
-
9
- def initialize(to)
10
- @count = to.to_i
11
- raise ArgumentError, "cannot count down from negative integer" unless @count >= 0
12
- @lock = Mutex.new
13
- @condition = ConditionVariable.new
14
- end
15
-
16
- def count_down
17
- @lock.synchronize do
18
- @count -= 1 if @count > 0
19
- @condition.broadcast if @count == 0
20
- end
21
- end
22
-
23
- def wait
24
- @lock.synchronize do
25
- @condition.wait(@lock) while @count > 0
26
- end
27
- end
28
- end
29
-
30
- if $0 == __FILE__
31
- require 'test/unit'
32
-
33
- class CountDownLatchTest < Test::Unit::TestCase
34
- def test_requires_positive_count
35
- assert_raise(ArgumentError) { CountDownLatch.new(-1) }
36
- end
37
-
38
- def test_basic_latch_usage
39
- latch = CountDownLatch.new(1)
40
- name = "foo"
41
- Thread.new do
42
- name = "bar"
43
- latch.count_down
44
- end
45
- latch.wait
46
- assert_equal(0, latch.count)
47
- assert_equal("bar", name)
48
- end
49
-
50
- def test_basic_latch_usage_inverted
51
- latch = CountDownLatch.new(1)
52
- name = "foo"
53
- Thread.new do
54
- latch.wait
55
- assert_equal(0, latch.count)
56
- assert_equal("bar", name)
57
- end
58
- name = "bar"
59
- latch.count_down
60
- end
61
-
62
- def test_count_down_from_zero_skips_wait
63
- latch = CountDownLatch.new(0)
64
- latch.wait
65
- assert_equal(0, latch.count)
66
- end
67
-
68
- def test_count_down_twice_with_thread
69
- latch = CountDownLatch.new(2)
70
- name = "foo"
71
- Thread.new do
72
- latch.count_down
73
- name = "bar"
74
- latch.count_down
75
- end
76
- latch.wait
77
- assert_equal(0, latch.count)
78
- assert_equal("bar", name)
79
- end
80
-
81
- def test_count_down_twice_with_two_parallel_threads
82
- latch = CountDownLatch.new(2)
83
- name = "foo"
84
- Thread.new { latch.count_down }
85
- Thread.new do
86
- name = "bar"
87
- latch.count_down
88
- end
89
- latch.wait
90
- assert_equal(0, latch.count)
91
- assert_equal("bar", name)
92
- end
93
-
94
- def test_count_down_twice_with_two_chained_threads
95
- latch = CountDownLatch.new(2)
96
- name = "foo"
97
- Thread.new do
98
- latch.count_down
99
- Thread.new do
100
- name = "bar"
101
- latch.count_down
102
- end
103
- end
104
- latch.wait
105
- assert_equal(0, latch.count)
106
- assert_equal("bar", name)
107
- end
108
-
109
- def test_count_down_with_multiple_waiters
110
- proceed_latch = CountDownLatch.new(2)
111
- check_latch = CountDownLatch.new(2)
112
- results = {}
113
- Thread.new do
114
- proceed_latch.wait
115
- results[:first] = 1
116
- check_latch.count_down
117
- end
118
- Thread.new do
119
- proceed_latch.wait
120
- results[:second] = 2
121
- check_latch.count_down
122
- end
123
- assert_equal({}, results)
124
- proceed_latch.count_down
125
- proceed_latch.count_down
126
- check_latch.wait
127
- assert_equal(0, proceed_latch.count)
128
- assert_equal(0, check_latch.count)
129
- assert_equal({:first => 1, :second => 2}, results)
130
- end
131
-
132
- def test_interleaved_latches
133
- change_1_latch = CountDownLatch.new(1)
134
- check_latch = CountDownLatch.new(1)
135
- change_2_latch = CountDownLatch.new(1)
136
- name = "foo"
137
- Thread.new do
138
- name = "bar"
139
- change_1_latch.count_down
140
- check_latch.wait
141
- name = "man"
142
- change_2_latch.count_down
143
- end
144
- change_1_latch.wait
145
- assert_equal("bar", name)
146
- check_latch.count_down
147
- change_2_latch.wait
148
- assert_equal("man", name)
149
- end
150
- end
151
- end
@@ -1,202 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'count_down_latch'
4
- require 'fileutils'
5
- require 'tempfile'
6
-
7
- module FSSM::MonitorSpecHelpers
8
- def create_tmp_dir
9
- @tmp_dir = FSSM::Pathname.for(Dir.mktmpdir).realpath.to_s
10
- FileUtils.cp_r File.join(File.dirname(__FILE__), 'root'), @tmp_dir
11
- # Because git does not track empty directories, create one ourselves.
12
- FileUtils.mkdir_p @tmp_dir + '/root/yawn'
13
- @tmp_dir
14
- end
15
-
16
- def remove_tmp_dir
17
- FileUtils.remove_entry @tmp_dir
18
- end
19
-
20
- def create_handler(type, latch)
21
- lambda do |*args|
22
- @handler_results[type] << args
23
- latch.count_down
24
- end
25
- end
26
-
27
- def run_monitor(num_events_to_expect=0, options={})
28
- event_latch = CountDownLatch.new(num_events_to_expect)
29
- @handler_results = Hash.new { |hash, key| hash[key] = [] }
30
- thread = Thread.new do
31
- monitor = FSSM::Monitor.new(options)
32
- monitor.path(@tmp_dir) do |p|
33
- p.create(&create_handler(:create, event_latch))
34
- p.update(&create_handler(:update, event_latch))
35
- p.delete(&create_handler(:delete, event_latch))
36
- end
37
- monitor.run
38
- end
39
- sleep 1 # give time for monitor to start up
40
- yield if block_given?
41
- event_latch.wait
42
- thread.kill
43
- end
44
- end
45
-
46
- describe "The File System State Monitor" do
47
- describe "monitor" do
48
- include FSSM::MonitorSpecHelpers
49
-
50
- before do
51
- create_tmp_dir
52
- end
53
-
54
- after do
55
- remove_tmp_dir
56
- end
57
-
58
- describe "with default options" do
59
- it "should call create callback upon file creation" do
60
- run_monitor(1) do
61
- file = @tmp_dir + "/newfile.rb"
62
- File.exists?(file).should be_false
63
- FileUtils.touch file
64
- end
65
- @handler_results[:create].should == [[@tmp_dir, 'newfile.rb']]
66
- end
67
-
68
- it "should call update callback upon file modification" do
69
- run_monitor(1) do
70
- FileUtils.touch @tmp_dir + '/root/file.rb'
71
- end
72
- @handler_results[:update].should == [[@tmp_dir, 'root/file.rb']]
73
- end
74
-
75
- it "should call delete callback upon file deletion" do
76
- run_monitor(1) do
77
- FileUtils.rm @tmp_dir + "/root/file.rb"
78
- end
79
- @handler_results[:delete].should == [[@tmp_dir, 'root/file.rb']]
80
- end
81
-
82
- it "should call create and delete callbacks upon file renaming in the same directory" do
83
- run_monitor(2) do
84
- FileUtils.mv @tmp_dir + "/root/file.rb", @tmp_dir + "/root/old_file.rb"
85
- end
86
- @handler_results[:create].should == [[@tmp_dir, 'root/old_file.rb']]
87
- @handler_results[:delete].should == [[@tmp_dir, 'root/file.rb']]
88
- @handler_results[:update].should == []
89
- end
90
-
91
- it "should call create and delete callbacks upon file moving to another directory" do
92
- run_monitor(2) do
93
- FileUtils.mv @tmp_dir + "/root/file.rb", @tmp_dir + "/old_file.rb"
94
- end
95
- @handler_results[:create].should == [[@tmp_dir, 'old_file.rb']]
96
- @handler_results[:delete].should == [[@tmp_dir, 'root/file.rb']]
97
- @handler_results[:update].should == []
98
- end
99
-
100
- it "should not call callbacks upon directory operations" do
101
- run_monitor do
102
- FileUtils.mkdir @tmp_dir + "/another_yawn"
103
- FileUtils.rmdir @tmp_dir + "/root/yawn"
104
- end
105
- @handler_results[:create].should == []
106
- @handler_results[:delete].should == []
107
- end
108
- end
109
-
110
- describe "when configured to consider files and directories" do
111
- it "should call create callback upon directory creation" do
112
- run_monitor(1, :directories => true) do
113
- FileUtils.mkdir @tmp_dir + "/another_yawn"
114
- end
115
- @handler_results[:create].should include([@tmp_dir, 'another_yawn', :directory])
116
- end
117
-
118
- it "should call delete callback upon directory deletion" do
119
- run_monitor(1, :directories => true) do
120
- FileUtils.rmdir @tmp_dir + "/root/yawn"
121
- end
122
- @handler_results[:delete].should include([@tmp_dir, 'root/yawn', :directory])
123
- end
124
-
125
- it "should call create, update, and delete callbacks upon directory renaming in the same directory" do
126
- run_monitor(3, :directories => true) do
127
- FileUtils.mv @tmp_dir + "/root/yawn", @tmp_dir + "/root/old_yawn"
128
- end
129
- @handler_results[:create].should include([@tmp_dir, 'root/old_yawn', :directory])
130
- @handler_results[:delete].should include([@tmp_dir, 'root/yawn', :directory])
131
- @handler_results[:update].should include([@tmp_dir, 'root', :directory])
132
- end
133
-
134
- it "should call create, update, and delete callbacks upon directory moving to another directory" do
135
- run_monitor(3, :directories => true) do
136
- FileUtils.mv @tmp_dir + "/root/yawn", @tmp_dir + "/old_yawn"
137
- end
138
- @handler_results[:create].should include([@tmp_dir, 'old_yawn', :directory])
139
- @handler_results[:delete].should include([@tmp_dir, 'root/yawn', :directory])
140
- @handler_results[:update].should include([@tmp_dir, 'root', :directory])
141
- end
142
-
143
- it "should call create, update, and delete callbacks upon file renaming in the same directory" do
144
- run_monitor(3, :directories => true) do
145
- FileUtils.mv @tmp_dir + "/root/file.rb", @tmp_dir + "/root/old_file.rb"
146
- end
147
- @handler_results[:create].should include([@tmp_dir, 'root/old_file.rb', :file])
148
- @handler_results[:delete].should include([@tmp_dir, 'root/file.rb', :file])
149
- @handler_results[:update].should include([@tmp_dir, 'root', :directory])
150
- end
151
-
152
- it "should call create, update, and delete callbacks upon file moving to another directory" do
153
- run_monitor(3, :directories => true) do
154
- FileUtils.mv @tmp_dir + "/root/file.rb", @tmp_dir + "/old_file.rb"
155
- end
156
- @handler_results[:create].should include([@tmp_dir, 'old_file.rb', :file])
157
- @handler_results[:delete].should include([@tmp_dir, 'root/file.rb', :file])
158
- @handler_results[:update].should include([@tmp_dir, 'root', :directory])
159
- end
160
-
161
- it "should call delete callbacks upon directory structure deletion, in reverse order" do
162
- expected_delete_events = [
163
- ['root/yawn', :directory],
164
- ['root/moo/cow.txt', :file],
165
- ['root/moo', :directory],
166
- ['root/file.yml', :file],
167
- ['root/file.rb', :file],
168
- ['root/file.css', :file],
169
- ['root/duck/quack.txt', :file],
170
- ['root/duck', :directory],
171
- ['root', :directory]
172
- ]
173
- run_monitor(expected_delete_events.size, :directories => true) do
174
- FileUtils.rm_rf @tmp_dir + '/.'
175
- end
176
- @handler_results[:create].should == []
177
- @handler_results[:delete].should == expected_delete_events.map { |(file, type)| [@tmp_dir, file, type] }
178
- @handler_results[:update].should == []
179
- end
180
-
181
- it "should call create callbacks upon directory structure creation, in order" do
182
- expected_create_events = [
183
- ['new_root', :directory],
184
- ['new_root/duck', :directory],
185
- ['new_root/duck/quack.txt', :file],
186
- ['new_root/file.css', :file],
187
- ['new_root/file.rb', :file],
188
- ['new_root/file.yml', :file],
189
- ['new_root/moo', :directory],
190
- ['new_root/moo/cow.txt', :file],
191
- ['new_root/yawn', :directory]
192
- ]
193
- run_monitor(expected_create_events.size, :directories => true) do
194
- FileUtils.cp_r @tmp_dir + '/root/.', @tmp_dir + '/new_root'
195
- end
196
- @handler_results[:create].should == expected_create_events.map { |(file, type)| [@tmp_dir, file, type] }
197
- @handler_results[:delete].should == []
198
- @handler_results[:update].should == []
199
- end
200
- end
201
- end
202
- end
@@ -1,96 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "The File System State Monitor" do
4
- describe "paths" do
5
- it "should accept a valid filesystem directory" do
6
- lambda { FSSM::Path.new("#{@watch_root}") }.should_not raise_error
7
- end
8
-
9
- it "should not accept an invalid filesystem directory" do
10
- lambda { FSSM::Path.new('/does/not/exist/kthxbye') }.should raise_error
11
- end
12
-
13
- it "should default the path to the current directory" do
14
- path = FSSM::Path.new
15
- here = Pathname.new('.').realpath
16
-
17
- "#{here}".should == "#{path}"
18
- end
19
-
20
- it "should accept an optional glob array parameter" do
21
- path = FSSM::Path.new('.', ['**/*.yml'])
22
- path.glob.should == ['**/*.yml']
23
- end
24
-
25
- it "should accept an optional glob string parameter" do
26
- path = FSSM::Path.new('.', '**/*.yml')
27
- path.glob.should == ['**/*.yml']
28
- end
29
-
30
- it "should accept an optional option parameter" do
31
- lambda { FSSM::Path.new('.', '**/*.yml', :foo => :bar) }.should_not raise_error
32
- end
33
-
34
- it "should default the glob to ['**/*']" do
35
- path = FSSM::Path.new
36
- path.glob.should == ['**/*']
37
- end
38
-
39
- it "should accept a callback for update events" do
40
- path = FSSM::Path.new
41
- callback = lambda { |base, relative| return true }
42
- path.update(&callback)
43
- (path.update).should == callback
44
- end
45
-
46
- it "should accept a callback for delete events" do
47
- path = FSSM::Path.new
48
- callback = lambda { |base, relative| return true }
49
- path.delete(&callback)
50
- (path.delete).should == callback
51
- end
52
-
53
- it "should accept a callback for create events" do
54
- path = FSSM::Path.new
55
- callback = lambda { |base, relative| return true }
56
- path.create(&callback)
57
- (path.create).should == callback
58
- end
59
-
60
- it "should accept a configuration block" do
61
- path = FSSM::Path.new "#{@watch_root}" do
62
- glob '**/*.yml'
63
- update { |base, relative| 'success' }
64
- delete { |base, relative| 'success' }
65
- create { |base, relative| 'success' }
66
- end
67
-
68
- "#{path}".should == "#{@watch_root}"
69
- path.glob.should == ['**/*.yml']
70
- path.update.should be_a_kind_of(Proc)
71
- path.delete.should be_a_kind_of(Proc)
72
- path.create.should be_a_kind_of(Proc)
73
- path.update.call('', '').should == 'success'
74
- path.delete.call('', '').should == 'success'
75
- path.create.call('', '').should == 'success'
76
- end
77
-
78
- it "should pass file type to callbacks as the third argument if :directories option is used" do
79
- path = FSSM::Path.new "#{@watch_root}", nil, :directories => true do
80
- glob '**/*.yml'
81
- update { |base, relative, type| [base, relative, type] }
82
- delete { |base, relative, type| [base, relative, type] }
83
- create { |base, relative, type| [base, relative, type] }
84
- end
85
-
86
- "#{path}".should == "#{@watch_root}"
87
- path.glob.should == ['**/*.yml']
88
- path.update.should be_a_kind_of(Proc)
89
- path.delete.should be_a_kind_of(Proc)
90
- path.create.should be_a_kind_of(Proc)
91
- path.update.call('b', 'r', 't').should == ['b', 'r', 't']
92
- path.delete.call('b', 'r', 't').should == ['b', 'r', 't']
93
- path.create.call('b', 'r', 't').should == ['b', 'r', 't']
94
- end
95
- end
96
- end