compass 0.11.2 → 0.11.3

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 (67) hide show
  1. data/VERSION.yml +1 -1
  2. data/features/command_line.feature +22 -1
  3. data/features/step_definitions/command_line_steps.rb +21 -1
  4. data/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss +1 -0
  5. data/frameworks/compass/stylesheets/compass/css3/_box.scss +9 -9
  6. data/frameworks/compass/stylesheets/compass/css3/_font-face.scss +4 -14
  7. data/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss +14 -1
  8. data/lib/compass.rbc +87 -11
  9. data/lib/compass/actions.rb +21 -9
  10. data/lib/compass/actions.rbc +453 -210
  11. data/lib/compass/commands.rb +1 -1
  12. data/lib/compass/commands/clean_project.rb +79 -0
  13. data/lib/compass/commands/registry.rb +3 -1
  14. data/lib/compass/commands/sprite.rb +1 -1
  15. data/lib/compass/commands/update_project.rb +5 -6
  16. data/lib/compass/commands/watch_project.rb +1 -1
  17. data/lib/compass/compiler.rb +12 -9
  18. data/lib/compass/compiler.rbc +386 -294
  19. data/lib/compass/configuration/adapters.rb +2 -2
  20. data/lib/compass/configuration/adapters.rbc +4 -4
  21. data/lib/compass/configuration/data.rb +4 -2
  22. data/lib/compass/exec/sub_command_ui.rb +1 -1
  23. data/lib/compass/sass_extensions.rbc +117 -19
  24. data/lib/compass/sass_extensions/functions/gradient_support.rbc +489 -453
  25. data/lib/compass/sass_extensions/functions/sprites.rb +4 -4
  26. data/lib/compass/sass_extensions/functions/sprites.rbc +588 -309
  27. data/lib/compass/sass_extensions/functions/urls.rb +18 -3
  28. data/lib/compass/sass_extensions/sprites.rb +9 -7
  29. data/lib/compass/sass_extensions/sprites.rbc +48 -64
  30. data/lib/compass/sass_extensions/sprites/engines.rb +24 -0
  31. data/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb +13 -7
  32. data/lib/compass/sass_extensions/sprites/image_methods.rb +32 -0
  33. data/lib/compass/sass_extensions/sprites/sprite_map.rb +54 -142
  34. data/lib/compass/sass_extensions/sprites/sprite_map.rbc +3839 -1536
  35. data/lib/compass/sass_extensions/sprites/{base.rb → sprite_methods.rb} +21 -101
  36. data/lib/compass/sprite_importer.rb +202 -0
  37. data/lib/compass/sprite_importer.rbc +3943 -0
  38. data/lib/compass/validator.rb +11 -4
  39. data/lib/compass/version.rbc +67 -109
  40. data/test/fixtures/sprites/public/images/bad_extensions/ten-by-ten.gif +0 -0
  41. data/test/fixtures/sprites/public/images/bad_extensions/twenty-by-twenty.jpg +0 -0
  42. data/test/fixtures/stylesheets/busted_image_urls/config.rb +29 -0
  43. data/test/fixtures/stylesheets/busted_image_urls/css/screen.css +9 -0
  44. data/test/fixtures/stylesheets/busted_image_urls/images/feed.png +0 -0
  45. data/test/fixtures/stylesheets/busted_image_urls/images/flags/dk.png +0 -0
  46. data/test/fixtures/stylesheets/busted_image_urls/images/grid.png +0 -0
  47. data/test/fixtures/stylesheets/busted_image_urls/sass/screen.sass +14 -0
  48. data/test/fixtures/stylesheets/busted_image_urls/tmp/screen.css +9 -0
  49. data/test/fixtures/stylesheets/compass/css/box.css +19 -0
  50. data/test/fixtures/stylesheets/compass/css/legacy_clearfix.css +9 -0
  51. data/test/fixtures/stylesheets/compass/css/sprites.css +1 -1
  52. data/test/fixtures/stylesheets/compass/css/utilities.css +7 -0
  53. data/test/fixtures/stylesheets/compass/images/{flag-03c3b29b35.png → flag-s03c3b29b35.png} +0 -0
  54. data/test/fixtures/stylesheets/compass/sass/legacy_clearfix.scss +3 -0
  55. data/test/fixtures/stylesheets/compass/sass/utilities.scss +4 -1
  56. data/test/fixtures/stylesheets/error/config.rb +10 -0
  57. data/test/fixtures/stylesheets/error/sass/screen.sass +2 -0
  58. data/test/integrations/compass_test.rb +22 -9
  59. data/test/integrations/sprites_test.rb +45 -45
  60. data/test/units/actions_test.rb +24 -0
  61. data/test/units/sprites/engine_test.rb +43 -0
  62. data/test/units/sprites/image_test.rb +2 -2
  63. data/test/units/sprites/importer_test.rb +66 -0
  64. data/test/units/sprites/sprite_command_test.rb +60 -0
  65. data/test/units/sprites/{base_test.rb → sprite_map_test.rb} +5 -5
  66. metadata +43 -34
  67. data/lib/compass/sass_extensions/sprites/sprites.rb +0 -62
@@ -91,9 +91,7 @@ module Compass::SassExtensions::Functions::Urls
91
91
  if cache_buster.is_a?(Sass::Script::String)
92
92
  path += "?#{cache_buster.value}"
93
93
  else
94
- if buster = compute_cache_buster(path, real_path)
95
- path += "?#{buster}"
96
- end
94
+ path = cache_busted_path(path, real_path)
97
95
  end
98
96
  end
99
97
 
@@ -137,6 +135,23 @@ module Compass::SassExtensions::Functions::Urls
137
135
  end
138
136
  end
139
137
 
138
+ def cache_busted_path(path, real_path)
139
+ cache_buster = compute_cache_buster(path, real_path)
140
+ if cache_buster.nil?
141
+ return path
142
+ elsif cache_buster.is_a?(String)
143
+ cache_buster = {:query => cache_buster}
144
+ else
145
+ path = cache_buster[:path] if cache_buster[:path]
146
+ end
147
+
148
+ if cache_buster[:query]
149
+ "%s?%s" % [path, cache_buster[:query]]
150
+ else
151
+ path
152
+ end
153
+ end
154
+
140
155
  def compute_cache_buster(path, real_path)
141
156
  if Compass.configuration.asset_cache_buster
142
157
  args = [path]
@@ -1,14 +1,16 @@
1
1
  require 'digest/md5'
2
- require 'compass/sass_extensions/sprites/sprites'
3
- require 'compass/sass_extensions/sprites/sprite_map'
4
- require 'compass/sass_extensions/sprites/image'
5
- require 'compass/sass_extensions/sprites/base'
6
- require 'compass/sass_extensions/sprites/engines'
2
+ require 'compass/sprite_importer'
7
3
 
8
4
  module Compass
9
5
  module SassExtensions
10
6
  module Sprites
11
-
12
7
  end
13
8
  end
14
- end
9
+ end
10
+
11
+ require 'compass/sass_extensions/sprites/image'
12
+ require 'compass/sass_extensions/sprites/sprite_methods'
13
+ require 'compass/sass_extensions/sprites/image_methods'
14
+ require 'compass/sass_extensions/sprites/sprite_map'
15
+ require 'compass/sass_extensions/sprites/engines'
16
+
@@ -9,7 +9,7 @@ x
9
9
  10
10
10
  __script__
11
11
  i
12
- 82
12
+ 73
13
13
  5
14
14
  7
15
15
  0
@@ -28,27 +28,35 @@ i
28
28
  1
29
29
  1
30
30
  15
31
- 5
31
+ 99
32
32
  7
33
33
  3
34
- 64
35
- 47
34
+ 65
36
35
  49
37
- 1
38
- 1
39
- 15
36
+ 4
37
+ 2
38
+ 13
39
+ 99
40
+ 12
41
+ 7
40
42
  5
43
+ 12
44
+ 7
45
+ 6
46
+ 12
47
+ 65
48
+ 12
49
+ 49
41
50
  7
42
51
  4
43
- 64
44
- 47
52
+ 15
45
53
  49
46
- 1
47
- 1
54
+ 5
55
+ 0
48
56
  15
49
57
  5
50
58
  7
51
- 5
59
+ 8
52
60
  64
53
61
  47
54
62
  49
@@ -57,38 +65,21 @@ i
57
65
  15
58
66
  5
59
67
  7
60
- 6
68
+ 9
61
69
  64
62
70
  47
63
71
  49
64
72
  1
65
73
  1
66
74
  15
67
- 99
68
- 7
69
- 7
70
- 65
71
- 49
72
- 8
73
- 2
74
- 13
75
- 99
76
- 12
77
- 7
78
- 9
79
- 12
75
+ 5
80
76
  7
81
77
  10
82
- 12
83
- 65
84
- 12
85
- 49
86
- 11
87
- 4
88
- 15
78
+ 64
79
+ 47
89
80
  49
90
- 9
91
- 0
81
+ 1
82
+ 1
92
83
  15
93
84
  2
94
85
  11
@@ -102,7 +93,7 @@ I
102
93
  0
103
94
  n
104
95
  p
105
- 12
96
+ 11
106
97
  s
107
98
  10
108
99
  digest/md5
@@ -110,20 +101,8 @@ x
110
101
  7
111
102
  require
112
103
  s
113
- 39
114
- compass/sass_extensions/sprites/sprites
115
- s
116
- 42
117
- compass/sass_extensions/sprites/sprite_map
118
- s
119
- 37
120
- compass/sass_extensions/sprites/image
121
- s
122
- 36
123
- compass/sass_extensions/sprites/base
124
- s
125
- 39
126
- compass/sass_extensions/sprites/engines
104
+ 23
105
+ compass/sprite_importer
127
106
  x
128
107
  7
129
108
  Compass
@@ -233,7 +212,7 @@ p
233
212
  I
234
213
  2
235
214
  I
236
- a
215
+ 6
237
216
  I
238
217
  c
239
218
  x
@@ -249,7 +228,7 @@ p
249
228
  I
250
229
  2
251
230
  I
252
- 9
231
+ 5
253
232
  I
254
233
  1c
255
234
  x
@@ -260,8 +239,17 @@ p
260
239
  x
261
240
  13
262
241
  attach_method
242
+ s
243
+ 37
244
+ compass/sass_extensions/sprites/image
245
+ s
246
+ 42
247
+ compass/sass_extensions/sprites/sprite_map
248
+ s
249
+ 39
250
+ compass/sass_extensions/sprites/engines
263
251
  p
264
- 15
252
+ 13
265
253
  I
266
254
  0
267
255
  I
@@ -273,25 +261,21 @@ I
273
261
  I
274
262
  12
275
263
  I
276
- 3
277
- I
278
- 1b
279
- I
280
264
  4
281
265
  I
282
- 24
266
+ 2c
283
267
  I
284
- 5
268
+ b
285
269
  I
286
- 2d
270
+ 35
287
271
  I
288
- 6
272
+ c
289
273
  I
290
- 36
274
+ 3e
291
275
  I
292
- 8
276
+ d
293
277
  I
294
- 52
278
+ 49
295
279
  x
296
280
  68
297
281
  /Users/chris/Projects/compass/lib/compass/sass_extensions/sprites.rb
@@ -1 +1,25 @@
1
+ module Compass
2
+ module SassExtensions
3
+ module Sprites
4
+ class Engine
5
+ attr_accessor :width, :height, :images, :canvas
6
+ def initialize(width, height, images)
7
+ @width, @height, @images = width, height, images
8
+ @canvas = nil
9
+ end
10
+
11
+ def construct_sprite
12
+ raise ::Compass::Error, "You must impliment construct_sprite"
13
+ end
14
+
15
+ def save(filename)
16
+ raise ::Compass::Error, "You must impliment save(filename)"
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+
1
25
  require 'compass/sass_extensions/sprites/engines/chunky_png_engine'
@@ -7,20 +7,19 @@ end
7
7
  module Compass
8
8
  module SassExtensions
9
9
  module Sprites
10
- module ChunkyPngEngine
11
-
12
- # Returns a PNG object
10
+ class ChunkyPngEngine < Compass::SassExtensions::Sprites::Engine
11
+
13
12
  def construct_sprite
14
- output_png = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
13
+ @canvas = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
15
14
  images.each do |image|
16
15
  input_png = ChunkyPNG::Image.from_file(image.file)
17
16
  if image.repeat == "no-repeat"
18
- output_png.replace! input_png, image.left, image.top
17
+ canvas.replace! input_png, image.left, image.top
19
18
  else
20
19
  x = image.left - (image.left / image.width).ceil * image.width
21
20
  while x < width do
22
21
  begin
23
- output_png.replace! input_png, x, image.top
22
+ canvas.replace! input_png, x, image.top
24
23
  x += image.width
25
24
  rescue ChunkyPNG::OutOfBounds
26
25
  break;
@@ -28,8 +27,15 @@ module Compass
28
27
  end
29
28
  end
30
29
  end
31
- output_png
30
+ end
31
+
32
+ def save(filename)
33
+ if canvas.nil?
34
+ construct_sprite
35
+ end
36
+ canvas.save(filename, :best_compression)
32
37
  end
38
+
33
39
  end
34
40
  end
35
41
  end
@@ -0,0 +1,32 @@
1
+ module Compass
2
+ module SassExtensions
3
+ module Sprites
4
+ module ImageMethods
5
+ # Fetches the Sprite::Image object for the supplied name
6
+ def image_for(name)
7
+ @images.detect { |img| img.name == name}
8
+ end
9
+
10
+ # Returns true if the image name has a hover selector image
11
+ def has_hover?(name)
12
+ !image_for("#{name}_hover").nil?
13
+ end
14
+
15
+ # Returns true if the image name has a target selector image
16
+ def has_target?(name)
17
+ !image_for("#{name}_target").nil?
18
+ end
19
+
20
+ # Returns true if the image name has an active selector image
21
+ def has_active?(name)
22
+ !image_for("#{name}_active").nil?
23
+ end
24
+
25
+ # Return and array of image names that make up this sprite
26
+ def sprite_names
27
+ image_names.map { |f| File.basename(f, '.png') }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,154 +1,66 @@
1
1
  module Compass
2
- class SpriteMap
3
- attr_reader :uri, :options
4
- VAILD_FILE_NAME = /\A#{Sass::SCSS::RX::IDENT}\Z/
5
-
6
- def find_relative(*args)
7
- nil
8
- end
9
-
10
- def initialize(uri, options)
11
- @uri, @options = uri, options
12
- end
13
-
14
- # Name of this spite
15
- def name
16
- ensure_path_and_name!
17
- @name
18
- end
19
-
20
- # The on-disk location of this sprite
21
- def path
22
- ensure_path_and_name!
23
- @path
24
- end
25
-
26
- # Returns the Glob of image files for this sprite
27
- def files
28
- @files ||= Dir[File.join(Compass.configuration.images_path, uri)].sort
29
- end
30
-
31
- # Returns an Array of image names without the file extension
32
- def sprite_names
33
- @sprite_names ||= files.collect do |file|
34
- filename = File.basename(file, '.png')
35
- unless VAILD_FILE_NAME =~ filename
36
- raise Compass::Error, "Sprite file names must be legal css identifiers. Please rename #{File.basename(file)}"
2
+ module SassExtensions
3
+ module Sprites
4
+ class SpriteMap < Sass::Script::Literal
5
+ attr_accessor :image_names, :path, :name, :map, :kwargs
6
+ attr_accessor :images, :width, :height, :engine
7
+
8
+ include SpriteMethods
9
+ include ImageMethods
10
+
11
+
12
+ # Initialize a new sprite object from a relative file path
13
+ # the path is relative to the <tt>images_path</tt> confguration option
14
+ def self.from_uri(uri, context, kwargs)
15
+ importer = ::Compass::SpriteImporter.new(:uri => uri.value, :options => {})
16
+ sprites = importer.files.map do |sprite|
17
+ sprite.gsub(Compass.configuration.images_path+"/", "")
18
+ end
19
+ new(sprites, importer.path, importer.name, context, kwargs)
37
20
  end
38
- filename
39
- end
40
- end
41
-
42
- # Returns the sass options for this sprite
43
- def sass_options
44
- @sass_options ||= options.merge(:filename => name, :syntax => :scss, :importer => self)
45
- end
46
-
47
- # Returns a Sass::Engine for this sprite object
48
- def sass_engine
49
- Sass::Engine.new(content_for_images, sass_options)
50
- end
51
-
52
- def ensure_path_and_name!
53
- @path ||= get_path
54
- @name ||= get_name
55
- end
56
-
57
- def get_name
58
- _, name = Compass::Sprites.path_and_name(uri)
59
- name
60
- end
61
-
62
- def get_path
63
- path, _ = Compass::Sprites.path_and_name(uri)
64
- path
65
- end
66
-
67
- def key(uri, options)
68
- Compass::Sprites.key(uri)
69
- end
70
-
71
- def mtime(uri, options)
72
- Compass::Sprites.mtime(uri, options)
73
- end
74
21
 
75
- # Generates the Sass for this sprite file
76
- def content_for_images(skip_overrides = false)
77
- <<-SCSS
78
- @import "compass/utilities/sprites/base";
79
-
80
- // General Sprite Defaults
81
- // You can override them before you import this file.
82
- $#{name}-sprite-base-class: ".#{name}-sprite" !default;
83
- $#{name}-sprite-dimensions: false !default;
84
- $#{name}-position: 0% !default;
85
- $#{name}-spacing: 0 !default;
86
- $#{name}-repeat: no-repeat !default;
87
- $#{name}-prefix: '' !default;
88
- $#{name}-clean-up: true !default;
89
-
90
- #{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $cleanup: $#{name}-clean-up);" : generate_overrides }
22
+ def initialize(sprites, path, name, context, kwargs)
23
+ @image_names = sprites
24
+ @path = path
25
+ @name = name
26
+ @kwargs = kwargs
27
+ @kwargs['cleanup'] ||= Sass::Script::Bool.new(true)
28
+ @images = nil
29
+ @width = nil
30
+ @height = nil
31
+ @engine = nil
32
+ @evaluation_context = context
33
+ validate!
34
+ compute_image_metadata!
35
+ end
91
36
 
92
- // All sprites should extend this class
93
- // The #{name}-sprite mixin will do so for you.
94
- \#{$#{name}-sprite-base-class} {
95
- background: $#{name}-sprites no-repeat;
96
- }
37
+ def inspect
38
+ to_s
39
+ end
97
40
 
98
- // Use this to set the dimensions of an element
99
- // based on the size of the original image.
100
- @mixin #{name}-sprite-dimensions($name) {
101
- @include sprite-dimensions($#{name}-sprites, $name)
102
- }
41
+ def to_s(kwargs = self.kwargs)
42
+ sprite_url(self).value
43
+ end
103
44
 
104
- // Move the background position to display the sprite.
105
- @mixin #{name}-sprite-position($name, $offset-x: 0, $offset-y: 0) {
106
- @include sprite-background-position($#{name}-sprites, $name, $offset-x, $offset-y)
107
- }
45
+ def respond_to?(meth)
46
+ super || @evaluation_context.respond_to?(meth)
47
+ end
108
48
 
109
- // Extends the sprite base class and set the background position for the desired sprite.
110
- // It will also apply the image dimensions if $dimensions is true.
111
- @mixin #{name}-sprite($name, $dimensions: $#{name}-sprite-dimensions, $offset-x: 0, $offset-y: 0) {
112
- @extend \#{$#{name}-sprite-base-class};
113
- @include sprite($#{name}-sprites, $name, $dimensions, $offset-x, $offset-y)
114
- }
49
+ def method_missing(meth, *args, &block)
50
+ if @evaluation_context.respond_to?(meth)
51
+ @evaluation_context.send(meth, *args, &block)
52
+ else
53
+ super
54
+ end
55
+ end
115
56
 
116
- @mixin #{name}-sprites($sprite-names, $dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites)) {
117
- @include sprites($#{name}-sprites, $sprite-names, $#{name}-sprite-base-class, $dimensions, $prefix)
118
- }
57
+ private
119
58
 
120
- // Generates a class for each sprited image.
121
- @mixin all-#{name}-sprites($dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites)) {
122
- @include #{name}-sprites(#{sprite_names.join(" ")}, $dimensions, $prefix);
123
- }
124
- SCSS
125
- end
126
-
127
- # Generates the override defaults for this Sprite
128
- # <tt>$#{name}-#{sprite_name}-position </tt>
129
- # <tt> $#{name}-#{sprite_name}-spacing </tt>
130
- # <tt> #{name}-#{sprite_name}-repeat: </tt>
131
- def generate_overrides
132
- content = <<-TXT
133
- // These variables control the generated sprite output
134
- // You can override them selectively before you import this file.
135
- TXT
136
- sprite_names.map do |sprite_name|
137
- content += <<-SCSS
138
- $#{name}-#{sprite_name}-position: $#{name}-position !default;
139
- $#{name}-#{sprite_name}-spacing: $#{name}-spacing !default;
140
- $#{name}-#{sprite_name}-repeat: $#{name}-repeat !default;
141
- SCSS
142
- end.join
59
+ def modulize
60
+ @modulize ||= Compass::configuration.sprite_engine.to_s.scan(/([^_.]+)/).flatten.map {|chunk| "#{chunk[0].chr.upcase}#{chunk[1..-1]}" }.join
61
+ end
143
62
 
144
- content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$cleanup: $#{name}-clean-up,\n"
145
- content += sprite_names.map do |sprite_name|
146
- %Q{ $#{sprite_name}-position: $#{name}-#{sprite_name}-position,
147
- $#{sprite_name}-spacing: $#{name}-#{sprite_name}-spacing,
148
- $#{sprite_name}-repeat: $#{name}-#{sprite_name}-repeat}
149
- end.join(",\n")
150
- content += ");"
63
+ end
151
64
  end
152
65
  end
153
- end
154
-
66
+ end