sass 3.2.19 → 3.3.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/CONTRIBUTING +1 -1
  2. data/MIT-LICENSE +2 -2
  3. data/README.md +13 -14
  4. data/REVISION +1 -1
  5. data/Rakefile +4 -6
  6. data/VERSION +1 -1
  7. data/VERSION_DATE +1 -1
  8. data/VERSION_NAME +1 -1
  9. data/bin/sass +1 -6
  10. data/bin/sass-convert +1 -6
  11. data/bin/scss +1 -6
  12. data/lib/sass/cache_stores/base.rb +0 -2
  13. data/lib/sass/cache_stores/chain.rb +1 -1
  14. data/lib/sass/cache_stores/filesystem.rb +3 -6
  15. data/lib/sass/callbacks.rb +1 -1
  16. data/lib/sass/css.rb +1 -1
  17. data/lib/sass/engine.rb +4 -11
  18. data/lib/sass/error.rb +2 -2
  19. data/lib/sass/exec.rb +10 -40
  20. data/lib/sass/importers/filesystem.rb +15 -52
  21. data/lib/sass/logger/log_level.rb +3 -3
  22. data/lib/sass/media.rb +4 -1
  23. data/lib/sass/plugin.rb +1 -2
  24. data/lib/sass/plugin/compiler.rb +18 -40
  25. data/lib/sass/plugin/staleness_checker.rb +5 -21
  26. data/lib/sass/railtie.rb +0 -1
  27. data/lib/sass/script/funcall.rb +8 -62
  28. data/lib/sass/script/functions.rb +457 -557
  29. data/lib/sass/script/lexer.rb +30 -25
  30. data/lib/sass/script/list.rb +1 -2
  31. data/lib/sass/script/literal.rb +18 -0
  32. data/lib/sass/script/null.rb +1 -4
  33. data/lib/sass/script/operation.rb +1 -0
  34. data/lib/sass/script/parser.rb +35 -42
  35. data/lib/sass/script/string.rb +1 -1
  36. data/lib/sass/script/unary_operation.rb +3 -8
  37. data/lib/sass/scss/parser.rb +14 -33
  38. data/lib/sass/scss/rx.rb +10 -3
  39. data/lib/sass/selector.rb +16 -19
  40. data/lib/sass/selector/sequence.rb +7 -16
  41. data/lib/sass/selector/simple.rb +1 -1
  42. data/lib/sass/selector/simple_sequence.rb +15 -25
  43. data/lib/sass/tree/comment_node.rb +2 -2
  44. data/lib/sass/tree/import_node.rb +2 -9
  45. data/lib/sass/tree/visitors/check_nesting.rb +2 -3
  46. data/lib/sass/tree/visitors/convert.rb +4 -9
  47. data/lib/sass/tree/visitors/cssize.rb +15 -36
  48. data/lib/sass/tree/visitors/perform.rb +20 -23
  49. data/lib/sass/tree/visitors/set_options.rb +0 -8
  50. data/lib/sass/tree/visitors/to_css.rb +1 -0
  51. data/lib/sass/util.rb +2 -120
  52. data/lib/sass/util/multibyte_string_scanner.rb +8 -29
  53. data/test/sass/conversion_test.rb +8 -33
  54. data/test/sass/css2sass_test.rb +0 -19
  55. data/test/sass/engine_test.rb +17 -129
  56. data/test/sass/extend_test.rb +24 -169
  57. data/test/sass/functions_test.rb +73 -93
  58. data/test/sass/plugin_test.rb +11 -72
  59. data/test/sass/script_conversion_test.rb +0 -14
  60. data/test/sass/script_test.rb +1 -40
  61. data/test/sass/scss/css_test.rb +3 -44
  62. data/test/sass/scss/scss_test.rb +3 -134
  63. data/test/sass/util_test.rb +0 -93
  64. data/vendor/listen/CHANGELOG.md +2 -83
  65. data/vendor/listen/Gemfile +1 -8
  66. data/vendor/listen/Guardfile +1 -1
  67. data/vendor/listen/LICENSE +1 -1
  68. data/vendor/listen/README.md +5 -8
  69. data/vendor/listen/lib/listen.rb +5 -7
  70. data/vendor/listen/lib/listen/adapter.rb +29 -76
  71. data/vendor/listen/lib/listen/adapters/darwin.rb +10 -11
  72. data/vendor/listen/lib/listen/adapters/linux.rb +30 -33
  73. data/vendor/listen/lib/listen/adapters/polling.rb +1 -2
  74. data/vendor/listen/lib/listen/adapters/windows.rb +21 -27
  75. data/vendor/listen/lib/listen/directory_record.rb +10 -63
  76. data/vendor/listen/lib/listen/listener.rb +0 -22
  77. data/vendor/listen/lib/listen/multi_listener.rb +0 -22
  78. data/vendor/listen/lib/listen/version.rb +1 -1
  79. data/vendor/listen/listen.gemspec +4 -0
  80. data/vendor/listen/spec/listen/adapter_spec.rb +4 -45
  81. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -6
  82. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -6
  83. data/vendor/listen/spec/listen/adapters/windows_spec.rb +1 -7
  84. data/vendor/listen/spec/listen/directory_record_spec.rb +4 -91
  85. data/vendor/listen/spec/listen/listener_spec.rb +0 -14
  86. data/vendor/listen/spec/listen/multi_listener_spec.rb +1 -19
  87. data/vendor/listen/spec/spec_helper.rb +3 -6
  88. data/vendor/listen/spec/support/adapter_helper.rb +212 -125
  89. data/vendor/listen/spec/support/listeners_helper.rb +1 -13
  90. data/vendor/listen/spec/support/platform_helper.rb +0 -4
  91. metadata +113 -105
  92. checksums.yaml +0 -7
  93. data/lib/sass/util/test.rb +0 -10
  94. data/test/sass/exec_test.rb +0 -86
  95. data/test/sass/results/cached_import_option.css +0 -3
  96. data/test/sass/templates/_cached_import_option_partial.scss +0 -1
  97. data/test/sass/templates/_same_name_different_partiality.scss +0 -1
  98. data/test/sass/templates/bork5.sass +0 -3
  99. data/test/sass/templates/cached_import_option.scss +0 -3
  100. data/test/sass/templates/same_name_different_ext.sass +0 -2
  101. data/test/sass/templates/same_name_different_ext.scss +0 -1
  102. data/test/sass/templates/same_name_different_partiality.scss +0 -1
  103. data/test/sass/templates/subdir/import_up1.scss +0 -1
  104. data/test/sass/templates/subdir/import_up2.scss +0 -1
  105. data/vendor/listen/CONTRIBUTING.md +0 -38
  106. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
  107. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  108. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  109. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
@@ -1,3 +1,3 @@
1
1
  Contributions are welcomed. Please see the following sites for guidelines:
2
2
 
3
- http://sass-lang.com/community#Contribute
3
+ http://sass-lang.com/development.html#contributing
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006-2013 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein
1
+ Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein
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
@@ -17,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
17
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
18
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
19
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Sass [![Gem Version](https://badge.fury.io/rb/sass.png)](http://badge.fury.io/rb/sass)
1
+ # Sass
2
2
 
3
3
  **Sass makes CSS fun again**. Sass is an extension of CSS3,
4
4
  adding nested rules, variables, mixins, selector inheritance, and more.
@@ -56,8 +56,8 @@ to `config.ru`.
56
56
  Then any Sass files in `public/stylesheets/sass`
57
57
  will be compiled into CSS files in `public/stylesheets` on every request.
58
58
 
59
- To use Sass programmatically,
60
- check out the [YARD documentation](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#using_sass).
59
+ To use Sass programatically,
60
+ check out the [YARD documentation](http://sass-lang.com/docs/yardoc/).
61
61
 
62
62
  ## Formatting
63
63
 
@@ -71,10 +71,10 @@ and get small stylesheets up and running quickly,
71
71
  particularly with the help of
72
72
  [the Compass style library](http://compass-style.org).
73
73
 
74
- [vars]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#variables_
75
- [nested]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#nested_rules
76
- [mixins]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#mixins
77
- [imports]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#import
74
+ [vars]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variables_
75
+ [nested]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#nested_rules_
76
+ [mixins]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixins
77
+ [imports]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#import
78
78
 
79
79
  Sass has two syntaxes.
80
80
  The one presented here, known as "SCSS" (for "Sassy CSS"),
@@ -83,7 +83,7 @@ The other (older) syntax, known as the indented syntax or just "Sass",
83
83
  is whitespace-sensitive and indentation-based.
84
84
  For more information, see the [reference documentation][syntax].
85
85
 
86
- [syntax]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax
86
+ [syntax]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#syntax
87
87
 
88
88
  To run the following examples and see the CSS they produce,
89
89
  put them in a file called `test.scss` and run `sass test.scss`.
@@ -152,7 +152,7 @@ You can even give them arguments.
152
152
  }
153
153
 
154
154
  A comprehensive list of features is available
155
- in the [Sass reference](http://sass-lang.com/documentation/file.SASS_REFERENCE.html).
155
+ in the [Sass reference](http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html).
156
156
 
157
157
  ## Executables
158
158
 
@@ -173,11 +173,10 @@ See `sass-convert --help` for further information and options.
173
173
 
174
174
  ## Authors
175
175
 
176
- Sass was envisioned by [Hampton Catlin](http://www.hamptoncatlin.com)
177
- (@hcatlin). However, Hampton doesn't even know his way around the code anymore
178
- and now occasionally consults on the language issues. Hampton lives in San
179
- Francisco, California and works as VP of Technology
180
- at [Moovweb](http://www.moovweb.com/).
176
+ Sass was envisioned by [Hampton Catlin](http://hamptoncatlin.com) (hcatlin).
177
+ However, Hampton doesn't even know his way around the code anymore and now
178
+ occasionally consults on the language issues. Hampton lives in Cambridge, UK and
179
+ is the owner of [Catlin Software](http://www.catlinsoftware.com/).
181
180
 
182
181
  [Nathan Weizenbaum](http://nex-3.com) is the primary developer and architect of
183
182
  Sass. His hard work has kept the project alive by endlessly answering forum
data/REVISION CHANGED
@@ -1 +1 @@
1
- (release)
1
+ ec80ec8b58b347b4890c8c47a4cb2a6fcfd77406
data/Rakefile CHANGED
@@ -1,5 +1,3 @@
1
- require 'rubygems/package'
2
-
3
1
  # ----- Utility Functions -----
4
2
 
5
3
  def scope(path)
@@ -30,7 +28,7 @@ task :package => [:revision_file, :date_file, :submodules, :permissions] do
30
28
  version = get_version
31
29
  File.open(scope('VERSION'), 'w') {|f| f.puts(version)}
32
30
  load scope('sass.gemspec')
33
- Gem::Package.build(SASS_GEMSPEC)
31
+ Gem::Builder.new(SASS_GEMSPEC).build
34
32
  sh %{git checkout VERSION}
35
33
 
36
34
  pkg = "#{SASS_GEMSPEC.name}-#{SASS_GEMSPEC.version}"
@@ -87,8 +85,8 @@ desc "Release a new Sass package to Rubyforge."
87
85
  task :release => [:check_release, :package] do
88
86
  name = File.read(scope("VERSION_NAME")).strip
89
87
  version = File.read(scope("VERSION")).strip
90
- # sh %{rubyforge add_release sass sass "#{name} (v#{version})" pkg/sass-#{version}.gem}
91
- # sh %{rubyforge add_file sass sass "#{name} (v#{version})" pkg/sass-#{version}.tar.gz}
88
+ sh %{rubyforge add_release sass sass "#{name} (v#{version})" pkg/sass-#{version}.gem}
89
+ sh %{rubyforge add_file sass sass "#{name} (v#{version})" pkg/sass-#{version}.tar.gz}
92
90
  sh %{gem push pkg/sass-#{version}.gem}
93
91
  end
94
92
 
@@ -142,7 +140,7 @@ task :release_edge do
142
140
  sh %{git reset --hard origin/master}
143
141
  sh %{rake package}
144
142
  version = get_version
145
- # sh %{rubyforge add_release sass sass "Bleeding Edge (v#{version})" pkg/sass-#{version}.gem}
143
+ sh %{rubyforge add_release sass sass "Bleeding Edge (v#{version})" pkg/sass-#{version}.gem}
146
144
  sh %{gem push pkg/sass-#{version}.gem}
147
145
  end
148
146
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.2.19
1
+ 3.3.0.alpha.1
@@ -1 +1 @@
1
- 05 April 2014 19:55:56 UTC
1
+ 11 August 2012 01:22:07 GMT
@@ -1 +1 @@
1
- Media Mark
1
+ Bleeding Edge
data/bin/sass CHANGED
@@ -1,12 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # The command line Sass parser.
3
3
 
4
- THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
5
- begin
6
- require File.dirname(THIS_FILE) + '/../lib/sass'
7
- rescue LoadError
8
- require 'sass'
9
- end
4
+ require File.dirname(__FILE__) + '/../lib/sass'
10
5
  require 'sass/exec'
11
6
 
12
7
  opts = Sass::Exec::Sass.new(ARGV)
@@ -1,11 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
4
- begin
5
- require File.dirname(THIS_FILE) + '/../lib/sass'
6
- rescue LoadError
7
- require 'sass'
8
- end
3
+ require File.dirname(__FILE__) + '/../lib/sass'
9
4
  require 'sass/exec'
10
5
 
11
6
  opts = Sass::Exec::SassConvert.new(ARGV)
data/bin/scss CHANGED
@@ -1,12 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # The command line Sass parser.
3
3
 
4
- THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
5
- begin
6
- require File.dirname(THIS_FILE) + '/../lib/sass'
7
- rescue LoadError
8
- require 'sass'
9
- end
4
+ require File.dirname(__FILE__) + '/../lib/sass'
10
5
  require 'sass/exec'
11
6
 
12
7
  opts = Sass::Exec::Scss.new(ARGV)
@@ -51,7 +51,6 @@ module Sass
51
51
  _store(key, Sass::VERSION, sha, Marshal.dump(root))
52
52
  rescue TypeError, LoadError => e
53
53
  Sass::Util.sass_warn "Warning. Error encountered while saving cache #{path_to(key)}: #{e}"
54
- nil
55
54
  end
56
55
 
57
56
  # Retrieve a {Sass::Tree::RootNode}.
@@ -64,7 +63,6 @@ module Sass
64
63
  Marshal.load(contents) if contents
65
64
  rescue EOFError, TypeError, ArgumentError, LoadError => e
66
65
  Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
67
- nil
68
66
  end
69
67
 
70
68
  # Return the key for the sass file.
@@ -23,7 +23,7 @@ module Sass
23
23
  def retrieve(key, sha)
24
24
  @caches.each_with_index do |c, i|
25
25
  next unless obj = c.retrieve(key, sha)
26
- @caches[0...i].each {|prev| prev.store(key, sha, obj)}
26
+ @caches[0...i].each {|c| c.store(key, sha, obj)}
27
27
  return obj
28
28
  end
29
29
  nil
@@ -17,16 +17,13 @@ module Sass
17
17
  # @see Base#\_retrieve
18
18
  def _retrieve(key, version, sha)
19
19
  return unless File.readable?(path_to(key))
20
+ contents = nil
20
21
  File.open(path_to(key), "rb") do |f|
21
22
  if f.readline("\n").strip == version && f.readline("\n").strip == sha
22
23
  return f.read
23
24
  end
24
25
  end
25
- begin
26
- File.unlink path_to(key)
27
- rescue Errno::ENOENT
28
- # Already deleted. Race condition?
29
- end
26
+ File.unlink path_to(key)
30
27
  nil
31
28
  rescue EOFError, TypeError, ArgumentError => e
32
29
  Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
@@ -40,7 +37,7 @@ module Sass
40
37
  # return if File.exists?(File.dirname(compiled_filename)) && !File.writable?(File.dirname(compiled_filename))
41
38
  # return if File.exists?(compiled_filename) && !File.writable?(compiled_filename)
42
39
  FileUtils.mkdir_p(File.dirname(compiled_filename))
43
- Sass::Util.atomic_create_and_write_file(compiled_filename, 0600) do |f|
40
+ File.open(compiled_filename, "wb") do |f|
44
41
  f.puts(version)
45
42
  f.puts(sha)
46
43
  f.write(contents)
@@ -48,7 +48,7 @@ module Sass
48
48
  # @param name [Symbol] The name of the callback
49
49
  # @return [void]
50
50
  def define_callback(name)
51
- class_eval <<RUBY, __FILE__, __LINE__ + 1
51
+ class_eval <<RUBY
52
52
  def on_#{name}(&block)
53
53
  @_sass_callbacks ||= {}
54
54
  (@_sass_callbacks[#{name.inspect}] ||= []) << block
@@ -293,7 +293,7 @@ module Sass
293
293
  def bubble_subject(root)
294
294
  root.children.each do |child|
295
295
  bubble_subject(child) if child.is_a?(Tree::RuleNode) || child.is_a?(Tree::DirectiveNode)
296
- next unless child.is_a?(Tree::RuleNode) && !child.children.empty?
296
+ next unless child.is_a?(Tree::RuleNode)
297
297
  next unless child.children.all? do |c|
298
298
  next unless c.is_a?(Tree::RuleNode)
299
299
  first_simple_sel(c).is_a?(Sass::Selector::Parent) && first_sseq(c).subject?
@@ -293,7 +293,7 @@ module Sass
293
293
  # @return [[Sass::Engine]] The dependency documents.
294
294
  def dependencies
295
295
  _dependencies(Set.new, engines = Set.new)
296
- Sass::Util.array_minus(engines, [self])
296
+ engines - [self]
297
297
  end
298
298
 
299
299
  # Helper for \{#dependencies}.
@@ -379,7 +379,7 @@ module Sass
379
379
  comment_tab_str = nil
380
380
  first = true
381
381
  lines = []
382
- string.gsub(/\r\n|\r|\n/, "\n").scan(/^[^\n]*?$/).each_with_index do |line, index|
382
+ string.gsub(/\r|\n|\r\n|\r\n/, "\n").scan(/^[^\n]*?$/).each_with_index do |line, index|
383
383
  index += (@options[:line] || 1)
384
384
  if line.strip.empty?
385
385
  lines.last.text << "\n" if lines.last && lines.last.comment?
@@ -637,6 +637,7 @@ WARNING
637
637
  value = [line.text]
638
638
  else
639
639
  value = self.class.parse_interp(line.text, line.index, line.offset, :filename => @filename)
640
+ value[0].slice!(2) if loud # get rid of the "!"
640
641
  end
641
642
  value = with_extracted_values(value) do |str|
642
643
  str = str.gsub(/^#{line.comment_tab_str}/m, '')[2..-1] # get rid of // or /*
@@ -712,15 +713,7 @@ WARNING
712
713
  when 'media'
713
714
  parser = Sass::SCSS::Parser.new(value, @options[:filename], @line)
714
715
  Tree::MediaNode.new(parser.parse_media_query_list.to_a)
715
- when nil
716
- raise SyntaxError.new("Invalid directive: '@'.")
717
716
  else
718
- unprefixed_directive = directive.gsub(/^-[a-z0-9]+-/i, '')
719
- if unprefixed_directive == 'supports'
720
- parser = Sass::SCSS::Parser.new(value, @options[:filename], @line)
721
- return Tree::SupportsNode.new(directive, parser.parse_supports_condition)
722
- end
723
-
724
717
  Tree::DirectiveNode.new(
725
718
  value.nil? ? ["@#{directive}"] : ["@#{directive} "] + parse_interp(value, offset))
726
719
  end
@@ -827,7 +820,7 @@ WARNING
827
820
  media_parser = Sass::SCSS::Parser.new(scanner, @options[:filename], @line)
828
821
  media = media_parser.parse_media_query_list
829
822
  Tree::CssImportNode.new(str || uri, media.to_a)
830
- elsif val =~ /^(https?:)?\/\//
823
+ elsif val =~ /^http:\/\//
831
824
  Tree::CssImportNode.new("url(#{val})")
832
825
  else
833
826
  Tree::ImportNode.new(val)
@@ -165,9 +165,9 @@ module Sass
165
165
 
166
166
  <<END
167
167
  /*
168
- #{header.gsub("*/", "*\\/")}
168
+ #{header}
169
169
 
170
- Backtrace:\n#{e.backtrace.join("\n").gsub("*/", "*\\/")}
170
+ Backtrace:\n#{e.backtrace.join("\n")}
171
171
  */
172
172
  body:before {
173
173
  white-space: pre;
@@ -108,7 +108,7 @@ module Sass
108
108
  @options[:filename] = filename
109
109
  open_file(filename) || $stdin
110
110
  end
111
- output ||= args.shift || $stdout
111
+ output ||= open_file(args.shift, 'w') || $stdout
112
112
 
113
113
  @options[:input], @options[:output] = input, output
114
114
  end
@@ -125,7 +125,6 @@ module Sass
125
125
  def puts_action(name, color, arg)
126
126
  return if @options[:for_engine][:quiet]
127
127
  printf color(color, "%11s %s\n"), name, arg
128
- STDOUT.flush
129
128
  end
130
129
 
131
130
  # Same as \{Kernel.puts}, but doesn't print anything if the `--quiet` option is set.
@@ -155,23 +154,12 @@ module Sass
155
154
  return "\e[#{COLORS[color]}m#{str}\e[0m"
156
155
  end
157
156
 
158
- def write_output(text, destination)
159
- if destination.is_a?(String)
160
- open_file(destination, 'w') {|file| file.write(text)}
161
- else
162
- destination.write(text)
163
- end
164
- end
165
-
166
157
  private
167
158
 
168
159
  def open_file(filename, flag = 'r')
169
160
  return if filename.nil?
170
161
  flag = 'wb' if @options[:unix_newlines] && flag == 'w'
171
- file = File.open(filename, flag)
172
- return file unless block_given?
173
- yield file
174
- file.close
162
+ File.open(filename, flag)
175
163
  end
176
164
 
177
165
  def handle_load_error(err)
@@ -241,10 +229,6 @@ END
241
229
  'Only meaningful for --watch and --update.') do
242
230
  @options[:stop_on_error] = true
243
231
  end
244
- opts.on('--poll', 'Check for file changes manually, rather than relying on the OS.',
245
- 'Only meaningful for --watch.') do
246
- @options[:poll] = true
247
- end
248
232
  opts.on('-f', '--force', 'Recompile all Sass files, even if the CSS file is newer.',
249
233
  'Only meaningful for --update.') do
250
234
  @options[:force] = true
@@ -293,16 +277,8 @@ END
293
277
  @options[:for_engine][:cache] = false
294
278
  end
295
279
 
296
- encoding_desc = if ::Sass::Util.ruby1_8?
297
- 'Does not work in ruby 1.8.'
298
- else
299
- 'Specify the default encoding for Sass files.'
300
- end
301
- opts.on('-E encoding', encoding_desc) do |encoding|
302
- if ::Sass::Util.ruby1_8?
303
- $stderr.puts "Specifying the encoding is not supported in ruby 1.8."
304
- exit 1
305
- else
280
+ unless ::Sass::Util.ruby1_8?
281
+ opts.on('-E encoding', 'Specify the default encoding for Sass files.') do |encoding|
306
282
  Encoding.default_external = encoding
307
283
  end
308
284
  end
@@ -326,7 +302,6 @@ END
326
302
  return watch_or_update if @options[:watch] || @options[:update]
327
303
  super
328
304
  @options[:for_engine][:filename] = @options[:filename]
329
- @options[:for_engine][:css_filename] = @options[:output] if @options[:output].is_a?(String)
330
305
 
331
306
  begin
332
307
  input = @options[:input]
@@ -346,7 +321,8 @@ END
346
321
 
347
322
  input.close() if input.is_a?(File)
348
323
 
349
- write_output(engine.render, output)
324
+ output.write(engine.render)
325
+ output.close() if output.is_a? File
350
326
  rescue ::Sass::SyntaxError => e
351
327
  raise e if @options[:trace]
352
328
  raise e.sass_backtrace_str("standard input")
@@ -381,7 +357,6 @@ END
381
357
  require 'sass/plugin'
382
358
  ::Sass::Plugin.options.merge! @options[:for_engine]
383
359
  ::Sass::Plugin.options[:unix_newlines] = @options[:unix_newlines]
384
- ::Sass::Plugin.options[:poll] = @options[:poll]
385
360
 
386
361
  if @options[:force]
387
362
  raise "The --force flag may only be used with --update." unless @options[:update]
@@ -426,13 +401,6 @@ MSG
426
401
  ::Sass::Plugin.on_creating_directory {|dirname| puts_action :directory, :green, dirname}
427
402
  ::Sass::Plugin.on_deleting_css {|filename| puts_action :delete, :yellow, filename}
428
403
  ::Sass::Plugin.on_compilation_error do |error, _, _|
429
- if error.is_a?(SystemCallError) && !@options[:stop_on_error]
430
- had_error = true
431
- puts_action :error, :red, error.message
432
- STDOUT.flush
433
- next
434
- end
435
-
436
404
  raise error unless error.is_a?(::Sass::SyntaxError) && !@options[:stop_on_error]
437
405
  had_error = true
438
406
  puts_action :error, :red, "#{error.sass_filename} (Line #{error.sass_line}: #{error.message})"
@@ -620,6 +588,7 @@ END
620
588
  end
621
589
  @options[:output] ||= @options[:input]
622
590
 
591
+ from = @options[:from]
623
592
  if @options[:to] == @options[:from] && !@options[:in_place]
624
593
  fmt = @options[:from]
625
594
  raise "Error: converting from #{fmt} to #{fmt} without --in-place"
@@ -650,6 +619,7 @@ END
650
619
  end
651
620
 
652
621
  input = open_file(f)
622
+ output = @options[:in_place] ? input : open_file(output, "w")
653
623
  process_file(input, output)
654
624
  end
655
625
  end
@@ -693,8 +663,8 @@ END
693
663
  end
694
664
  end
695
665
 
696
- output = input.path if @options[:in_place]
697
- write_output(out, output)
666
+ output = File.open(input.path, 'w') if @options[:in_place]
667
+ output.write(out)
698
668
  rescue ::Sass::SyntaxError => e
699
669
  raise e if @options[:trace]
700
670
  file = " of #{e.sass_filename}" if e.sass_filename
@@ -1,5 +1,4 @@
1
1
  require 'pathname'
2
- require 'set'
3
2
 
4
3
  module Sass
5
4
  module Importers
@@ -15,7 +14,6 @@ module Sass
15
14
  # This importer will import files relative to this path.
16
15
  def initialize(root)
17
16
  @root = File.expand_path(root)
18
- @same_name_warnings = Set.new
19
17
  end
20
18
 
21
19
  # @see Base#find_relative
@@ -30,7 +28,7 @@ module Sass
30
28
 
31
29
  # @see Base#mtime
32
30
  def mtime(name, options)
33
- file, _ = Sass::Util.destructure(find_real_file(@root, name, options))
31
+ file, s = find_real_file(@root, name)
34
32
  File.mtime(file) if file
35
33
  rescue Errno::ENOENT
36
34
  nil
@@ -91,14 +89,8 @@ module Sass
91
89
  sorted_exts = extensions.sort
92
90
  syntax = extensions[extname]
93
91
 
94
- if syntax
95
- ret = [["#{dirname}/{_,}#{basename}.#{extensions.invert[syntax]}", syntax]]
96
- else
97
- ret = sorted_exts.map {|ext, syn| ["#{dirname}/{_,}#{basename}.#{ext}", syn]}
98
- end
99
-
100
- # JRuby chokes when trying to import files from JARs when the path starts with './'.
101
- ret.map {|f, s| [f.sub(%r{^\./}, ''), s]}
92
+ return [["#{dirname}/{_,}#{basename}.#{extensions.invert[syntax]}", syntax]] if syntax
93
+ sorted_exts.map {|ext, syn| ["#{dirname}/{_,}#{basename}.#{ext}", syn]}
102
94
  end
103
95
 
104
96
  def escape_glob_characters(name)
@@ -114,48 +106,15 @@ module Sass
114
106
  # @param dir [String] The directory relative to which to search.
115
107
  # @param name [String] The filename to search for.
116
108
  # @return [(String, Symbol)] A filename-syntax pair.
117
- def find_real_file(dir, name, options)
118
- # on windows 'dir' can be in native File::ALT_SEPARATOR form
119
- dir = dir.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless File::ALT_SEPARATOR.nil?
120
-
121
- found = possible_files(remove_root(name)).map do |f, s|
122
- path = (dir == "." || Pathname.new(f).absolute?) ? f : "#{escape_glob_characters(dir)}/#{f}"
123
- Dir[path].map do |full_path|
124
- full_path.gsub!(REDUNDANT_DIRECTORY, File::SEPARATOR)
125
- [Pathname.new(full_path).cleanpath.to_s, s]
126
- end
127
- end
128
- found = Sass::Util.flatten(found, 1)
129
- return if found.empty?
130
-
131
- if found.size > 1 && !@same_name_warnings.include?(found.first.first)
132
- found.each {|(f, _)| @same_name_warnings << f}
133
- relative_to = Pathname.new(dir)
134
- if options[:_line]
135
- # If _line exists, we're here due to an actual import in an
136
- # import_node and we want to print a warning for a user writing an
137
- # ambiguous import.
138
- candidates = found.map {|(f, _)| " " + Pathname.new(f).relative_path_from(relative_to).to_s}.join("\n")
139
- Sass::Util.sass_warn <<WARNING
140
- WARNING: On line #{options[:_line]}#{" of #{options[:filename]}" if options[:filename]}:
141
- It's not clear which file to import for '@import "#{name}"'.
142
- Candidates:
143
- #{candidates}
144
- For now I'll choose #{File.basename found.first.first}.
145
- This will be an error in future versions of Sass.
146
- WARNING
147
- else
148
- # Otherwise, we're here via StalenessChecker, and we want to print a
149
- # warning for a user running `sass --watch` with two ambiguous files.
150
- candidates = found.map {|(f, _)| " " + File.basename(f)}.join("\n")
151
- Sass::Util.sass_warn <<WARNING
152
- WARNING: In #{File.dirname(name)}:
153
- There are multiple files that match the name "#{File.basename(name)}":
154
- #{candidates}
155
- WARNING
109
+ def find_real_file(dir, name)
110
+ for (f,s) in possible_files(remove_root(name))
111
+ path = (dir == "." || Pathname.new(f).absolute?) ? f : "#{dir}/#{f}"
112
+ if full_path = Dir[path].first
113
+ full_path.gsub!(REDUNDANT_DIRECTORY,File::SEPARATOR)
114
+ return full_path, s
156
115
  end
157
116
  end
158
- found.first
117
+ nil
159
118
  end
160
119
 
161
120
  # Splits a filename into three parts, a directory part, a basename, and an extension
@@ -173,7 +132,7 @@ WARNING
173
132
  private
174
133
 
175
134
  def _find(dir, name, options)
176
- full_filename, syntax = Sass::Util.destructure(find_real_file(dir, name, options))
135
+ full_filename, syntax = find_real_file(dir, name)
177
136
  return unless full_filename && File.readable?(full_filename)
178
137
 
179
138
  options[:syntax] = syntax
@@ -181,6 +140,10 @@ WARNING
181
140
  options[:importer] = self
182
141
  Sass::Engine.new(File.read(full_filename), options)
183
142
  end
143
+
144
+ def join(base, path)
145
+ Pathname.new(base).join(path).to_s
146
+ end
184
147
  end
185
148
  end
186
149
  end