guard-sass 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 - 2011 Joshua Hawxwell
1
+ Copyright (c) 2010 - 2012 Joshua Hawxwell
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # Guard-Sass
2
2
 
3
- guard-sass compiles or validates your sass (and scss) files automatically when
3
+ guard-sass compiles or validates your sass (and scss) files automatically when
4
4
  changed.
5
5
 
6
6
 
7
7
  ## Install
8
8
 
9
- You will need to have [guard](http://github.com/guard/guard) to continue, so
9
+ You will need to have [guard](http://github.com/guard/guard) to continue, so
10
10
  install it now!
11
11
 
12
12
  Install the gem with:
@@ -44,22 +44,22 @@ If your output directory is the same as the input directory, you can simply skip
44
44
 
45
45
  ### Rails App With the Asset Pipeline
46
46
 
47
- With the introduction of the [asset pipeline][rpipe] in Rails 3.1 there is no
48
- need to compile your Sass stylesheets with this Guard. However, if you would
49
- still like to have feedback on the validation of your stylesheets (preferably
50
- with a Growl notification) directly after you save a change, then you can still
47
+ With the introduction of the [asset pipeline][rpipe] in Rails 3.1 there is no
48
+ need to compile your Sass stylesheets with this Guard. However, if you would
49
+ still like to have feedback on the validation of your stylesheets (preferably
50
+ with a Growl notification) directly after you save a change, then you can still
51
51
  use this Guard and simply skip generation of the output file:
52
52
 
53
53
  guard 'sass', :input => 'app/assets/stylesheets', :noop => true
54
54
 
55
- This gives you (almost) immediate feedback on whether the changes made are valid,
56
- and is much faster than making a subsequent request to your Rails application.
57
- If you just want to be notified when an error occurs you can hide the success
55
+ This gives you (almost) immediate feedback on whether the changes made are valid,
56
+ and is much faster than making a subsequent request to your Rails application.
57
+ If you just want to be notified when an error occurs you can hide the success
58
58
  compilation message:
59
59
 
60
- guard 'sass',
61
- :input => 'app/assets/stylesheets',
62
- :noop => true,
60
+ guard 'sass',
61
+ :input => 'app/assets/stylesheets',
62
+ :noop => true,
63
63
  :hide_success => true
64
64
 
65
65
  ### Rails App Without the Asset Pipeline
@@ -85,32 +85,36 @@ The following options can be passed to guard-sass:
85
85
  :input => 'sass' # Relative path to the input directory.
86
86
  # A suffix `/(.+\.s[ac]ss)` will be added to this option.
87
87
  # default: nil
88
-
88
+
89
89
  :output => 'stylesheets' # Relative path to the output directory.
90
90
  # default: 'css' or the :input option when supplied
91
-
91
+
92
92
  :all_on_start => true # Compiles all sass files on start
93
93
  # default: false
94
-
94
+
95
95
  :extension => '' # Extension used for written files.
96
96
  # default: '.css'
97
-
97
+
98
98
  :hide_success => true # Disable successful compilation messages.
99
99
  # default: false
100
-
100
+
101
101
  :shallow => true # Do not create nested output directories.
102
102
  # default: false
103
-
104
- :style => :nested # Controls the output style. Accepted options are :nested,
103
+
104
+ :style => :nested # Controls the output style. Accepted options are :nested,
105
105
  # :compact, :compressed and :expanded
106
106
  # default: :nested
107
-
107
+
108
108
  :load_paths => ['sass/partials'] # Paths for sass to find imported sass files from.
109
- # default: all directories under current
110
-
109
+ # default: template locations provided by the sass gem
110
+
111
111
  :noop => true # No operation: Do not write output file
112
112
  # default: false
113
-
113
+
114
+ :line_numbers => true # Add human readable source filname and line number
115
+ # information as comments.
116
+ # default: false
117
+
114
118
  :debug_info => true # File and line number info for FireSass.
115
119
  # default: false
116
120
 
@@ -129,7 +133,7 @@ These are equivalent to
129
133
  guard 'sass', :output => 'styles' do
130
134
  watch %r{^sass/(.+\.s[ac]ss)$}
131
135
  end
132
-
136
+
133
137
  guard 'sass' do
134
138
  watch %r{^stylesheets/(.+\.s[ac]ss)$}
135
139
  end
@@ -139,7 +143,7 @@ These are equivalent to
139
143
  By default the guard detects nested directories and writes files into the output
140
144
  directory with the same structure.
141
145
 
142
- The Guard detects by default nested directories and creates these within the
146
+ The Guard detects by default nested directories and creates these within the
143
147
  output directory. The detection is based on the match of the watch regular expression:
144
148
 
145
149
  A file
@@ -158,10 +162,10 @@ will be compiled to
158
162
 
159
163
  public/stylesheets/form/button.css
160
164
 
161
- Note the parenthesis around `.+\.s[ac]ss`. This enables guard-sass to place
165
+ Note the parenthesis around `.+\.s[ac]ss`. This enables guard-sass to place
162
166
  the full path that was matched inside the parenthesis into the proper output directory.
163
167
 
164
- This behaviour can be switched off by passing the option `:shallow => true` to the
168
+ This behaviour can be switched off by passing the option `:shallow => true` to the
165
169
  Guard, so that all stylesheets will be compiled directly to the output directory.
166
170
  So the previous example would have compiled to `public/stylesheets/button.css`.
167
171
 
@@ -181,7 +185,7 @@ on `#guard` (irc.freenode.net).
181
185
 
182
186
  Have a look at the [GitHub contributor][contrib] list to see all contributors.
183
187
 
184
- Since this Guard is very close to [guard-coffeescript][gcs], some features have been
188
+ Since this Guard is very close to [guard-coffeescript][gcs], some features have been
185
189
  incorporated into guard-sass.
186
190
 
187
191
 
@@ -189,7 +193,7 @@ incorporated into guard-sass.
189
193
 
190
194
  (The MIT License)
191
195
 
192
- Copyright (c) 2010 - 2011 Joshua Hawxwell
196
+ Copyright (c) 2010 - 2012 Joshua Hawxwell
193
197
 
194
198
  Permission is hereby granted, free of charge, to any person obtaining
195
199
  a copy of this software and associated documentation files (the
@@ -216,4 +220,4 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
216
220
  [rpipe]: http://guides.rubyonrails.org/asset_pipeline.html
217
221
  [issues]: http://github.com/hawx/guard-sass/issues
218
222
  [ggroup]: http://groups.google.com/group/guard-dev
219
- [contrib]: http://github.com/hawx/guard-sass/contributors
223
+ [contrib]: http://github.com/hawx/guard-sass/contributors
@@ -2,11 +2,11 @@ require 'sass'
2
2
 
3
3
  module Guard
4
4
  class Sass
5
-
5
+
6
6
  class Runner
7
-
7
+
8
8
  attr_reader :options
9
-
9
+
10
10
  # @param watchers [Array<Guard::Watcher>]
11
11
  # @param options [Hash] See Guard::Sass::DEFAULTS for available options
12
12
  def initialize(watchers, options={})
@@ -14,14 +14,14 @@ module Guard
14
14
  @options = options
15
15
  @formatter = Formatter.new(:hide_success => options[:hide_success])
16
16
  end
17
-
17
+
18
18
  # @param files [Array<String>]
19
19
  # @return [Array<Array,Boolean>]
20
20
  def run(files)
21
21
  changed_files, errors = compile_files(files)
22
22
  [changed_files, errors.empty?]
23
23
  end
24
-
24
+
25
25
  private
26
26
 
27
27
  # @param files [Array<String>] Files to compile
@@ -30,45 +30,46 @@ module Guard
30
30
  def compile_files(files)
31
31
  errors = []
32
32
  changed_files = []
33
-
33
+
34
34
  # Assume partials have been checked for previously, so no partials are included here
35
- files.each do |file|
35
+ files.each do |file|
36
36
  begin
37
37
  css_file = write_file(compile(file), get_output_dir(file), file)
38
38
  message = options[:noop] ? "verified #{file}" : "compiled #{file} to #{css_file}"
39
39
  @formatter.success "-> #{message}", :notification => message
40
40
  changed_files << css_file
41
-
41
+
42
42
  rescue ::Sass::SyntaxError => e
43
43
  message = (options[:noop] ? 'validation' : 'rebuild') + " of #{file} failed"
44
44
  errors << message
45
45
  @formatter.error "Sass > #{e.sass_backtrace_str(file)}", :notification => message
46
46
  end
47
47
  end
48
-
48
+
49
49
  [changed_files.compact, errors]
50
50
  end
51
-
51
+
52
52
  # @param file [String] Path to sass/scss file to compile
53
53
  # @return [String] Compiled css.
54
54
  def compile(file)
55
- content = IO.read(File.join(::Guard.listener.directory, file))
56
-
55
+ content = IO.read(file)
56
+
57
57
  sass_options = {
58
- :syntax => file[-4..-1].to_sym,
59
- :load_paths => options[:load_paths],
60
- :style => options[:style],
61
- :debug_info => options[:debug_info]
58
+ :syntax => file[-4..-1].to_sym,
59
+ :load_paths => options[:load_paths],
60
+ :style => options[:style],
61
+ :debug_info => options[:debug_info],
62
+ :line_numbers => options[:line_numbers]
62
63
  }
63
-
64
+
64
65
  ::Sass::Engine.new(content, sass_options).render
65
66
  end
66
-
67
+
67
68
  # @param file [String]
68
69
  # @return [String] Directory to write +file+ to
69
70
  def get_output_dir(file)
70
71
  folder = options[:output]
71
-
72
+
72
73
  unless options[:shallow]
73
74
  @watchers.product([file]).each do |watcher, file|
74
75
  if matches = file.match(watcher.pattern)
@@ -79,10 +80,10 @@ module Guard
79
80
  end
80
81
  end
81
82
  end
82
-
83
+
83
84
  folder
84
85
  end
85
-
86
+
86
87
  # Write file contents, creating directories where required.
87
88
  #
88
89
  # @param content [String] Contents of the file
@@ -96,10 +97,10 @@ module Guard
96
97
  FileUtils.mkdir_p(dir)
97
98
  File.open(path, 'w') {|f| f.write(content) }
98
99
  end
99
-
100
+
100
101
  path
101
102
  end
102
-
103
+
103
104
  end
104
105
  end
105
- end
106
+ end
@@ -1,5 +1,5 @@
1
1
  module Guard
2
2
  class SassVersion
3
- VERSION = '0.6.0'
3
+ VERSION = '0.7.0'
4
4
  end
5
5
  end
data/lib/guard/sass.rb CHANGED
@@ -1,12 +1,11 @@
1
+ require 'sass/plugin'
2
+
1
3
  require 'guard'
2
4
  require 'guard/guard'
3
5
  require 'guard/watcher'
4
6
 
5
7
  module Guard
6
8
  class Sass < Guard
7
-
8
- autoload :Runner, 'guard/sass/runner'
9
- autoload :Formatter, 'guard/sass/formatter'
10
9
 
11
10
  DEFAULTS = {
12
11
  :all_on_start => false,
@@ -14,22 +13,25 @@ module Guard
14
13
  :extension => '.css',
15
14
  :style => :nested,
16
15
  :shallow => false,
16
+ :line_numbers => false,
17
17
  :debug_info => false,
18
18
  :noop => false,
19
19
  :hide_success => false,
20
- :load_paths => Dir.glob('**/**').find_all {|i| File.directory?(i) }
20
+ :load_paths => ::Sass::Plugin.template_location_array.map(&:first)
21
21
  }
22
22
 
23
23
  # @param watchers [Array<Guard::Watcher>]
24
24
  # @param options [Hash]
25
25
  # @option options [String] :input
26
26
  # The input directory
27
- # @option options [String] :output
27
+ # @option options [String] :output
28
28
  # The output directory
29
29
  # @option options [Array<String>] :load_paths
30
- # List of directories you can @import from
31
- # @option options [Boolean] :shallow
30
+ # List of directories you can @import from
31
+ # @option options [Boolean] :shallow
32
32
  # Whether to output nested directories
33
+ # @option options [Boolean] :line_numbers
34
+ # Whether to output human readable line numbers as comments in the file
33
35
  # @option options [Boolean] :debug_info
34
36
  # Whether to output file and line number info for FireSass
35
37
  # @option options [Boolean] :noop
@@ -39,56 +41,56 @@ module Guard
39
41
  # @option options [Symbol] :style
40
42
  # See http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#output_style
41
43
  def initialize(watchers=[], options={})
44
+ load_paths = options.delete(:load_paths) || []
45
+
42
46
  if options[:input]
47
+ load_paths << options[:input]
43
48
  options[:output] = options[:input] unless options.has_key?(:output)
44
49
  watchers << ::Guard::Watcher.new(%r{^#{ options.delete(:input) }/(.+\.s[ac]ss)$})
45
50
  end
46
-
51
+
47
52
  options = DEFAULTS.merge(options)
53
+ options[:load_paths] += load_paths
54
+
48
55
  @runner = Runner.new(watchers, options)
49
56
  super(watchers, options)
50
57
  end
51
-
52
- def partial?(path)
53
- File.basename(path)[0,1] == "_"
54
- end
55
58
 
56
59
  # If option set to run all on start, run all when started.
60
+ #
61
+ # @raise [:task_has_failed]
57
62
  def start
58
- if options[:all_on_start]
59
- run_all
60
- end
63
+ run_all if options[:all_on_start]
61
64
  end
62
65
 
63
66
  # Build all files being watched
64
67
  #
65
- # @return [Boolean] No errors?
68
+ # @raise [:task_has_failed]
66
69
  def run_all
67
- run_on_change(
68
- Watcher.match_files(
69
- self,
70
- Dir.glob(File.join(::Guard.listener.directory, '**', '*.s[ac]ss')).
71
- map {|f| f[::Guard.listener.directory.size+1..-1] }.
72
- reject {|f| partial?(f) }
73
- )
74
- )
70
+ files = Dir.glob('**/*.s[ac]ss').reject {|f| partial?(f) }
71
+ run_on_changes Watcher.match_files(self, files)
75
72
  end
76
-
73
+
77
74
  # Build the files given. If a 'partial' file is found (begins with '_') calls
78
75
  # {#run_all} as we don't know which other files need to use it.
79
- #
76
+ #
80
77
  # @param paths [Array<String>]
81
- # @return [Boolean] No errors?
82
- def run_on_change(paths)
83
- has_partials = paths.any? {|f| partial?(f) }
84
- return run_all if has_partials
85
-
78
+ # @raise [:task_has_failed]
79
+ def run_on_changes(paths)
80
+ return run_all if paths.any? {|f| partial?(f) }
81
+
86
82
  changed_files, success = @runner.run(paths)
87
-
88
83
  notify changed_files
89
- success
84
+
85
+ throw :task_has_failed unless success
86
+ end
87
+
88
+ # Restore previous behaviour, when a file is removed we don't want to call
89
+ # {#run_on_changes}.
90
+ def run_on_removals(paths)
91
+
90
92
  end
91
-
93
+
92
94
  # Notify other guards about files that have been changed so that other guards can
93
95
  # work on the changed files.
94
96
  #
@@ -100,5 +102,12 @@ module Guard
100
102
  end
101
103
  end
102
104
 
105
+ def partial?(path)
106
+ File.basename(path)[0,1] == "_"
107
+ end
108
+
103
109
  end
104
110
  end
111
+
112
+ require 'guard/sass/runner'
113
+ require 'guard/sass/formatter'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: guard-sass
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-12 00:00:00.000000000 Z
12
+ date: 2012-06-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: guard
16
- requirement: &2157310180 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.4.0
21
+ version: 1.1.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2157310180
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.1.0
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: sass
27
- requirement: &2157309720 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,21 +37,31 @@ dependencies:
32
37
  version: '3.1'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *2157309720
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '3.1'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: bundler
38
- requirement: &2157309260 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
42
52
  - !ruby/object:Gem::Version
43
- version: 1.0.2
53
+ version: '1.0'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *2157309260
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rspec
49
- requirement: &2157308800 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>'
@@ -54,7 +69,12 @@ dependencies:
54
69
  version: 2.0.0.rc
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *2157308800
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>'
76
+ - !ruby/object:Gem::Version
77
+ version: 2.0.0.rc
58
78
  description: Guard::Sass automatically rebuilds sass (like sass --watch)
59
79
  email:
60
80
  - m@hawx.me
@@ -89,9 +109,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
109
  version: 1.3.6
90
110
  requirements: []
91
111
  rubyforge_project: guard-sass
92
- rubygems_version: 1.8.11
112
+ rubygems_version: 1.8.23
93
113
  signing_key:
94
114
  specification_version: 3
95
115
  summary: Guard gem for Sass
96
116
  test_files: []
97
- has_rdoc: