sass 3.3.0 → 3.3.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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/lib/sass/importers/filesystem.rb +3 -3
- data/lib/sass/plugin/compiler.rb +95 -52
- data/lib/sass/script/functions.rb +1 -1
- data/lib/sass/source/map.rb +3 -3
- data/lib/sass/util.rb +16 -1
- data/vendor/listen/CHANGELOG.md +175 -35
- data/vendor/listen/Gemfile +5 -15
- data/vendor/listen/README.md +111 -77
- data/vendor/listen/Rakefile +0 -42
- data/vendor/listen/lib/listen.rb +33 -19
- data/vendor/listen/lib/listen/adapter.rb +193 -82
- data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
- data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
- data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
- data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
- data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
- data/vendor/listen/lib/listen/directory_record.rb +96 -61
- data/vendor/listen/lib/listen/listener.rb +135 -37
- data/vendor/listen/lib/listen/turnstile.rb +9 -5
- data/vendor/listen/lib/listen/version.rb +1 -1
- data/vendor/listen/listen.gemspec +6 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +37 -82
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
- data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
- data/vendor/listen/spec/listen/listener_spec.rb +128 -39
- data/vendor/listen/spec/listen_spec.rb +15 -21
- data/vendor/listen/spec/spec_helper.rb +4 -0
- data/vendor/listen/spec/support/adapter_helper.rb +52 -15
- data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
- data/vendor/listen/spec/support/listeners_helper.rb +30 -7
- metadata +3 -23
- data/ext/mkrf_conf.rb +0 -27
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
@@ -4,62 +4,11 @@ module Listen
|
|
4
4
|
# Adapter implementation for Mac OS X `FSEvents`.
|
5
5
|
#
|
6
6
|
class Darwin < Adapter
|
7
|
-
extend DependencyManager
|
8
|
-
|
9
|
-
# Declare the adapter's dependencies
|
10
|
-
dependency 'rb-fsevent', '~> 0.9'
|
11
|
-
|
12
7
|
LAST_SEPARATOR_REGEX = /\/$/
|
13
8
|
|
14
|
-
# Initializes the Adapter. See {Listen::Adapter#initialize} for more info.
|
15
|
-
#
|
16
|
-
def initialize(directories, options = {}, &callback)
|
17
|
-
super
|
18
|
-
@worker = init_worker
|
19
|
-
end
|
20
|
-
|
21
|
-
# Starts the adapter.
|
22
|
-
#
|
23
|
-
# @param [Boolean] blocking whether or not to block the current thread after starting
|
24
|
-
#
|
25
|
-
def start(blocking = true)
|
26
|
-
@mutex.synchronize do
|
27
|
-
return if @stop == false
|
28
|
-
super
|
29
|
-
end
|
30
|
-
|
31
|
-
@worker_thread = Thread.new { @worker.run }
|
32
|
-
|
33
|
-
# The FSEvent worker needs sometime to startup. Turnstiles can't
|
34
|
-
# be used to wait for it as it runs in a loop.
|
35
|
-
# TODO: Find a better way to block until the worker starts.
|
36
|
-
sleep 0.1
|
37
9
|
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
# Stops the adapter.
|
43
|
-
#
|
44
|
-
def stop
|
45
|
-
@mutex.synchronize do
|
46
|
-
return if @stop == true
|
47
|
-
super
|
48
|
-
end
|
49
|
-
|
50
|
-
@worker.stop
|
51
|
-
@worker_thread.join if @worker_thread
|
52
|
-
@poll_thread.join if @poll_thread
|
53
|
-
end
|
54
|
-
|
55
|
-
# Checks if the adapter is usable on the current OS.
|
56
|
-
#
|
57
|
-
# @return [Boolean] whether usable or not
|
58
|
-
#
|
59
|
-
def self.usable?
|
60
|
-
return false unless RbConfig::CONFIG['target_os'] =~ /darwin(1.+)?$/i
|
61
|
-
super
|
62
|
-
end
|
10
|
+
def self.target_os_regex; /darwin(1.+)?$/i; end
|
11
|
+
def self.adapter_gem; 'rb-fsevent'; end
|
63
12
|
|
64
13
|
private
|
65
14
|
|
@@ -68,17 +17,31 @@ module Listen
|
|
68
17
|
#
|
69
18
|
# @return [FSEvent] initialized worker
|
70
19
|
#
|
71
|
-
|
20
|
+
# @see Listen::Adapter#initialize_worker
|
21
|
+
#
|
22
|
+
def initialize_worker
|
72
23
|
FSEvent.new.tap do |worker|
|
73
|
-
worker.watch(
|
74
|
-
next if
|
75
|
-
|
76
|
-
|
24
|
+
worker.watch(directories.dup, :latency => latency) do |changes|
|
25
|
+
next if paused
|
26
|
+
|
27
|
+
mutex.synchronize do
|
28
|
+
changes.each { |path| @changed_directories << path.sub(LAST_SEPARATOR_REGEX, '') }
|
77
29
|
end
|
78
30
|
end
|
79
31
|
end
|
80
32
|
end
|
81
33
|
|
34
|
+
# Starts the worker in a new thread and sleep 0.1 second.
|
35
|
+
#
|
36
|
+
# @see Listen::Adapter#start_worker
|
37
|
+
#
|
38
|
+
def start_worker
|
39
|
+
@worker_thread = Thread.new { worker.run }
|
40
|
+
# The FSEvent worker needs some time to start up. Turnstiles can't
|
41
|
+
# be used to wait for it as it runs in a loop.
|
42
|
+
# TODO: Find a better way to block until the worker starts.
|
43
|
+
sleep 0.1
|
44
|
+
end
|
82
45
|
end
|
83
46
|
|
84
47
|
end
|
@@ -4,17 +4,12 @@ module Listen
|
|
4
4
|
# Listener implementation for Linux `inotify`.
|
5
5
|
#
|
6
6
|
class Linux < Adapter
|
7
|
-
extend DependencyManager
|
8
|
-
|
9
|
-
# Declare the adapter's dependencies
|
10
|
-
dependency 'rb-inotify', '~> 0.9'
|
11
|
-
|
12
7
|
# Watched inotify events
|
13
8
|
#
|
14
9
|
# @see http://www.tin.org/bin/man.cgi?section=7&topic=inotify
|
15
10
|
# @see https://github.com/nex3/rb-inotify/blob/master/lib/rb-inotify/notifier.rb#L99-L177
|
16
11
|
#
|
17
|
-
EVENTS =
|
12
|
+
EVENTS = [:recursive, :attrib, :create, :delete, :move, :close_write]
|
18
13
|
|
19
14
|
# The message to show when the limit of inotify watchers is not enough
|
20
15
|
#
|
@@ -25,63 +20,31 @@ module Listen
|
|
25
20
|
for information on how to solve this issue.
|
26
21
|
EOS
|
27
22
|
|
28
|
-
|
23
|
+
def self.target_os_regex; /linux/i; end
|
24
|
+
def self.adapter_gem; 'rb-inotify'; end
|
25
|
+
|
26
|
+
# Initializes the Adapter.
|
27
|
+
#
|
28
|
+
# @see Listen::Adapter#initialize
|
29
29
|
#
|
30
30
|
def initialize(directories, options = {}, &callback)
|
31
31
|
super
|
32
|
-
@worker = init_worker
|
33
32
|
rescue Errno::ENOSPC
|
34
33
|
abort(INOTIFY_LIMIT_MESSAGE)
|
35
34
|
end
|
36
35
|
|
37
|
-
|
38
|
-
#
|
39
|
-
# @param [Boolean] blocking whether or not to block the current thread after starting
|
40
|
-
#
|
41
|
-
def start(blocking = true)
|
42
|
-
@mutex.synchronize do
|
43
|
-
return if @stop == false
|
44
|
-
super
|
45
|
-
end
|
46
|
-
|
47
|
-
@worker_thread = Thread.new { @worker.run }
|
48
|
-
@poll_thread = Thread.new { poll_changed_dirs } if @report_changes
|
49
|
-
|
50
|
-
@worker_thread.join if blocking
|
51
|
-
end
|
52
|
-
|
53
|
-
# Stops the adapter.
|
54
|
-
#
|
55
|
-
def stop
|
56
|
-
@mutex.synchronize do
|
57
|
-
return if @stop == true
|
58
|
-
super
|
59
|
-
end
|
60
|
-
|
61
|
-
@worker.stop
|
62
|
-
Thread.kill(@worker_thread) if @worker_thread
|
63
|
-
@poll_thread.join if @poll_thread
|
64
|
-
end
|
65
|
-
|
66
|
-
# Checks if the adapter is usable on the current OS.
|
67
|
-
#
|
68
|
-
# @return [Boolean] whether usable or not
|
69
|
-
#
|
70
|
-
def self.usable?
|
71
|
-
return false unless RbConfig::CONFIG['target_os'] =~ /linux/i
|
72
|
-
super
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
36
|
+
private
|
76
37
|
|
77
38
|
# Initializes a INotify worker and adds a watcher for
|
78
39
|
# each directory passed to the adapter.
|
79
40
|
#
|
80
41
|
# @return [INotify::Notifier] initialized worker
|
81
42
|
#
|
82
|
-
|
43
|
+
# @see Listen::Adapter#initialize_worker
|
44
|
+
#
|
45
|
+
def initialize_worker
|
83
46
|
callback = lambda do |event|
|
84
|
-
if
|
47
|
+
if paused || (
|
85
48
|
# Event on root directory
|
86
49
|
event.name == ""
|
87
50
|
) || (
|
@@ -89,24 +52,29 @@ module Listen
|
|
89
52
|
# on the directories themselves too.
|
90
53
|
#
|
91
54
|
# @see http://linux.die.net/man/7/inotify
|
92
|
-
event.flags.include?(:isdir) and event.flags & [:close, :modify]
|
55
|
+
event.flags.include?(:isdir) and (event.flags & [:close, :modify]).any?
|
93
56
|
)
|
94
57
|
# Skip all of these!
|
95
58
|
next
|
96
59
|
end
|
97
60
|
|
98
|
-
|
99
|
-
@
|
61
|
+
mutex.synchronize do
|
62
|
+
@changed_directories << File.dirname(event.absolute_name)
|
100
63
|
end
|
101
64
|
end
|
102
65
|
|
103
66
|
INotify::Notifier.new.tap do |worker|
|
104
|
-
|
105
|
-
worker.watch(directory, *EVENTS.map(&:to_sym), &callback)
|
106
|
-
end
|
67
|
+
directories.each { |dir| worker.watch(dir, *EVENTS, &callback) }
|
107
68
|
end
|
108
69
|
end
|
109
70
|
|
71
|
+
# Starts the worker in a new thread.
|
72
|
+
#
|
73
|
+
# @see Listen::Adapter#start_worker
|
74
|
+
#
|
75
|
+
def start_worker
|
76
|
+
@worker_thread = Thread.new { worker.run }
|
77
|
+
end
|
110
78
|
end
|
111
79
|
|
112
80
|
end
|
@@ -1,66 +1,57 @@
|
|
1
1
|
module Listen
|
2
2
|
module Adapters
|
3
3
|
|
4
|
-
# The default delay between checking for changes.
|
5
4
|
DEFAULT_POLLING_LATENCY = 1.0
|
6
5
|
|
7
6
|
# Polling Adapter that works cross-platform and
|
8
7
|
# has no dependencies. This is the adapter that
|
9
8
|
# uses the most CPU processing power and has higher
|
10
|
-
# file IO
|
9
|
+
# file IO than the other implementations.
|
11
10
|
#
|
12
11
|
class Polling < Adapter
|
13
|
-
|
12
|
+
private
|
14
13
|
|
15
|
-
#
|
14
|
+
# The default delay between checking for changes.
|
16
15
|
#
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
# @see Listen::Adapter#default_latency
|
17
|
+
#
|
18
|
+
def default_latency
|
19
|
+
1.0
|
20
20
|
end
|
21
21
|
|
22
|
-
#
|
22
|
+
# The thread on which the main thread should wait
|
23
|
+
# when the adapter has been started in blocking mode.
|
23
24
|
#
|
24
|
-
# @
|
25
|
+
# @see Listen::Adapter#blocking_thread
|
25
26
|
#
|
26
|
-
def
|
27
|
-
|
28
|
-
return if @stop == false
|
29
|
-
super
|
30
|
-
end
|
31
|
-
|
32
|
-
@poll_thread = Thread.new { poll }
|
33
|
-
@poll_thread.join if blocking
|
27
|
+
def blocking_thread
|
28
|
+
poller_thread
|
34
29
|
end
|
35
30
|
|
36
|
-
#
|
31
|
+
# @see Listen::Adapter#start_worker
|
37
32
|
#
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
@poll_thread.join
|
33
|
+
# @see Listen::Adapter#start_worker
|
34
|
+
#
|
35
|
+
def start_worker
|
36
|
+
# The polling adapter has no worker! Sad panda! :'(
|
45
37
|
end
|
46
38
|
|
47
|
-
private
|
48
|
-
|
49
39
|
# Poll listener directory for file system changes.
|
50
40
|
#
|
51
|
-
|
52
|
-
|
53
|
-
|
41
|
+
# @see Listen::Adapter#poll_changed_directories
|
42
|
+
#
|
43
|
+
def poll_changed_directories
|
44
|
+
until stopped
|
45
|
+
next if paused
|
54
46
|
|
55
47
|
start = Time.now.to_f
|
56
|
-
|
57
|
-
|
58
|
-
nap_time =
|
48
|
+
callback.call(directories.dup, :recursive => true)
|
49
|
+
turnstile.signal
|
50
|
+
nap_time = latency - (Time.now.to_f - start)
|
59
51
|
sleep(nap_time) if nap_time > 0
|
60
52
|
end
|
61
53
|
rescue Interrupt
|
62
54
|
end
|
63
|
-
|
64
55
|
end
|
65
56
|
|
66
57
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'set'
|
2
|
+
require 'rubygems'
|
2
3
|
|
3
4
|
module Listen
|
4
5
|
module Adapters
|
@@ -6,81 +7,84 @@ module Listen
|
|
6
7
|
# Adapter implementation for Windows `wdm`.
|
7
8
|
#
|
8
9
|
class Windows < Adapter
|
9
|
-
extend DependencyManager
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '')
|
12
|
+
Please add the following to your Gemfile to avoid polling for changes:
|
13
|
+
require 'rbconfig'
|
14
|
+
gem 'wdm', '>= 0.1.0' if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
|
15
|
+
EOS
|
13
16
|
|
14
|
-
|
17
|
+
def self.target_os_regex; /mswin|mingw/i; end
|
18
|
+
def self.adapter_gem; 'wdm'; end
|
19
|
+
|
20
|
+
# Checks if the adapter is usable on target OS.
|
15
21
|
#
|
16
|
-
|
17
|
-
|
18
|
-
|
22
|
+
# @return [Boolean] whether usable or not
|
23
|
+
#
|
24
|
+
def self.usable?
|
25
|
+
super if mri? && at_least_ruby_1_9?
|
19
26
|
end
|
20
27
|
|
21
|
-
#
|
28
|
+
# Load the adapter gem
|
22
29
|
#
|
23
|
-
# @
|
30
|
+
# @return [Boolean] whether required or not
|
24
31
|
#
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
@worker_thread = Thread.new { @worker.run! }
|
32
|
-
|
33
|
-
# Wait for the worker to start. This is needed to avoid a deadlock
|
34
|
-
# when stopping immediately after starting.
|
35
|
-
sleep 0.1
|
36
|
-
|
37
|
-
@poll_thread = Thread.new { poll_changed_dirs } if @report_changes
|
38
|
-
|
39
|
-
@worker_thread.join if blocking
|
32
|
+
def self.load_dependent_adapter
|
33
|
+
super
|
34
|
+
rescue Gem::LoadError
|
35
|
+
Kernel.warn BUNDLER_DECLARE_GEM
|
40
36
|
end
|
41
37
|
|
42
|
-
|
43
|
-
#
|
44
|
-
def stop
|
45
|
-
@mutex.synchronize do
|
46
|
-
return if @stop == true
|
47
|
-
super
|
48
|
-
end
|
38
|
+
private
|
49
39
|
|
50
|
-
|
51
|
-
|
52
|
-
|
40
|
+
# Checks if Ruby engine is MRI.
|
41
|
+
#
|
42
|
+
# @return [Boolean]
|
43
|
+
#
|
44
|
+
def self.mri?
|
45
|
+
defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby'
|
53
46
|
end
|
54
47
|
|
55
|
-
# Checks if
|
48
|
+
# Checks if Ruby engine is MRI.
|
56
49
|
#
|
57
|
-
# @return [Boolean]
|
50
|
+
# @return [Boolean]
|
58
51
|
#
|
59
|
-
def self.
|
60
|
-
|
61
|
-
super
|
52
|
+
def self.at_least_ruby_1_9?
|
53
|
+
Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('1.9.2')
|
62
54
|
end
|
63
55
|
|
64
|
-
private
|
65
|
-
|
66
56
|
# Initializes a WDM monitor and adds a watcher for
|
67
57
|
# each directory passed to the adapter.
|
68
58
|
#
|
69
59
|
# @return [WDM::Monitor] initialized worker
|
70
60
|
#
|
71
|
-
|
61
|
+
# @see Listen::Adapter#initialize_worker
|
62
|
+
#
|
63
|
+
def initialize_worker
|
72
64
|
callback = Proc.new do |change|
|
73
|
-
next if
|
74
|
-
|
75
|
-
|
65
|
+
next if paused
|
66
|
+
|
67
|
+
mutex.synchronize do
|
68
|
+
@changed_directories << File.dirname(change.path)
|
76
69
|
end
|
77
70
|
end
|
78
71
|
|
79
72
|
WDM::Monitor.new.tap do |worker|
|
80
|
-
|
73
|
+
directories.each { |dir| worker.watch_recursively(dir, &callback) }
|
81
74
|
end
|
82
75
|
end
|
83
76
|
|
77
|
+
# Start the worker in a new thread and sleep 0.1 second.
|
78
|
+
#
|
79
|
+
# @see Listen::Adapter#start_worker
|
80
|
+
#
|
81
|
+
def start_worker
|
82
|
+
@worker_thread = Thread.new { worker.run! }
|
83
|
+
# Wait for the worker to start. This is needed to avoid a deadlock
|
84
|
+
# when stopping immediately after starting.
|
85
|
+
sleep 0.1
|
86
|
+
end
|
87
|
+
|
84
88
|
end
|
85
89
|
|
86
90
|
end
|