sprites 0.0.1.rc2 → 0.0.1.rc3

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 (151) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile +0 -8
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +76 -1
  5. data/Rakefile +4 -39
  6. data/bin/sprites +5 -7
  7. data/features/cli.feature +1 -1
  8. data/features/step_definitions/common_steps.rb +10 -8
  9. data/lib/sprites.rb +123 -13
  10. data/lib/sprites/cli/cli_application.rb +6 -4
  11. data/lib/sprites/cli/command_line_option_parser.rb +16 -16
  12. data/lib/sprites/configuration.rb +26 -7
  13. data/lib/sprites/railtie.rb +56 -0
  14. data/lib/sprites/sprite.rb +80 -46
  15. data/lib/sprites/sprite_generators/chunky_png_generator.rb +14 -8
  16. data/lib/sprites/sprite_piece.rb +20 -9
  17. data/lib/sprites/sprite_pieces.rb +10 -10
  18. data/lib/sprites/test/sprite_generator_tester.rb +23 -12
  19. data/lib/sprites/version.rb +2 -2
  20. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/bas/bar.png +0 -0
  21. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/bas/bas.png +0 -0
  22. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/bas/bkgd_main_copy.png +0 -0
  23. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/bas/foo.png +0 -0
  24. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/bas/fubar.png +0 -0
  25. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-default-28.png +0 -0
  26. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-default-cap-28.png +0 -0
  27. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-default-cap-long.png +0 -0
  28. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-default.png +0 -0
  29. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-onclick-28.png +0 -0
  30. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-onclick-cap-28.png +0 -0
  31. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-onclick-cap-long.png +0 -0
  32. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-onclick.png +0 -0
  33. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-rollover-28.png +0 -0
  34. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-rollover-cap-28.png +0 -0
  35. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-rollover-cap-long.png +0 -0
  36. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-black-rollover.png +0 -0
  37. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blackarrow-default.png +0 -0
  38. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blackarrow-onclick.png +0 -0
  39. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blackarrow-rollover.png +0 -0
  40. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-default-cap.png +0 -0
  41. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-default-drop.png +0 -0
  42. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-default-edge.png +0 -0
  43. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-default.png +0 -0
  44. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-onclick-cap.png +0 -0
  45. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-onclick-drop.png +0 -0
  46. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-onclick-edge.png +0 -0
  47. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-onclick.png +0 -0
  48. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-rollover-cap.png +0 -0
  49. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-rollover-drop.png +0 -0
  50. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-rollover-edge.png +0 -0
  51. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-blue-rollover.png +0 -0
  52. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-default-cap.png +0 -0
  53. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-default-drop.png +0 -0
  54. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-default-edge.png +0 -0
  55. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-default.png +0 -0
  56. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-onclick-cap.png +0 -0
  57. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-onclick-drop.png +0 -0
  58. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-onclick-edge.png +0 -0
  59. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-onclick.png +0 -0
  60. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-rollover-cap.png +0 -0
  61. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-rollover-drop.png +0 -0
  62. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-rollover-edge.png +0 -0
  63. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-green-rollover.png +0 -0
  64. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-default-cap.png +0 -0
  65. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-default-drop.png +0 -0
  66. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-default-edge.png +0 -0
  67. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-default.png +0 -0
  68. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-onclick-cap.png +0 -0
  69. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-onclick-drop.png +0 -0
  70. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-onclick-edge.png +0 -0
  71. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-onclick.png +0 -0
  72. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-rollover-cap.png +0 -0
  73. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-rollover-drop.png +0 -0
  74. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-rollover-edge.png +0 -0
  75. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-red-rollover.png +0 -0
  76. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-default-cap.png +0 -0
  77. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-default-drop.png +0 -0
  78. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-default-edge.png +0 -0
  79. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-default.png +0 -0
  80. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-onclick-cap.png +0 -0
  81. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-onclick-drop.png +0 -0
  82. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-onclick-edge.png +0 -0
  83. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-onclick.png +0 -0
  84. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-rollover-cap.png +0 -0
  85. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-rollover-drop.png +0 -0
  86. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-rollover-edge.png +0 -0
  87. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-trans-rollover.png +0 -0
  88. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-default-cap.png +0 -0
  89. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-default-drop.png +0 -0
  90. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-default-edge.png +0 -0
  91. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-default.png +0 -0
  92. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-onclick-cap.png +0 -0
  93. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-onclick-drop.png +0 -0
  94. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-onclick-edge.png +0 -0
  95. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-onclick.png +0 -0
  96. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-rollover-cap.png +0 -0
  97. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-rollover-drop.png +0 -0
  98. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-rollover-edge.png +0 -0
  99. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-white-rollover.png +0 -0
  100. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-default-cap.png +0 -0
  101. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-default-drop.png +0 -0
  102. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-default-edge.png +0 -0
  103. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-default.png +0 -0
  104. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-onclick-cap.png +0 -0
  105. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-onclick-drop.png +0 -0
  106. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-onclick-edge.png +0 -0
  107. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-onclick.png +0 -0
  108. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-rollover-cap.png +0 -0
  109. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-rollover-drop.png +0 -0
  110. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-rollover-edge.png +0 -0
  111. data/spec/fixtures/{rails_project2 → fake_engine}/app/assets/images/sprite_images/buttons/btn-yellow-rollover.png +0 -0
  112. data/spec/fixtures/fake_engine/config/sprites.rb +91 -0
  113. data/spec/fixtures/fake_engine/lib/fake_engine.rb +5 -0
  114. data/spec/fixtures/project1/config/sprites.rb +143 -145
  115. data/spec/fixtures/rails_project1/config/application.rb +4 -3
  116. data/spec/fixtures/rails_project1/config/sprites.rb +90 -92
  117. data/spec/integration/rails/rails_spec.rb +46 -13
  118. data/spec/lib/sprites/configuration_spec.rb +11 -5
  119. data/spec/lib/sprites/sprite_generators/chunky_png_generator_spec.rb +10 -9
  120. data/spec/lib/sprites/sprite_piece_spec.rb +25 -24
  121. data/spec/lib/sprites/sprite_pieces_spec.rb +5 -2
  122. data/spec/lib/sprites/sprite_spec.rb +30 -33
  123. data/spec/lib/sprites/test/sprite_generator_tester_spec.rb +37 -9
  124. data/spec/lib/sprites_spec.rb +163 -8
  125. data/spec/spec_helper.rb +4 -4
  126. data/spec/support/sprites_helper.rb +1 -1
  127. data/sprites.gemspec +6 -5
  128. metadata +134 -660
  129. data/lib/sprites/application.rb +0 -60
  130. data/lib/sprites/autoload.rb +0 -1
  131. data/lib/sprites/autoloader.rb +0 -16
  132. data/lib/sprites/notifier.rb +0 -4
  133. data/lib/sprites/rails.rb +0 -20
  134. data/lib/sprites/rails/autoload.rb +0 -13
  135. data/lib/sprites/rails/sprites.rake +0 -15
  136. data/lib/sprites/sprites.rb +0 -47
  137. data/lib/sprites/stylesheet.rb +0 -26
  138. data/spec/fixtures/rails_project1/Rakefile +0 -5
  139. data/spec/fixtures/rails_project1/config/boot.rb +0 -6
  140. data/spec/fixtures/rails_project1/config/environment.rb +0 -7
  141. data/spec/fixtures/rails_project2/Rakefile +0 -5
  142. data/spec/fixtures/rails_project2/config/application.rb +0 -61
  143. data/spec/fixtures/rails_project2/config/boot.rb +0 -6
  144. data/spec/fixtures/rails_project2/config/environment.rb +0 -7
  145. data/spec/fixtures/rails_project2/config/sprites.rb +0 -93
  146. data/spec/lib/sprites/application_spec.rb +0 -50
  147. data/spec/lib/sprites/autoloader_spec.rb +0 -21
  148. data/spec/lib/sprites/cli/command_line_option_parser_spec.rb +0 -5
  149. data/spec/lib/sprites/notifier_spec.rb +0 -5
  150. data/spec/lib/sprites/sprites_spec.rb +0 -100
  151. data/spec/lib/sprites/stylesheet_spec.rb +0 -24
@@ -1,11 +1,16 @@
1
- module Sprites
1
+ class Sprites
2
2
  class Configuration
3
- FIELDS = %w{sprites_path sprite_stylesheets_path sprite_pieces_path}
3
+ PATH_FIELDS = %w{definition_file sprites_path sprite_stylesheets_path sprite_pieces_path}
4
+ OTHER_FIELDS = %w{definition_file autoload sprite_asset_path generator}
5
+ FIELDS = PATH_FIELDS + OTHER_FIELDS
4
6
 
5
7
  DEFAULT_CONFIGURATION = {
6
8
  'sprites_path' => 'public/images/sprites',
7
9
  'sprite_stylesheets_path' => 'public/stylesheets/sprites',
8
- 'sprite_pieces_path' => 'public/images/sprite_images'
10
+ 'sprite_pieces_path' => 'public/images/sprite_images',
11
+ 'sprite_asset_path' => '/images/sprites',
12
+ 'generator' => ChunkyPngGenerator,
13
+ 'autoload' => true
9
14
  }
10
15
 
11
16
  attr_accessor *FIELDS
@@ -14,13 +19,19 @@ module Sprites
14
19
  DEFAULT_CONFIGURATION.each {|k,v| self.send(:"#{k}=", v)}
15
20
  end
16
21
 
22
+ def configure(options)
23
+ # p options
24
+ options.each {|k,v| self.send(:"#{k}=", v)}
25
+ end
26
+
17
27
  def config
18
28
  self
19
29
  end
20
30
 
21
- def configure(&blk)
22
- instance_eval(&blk)
23
- self
31
+ def to_options
32
+ options = Hash.new
33
+ FIELDS.each {|option| options[option.intern] = send(option) }
34
+ options
24
35
  end
25
36
 
26
37
  def configured?
@@ -31,11 +42,19 @@ module Sprites
31
42
 
32
43
  def self.new_for_command_line_options(options)
33
44
  config = new
45
+
34
46
  options.each do |k, v|
35
- if FIELDS.include?(k.to_s)
47
+ if options.has_key? :project_root
48
+ if PATH_FIELDS.include?(k.to_s)
49
+ config.send(:"#{path_field}=", File.join(options[:project_root], options[path_field.intern]))
50
+ elsif OTHER_FIELDS.include?(k.to_s)
51
+ config.send(:"#{k}=", v)
52
+ end
53
+ elsif FIELDS.include?(k.to_s)
36
54
  config.send(:"#{k}=", v)
37
55
  end
38
56
  end
57
+
39
58
  config
40
59
  end
41
60
  end
@@ -0,0 +1,56 @@
1
+ class Sprites
2
+ class Railtie < ::Rails::Railtie
3
+ rake_tasks do
4
+ desc "Generate sprites and stylesheets"
5
+ task :sprites => :environment do
6
+ Sprites::Railtie.each_sprited_engine do |engine|
7
+ next if engine.class.superclass == Rails::Engine && !ENV['ENGINES']
8
+
9
+ sprites = engine.config.send(Sprites::Railtie.config_field_name(engine.engine_name))
10
+ sprite_generator = Sprites::ChunkyPngGenerator.new(sprites)
11
+ sprite_generator.generate
12
+ end
13
+ end
14
+ end
15
+
16
+ initializer 'sprites._rails-configuration' do
17
+ Sprites::Railtie.each_sprited_engine do |engine|
18
+ assets_path = "app/assets"
19
+
20
+ sprites = Sprites.new
21
+
22
+ engine.config.send(Sprites::Railtie.config_field_name_with_equals(engine.engine_name), sprites)
23
+ sprites.configuration.configure(
24
+ :sprites_path => engine.root.join(assets_path, 'images/sprites'),
25
+ :sprite_stylesheets_path => engine.root.join(assets_path, 'stylesheets/sprites'),
26
+ :sprite_pieces_path => engine.root.join(assets_path, 'images/sprite_images'),
27
+ :sprite_asset_path => '/assets/sprites'
28
+ )
29
+
30
+ default_definition_file = File.join(engine.config.root, 'config/sprites.rb')
31
+ if File.exists? default_definition_file
32
+ sprites.configuration.definition_file = default_definition_file
33
+ else
34
+ sprites.configuration.autoload = true
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def self.each_sprited_engine
42
+ (Rails.application.railties.engines + [Rails.application]).each do |engine|
43
+ next unless engine.config.respond_to?(:uses_sprites) && engine.config.uses_sprites
44
+ yield engine
45
+ end
46
+ end
47
+
48
+ def self.config_field_name(engine_name)
49
+ :"sprites_for_#{engine_name}"
50
+ end
51
+
52
+ def self.config_field_name_with_equals(engine_name)
53
+ :"#{config_field_name(engine_name)}="
54
+ end
55
+ end
56
+ end
@@ -2,9 +2,10 @@ require 'fileutils'
2
2
  require 'active_support/core_ext'
3
3
  require 'sprites/sprite_pieces'
4
4
  require 'sprites/sprite_piece'
5
- require 'sprites/stylesheet'
6
5
 
7
- module Sprites
6
+ require 'forwardable'
7
+
8
+ class Sprites
8
9
  class Sprite
9
10
  class InvalidOrientation < StandardError; end
10
11
  module Orientations
@@ -12,22 +13,24 @@ module Sprites
12
13
  HORIZONTAL = 2
13
14
  end
14
15
 
16
+ SUPPORTED_OPTIONS = %w{orientation path stylesheet_path url autoload css_prefix}
17
+
15
18
  DEFAULT_OPTIONS = {
16
19
  :orientation => Orientations::VERTICAL,
17
- :path => lambda {|sprite| "#{sprite.name}.png" },
18
- :stylesheet_path => lambda {|sprite| sprite.stylesheet.path },
19
- :url => lambda {|sprite| sprite.stylesheet.url },
20
- :auto_define => true,
21
20
  :css_prefix => ''
22
21
  }
23
22
 
24
- attr_reader :name, :sprite_pieces, :stylesheet
25
- attr_writer :path, :stylesheet_path, :url, :auto_define, :css_prefix
23
+ extend Forwardable
24
+
25
+ attr_reader :name, :sprite_pieces
26
+ attr_accessor *SUPPORTED_OPTIONS
27
+
28
+ def_delegator :@sprites, :configuration
26
29
 
27
- def initialize(name, configuration = ::Sprites.configuration)
28
- @name, @configuration = name, configuration
29
- @sprite_pieces = SpritePieces.new
30
- @stylesheet = Stylesheet.new(self)
30
+ def initialize(name, sprites)
31
+ @name, @sprites = name, sprites
32
+
33
+ @sprite_pieces = SpritePieces.new(@sprites, self)
31
34
  end
32
35
 
33
36
  def orientation=(val)
@@ -35,65 +38,96 @@ module Sprites
35
38
  @orientation = val
36
39
  end
37
40
 
38
- [:path, :stylesheet_path, :url].each do |attribute|
39
- eval <<-EVAL
40
- def #{attribute}
41
- val = @#{attribute} || DEFAULT_OPTIONS[:#{attribute}]
42
- if val.respond_to?(:call)
43
- val.call(self)
44
- else
45
- val
46
- end
47
- end
48
- EVAL
41
+ def sprite_file_name
42
+ "#{name}.png"
43
+ end
44
+
45
+ def stylesheet_file_name
46
+ sprite_file_name.gsub(/png$/, 'css')
47
+ end
48
+
49
+ def background_property_url
50
+ @url || File.join(@sprites.configuration.sprite_asset_path, sprite_file_name)
51
+ end
52
+
53
+ # Output file for the sprites image
54
+ def path
55
+ File.join(@sprites.configuration.sprites_path, @path || sprite_file_name)
56
+ end
57
+
58
+ # Output file for the sprites stylesheet
59
+ def stylesheet_path
60
+ File.join(@sprites.configuration.sprite_stylesheets_path, @stylesheet_path || stylesheet_file_name)
49
61
  end
50
62
 
51
- def method_missing(meth, *args)
52
- unless [:orientation, :auto_define?, :css_prefix].include?(meth)
53
- super
63
+ def do_autolaod?
64
+ if autoload == false
65
+ false
54
66
  else
55
- instance_variable_get(:"@#{meth.to_s.chomp('?')}") || DEFAULT_OPTIONS[:"#{meth.to_s.chomp('?')}"]
67
+ @sprites.configuration.autoload
56
68
  end
57
69
  end
58
70
 
71
+ def css_prefix
72
+ @css_prefix || DEFAULT_OPTIONS[:css_prefix]
73
+ end
74
+
75
+ def orientation
76
+ @orientation || DEFAULT_OPTIONS[:orientation]
77
+ end
78
+
59
79
  def configure(options = {}, &blk)
60
- options.symbolize_keys!.assert_valid_keys(*DEFAULT_OPTIONS.keys)
80
+ options.symbolize_keys!.assert_valid_keys(*(SUPPORTED_OPTIONS.map(&:intern)))
81
+
61
82
  options.each {|k,v| send(:"#{k}=", v)}
62
- auto_define! if auto_define?
83
+
84
+ autoload! if do_autolaod?
85
+
63
86
  instance_eval(&blk) if block_given?
87
+
64
88
  self
65
89
  end
66
90
 
67
91
  def write_stylesheet(configuration, sprite_pieces = @sprite_pieces)
68
- path = Stylesheet.stylesheet_full_path(configuration, stylesheet)
69
- FileUtils.mkdir_p(File.dirname(path))
70
- File.open path, 'w+' do |f|
71
- f << stylesheet.css(configuration, self, sprite_pieces)
92
+ FileUtils.mkdir_p(File.dirname(stylesheet_path))
93
+ File.open stylesheet_path, 'w+' do |f|
94
+ f << sprite_pieces.css
72
95
  end
73
96
  end
74
97
 
75
- def sprite_piece(path, css_class, options = {})
98
+ ##
99
+ # The +sprite_piece+ method adds sprite_piecess to the sprite
100
+ #
101
+ # === Example ===
102
+ # sprite :foo do
103
+ # sprite_piece 'buttons/btn-black-default-28.png', 'a.black.wf_button > span, button.black.wf_submit span'
104
+ #
105
+ # Arguments:
106
+ # [String] the path to sprite piece relatie to config.sprite_pieces_path
107
+ # [String] (optional) the css selector to use for this sprite piece
108
+ #
109
+ # Options:
110
+ ##
111
+ def sprite_piece(path, css_class = nil, options = {})
112
+ css_class ||= File.basename(path, File.extname(path)).split('/').join('-')
76
113
  @sprite_pieces.add(path, css_class, options)
77
114
  end
78
115
 
79
- def self.sprite_full_path(configuration, sprite)
80
- File.join(configuration.sprites_path, sprite.path)
116
+ def autoload!
117
+ Dir[File.join(@sprites.configuration.sprite_pieces_path, name.to_s, '*.png')].each do |path|
118
+ sprite_piece "#{name}/#{File.basename(path)}", ".#{File.basename(path, File.extname(path))}"
119
+ end
81
120
  end
82
121
 
83
- def self.sprite_css_path(configuration, sprite)
84
- # TODO only works for rails and sprites dir is hard coded
85
- # TODO what if there is another app in the path
86
- "/assets/sprites/#{File.basename(sprite_full_path(configuration, sprite))}"
122
+ def all_sprite_pieces
123
+ @sprite_pieces.all
87
124
  end
88
125
 
89
- def auto_define!
90
- Dir[File.join(@configuration.sprite_pieces_path, name.to_s, '*.png')].each do |path|
91
- sprite_piece "#{name}/#{File.basename(path)}", ".#{File.basename(path, File.extname(path))}"
126
+ def all_sprite_piece_files
127
+ @sprite_pieces.map do |sp|
128
+ sp.source_path
92
129
  end
93
130
  end
94
131
 
95
- def stylesheet_path
96
- @stylesheet_path || path.to_s.gsub(/png$/, 'css')
97
- end
98
132
  end
99
133
  end
@@ -4,15 +4,21 @@ rescue
4
4
  require 'chunky_png'
5
5
  end
6
6
 
7
- module Sprites
7
+ class Sprites
8
8
  class ChunkyPngGenerator
9
- attr_reader :configuration
9
+ attr_reader :sprites
10
10
 
11
- def initialize(configuration)
12
- @configuration = configuration
11
+ def initialize(sprites)
12
+ @sprites = sprites
13
13
  end
14
14
 
15
- def generate(sprites)
15
+ def configuration
16
+ sprites.configuration
17
+ end
18
+
19
+ def generate
20
+ sprites.load
21
+
16
22
  # verbose = ENV['VERBOSE'] == 'true' || ENV['DEBUG']
17
23
  #
18
24
  # if verbose
@@ -31,8 +37,8 @@ module Sprites
31
37
  # end
32
38
  #
33
39
 
34
- sprite_path = File.join(configuration.sprites_path, sprite.path)
35
- sprite_stylesheet_path = File.join(configuration.sprite_stylesheets_path, sprite.stylesheet_path)
40
+ sprite_path = sprite.path
41
+ sprite_stylesheet_path = sprite.stylesheet_path
36
42
 
37
43
  orientation = sprite.orientation
38
44
  sprite_pieces = sprite.sprite_pieces
@@ -77,7 +83,7 @@ module Sprites
77
83
  width, height = 0, 0
78
84
 
79
85
  image_list = sprite_pieces.map do |sp|
80
- sprite_piece_path = SpritePiece.sprite_piece_full_path(@configuration, sp)
86
+ sprite_piece_path = sp.source_path
81
87
  sp_image = ChunkyPNG::Image.from_file(sprite_piece_path)
82
88
  sp.left = orientation == Sprite::Orientations::VERTICAL ? 0 : width
83
89
  sp.top = orientation == Sprite::Orientations::VERTICAL ? height : 0
@@ -1,27 +1,38 @@
1
- module Sprites
1
+ class Sprites
2
2
  class SpritePiece
3
- attr_reader :path
4
- attr_accessor :sprite, :css_selector, :x, :y, :width, :height, :top, :left
3
+ SUPPORTED_OPTIONS = %w(x y)
4
+
5
+ attr_reader :path, :sprite
6
+ attr_accessor :css_selector, :width, :height, :top, :left, *SUPPORTED_OPTIONS
5
7
  alias_method :selector, :css_selector
6
8
 
7
- def initialize(path)
9
+ def initialize(sprites, sprite, path)
10
+ @sprites, @sprite = sprites, sprite
8
11
  @path = path
9
12
  end
10
13
 
11
- def self.sprite_piece_full_path(configuration, sprite_piece)
12
- File.join(configuration.sprite_pieces_path, sprite_piece.path)
14
+ def configure(options)
15
+ options.symbolize_keys!.assert_valid_keys(*(SUPPORTED_OPTIONS.map(&:intern)))
16
+
17
+ options.each {|k,v| send(:"#{k}=", v) }
13
18
  end
14
19
 
15
- def css(configuration = ::Sprites.configuration, sprite = @sprite, sprite_css_path = nil)
16
- raise "Sprite needed." unless sprite
20
+ def background_property_url
21
+ @sprite.background_property_url
22
+ end
23
+
24
+ def source_path
25
+ File.join(@sprites.configuration.sprite_pieces_path, path)
26
+ end
17
27
 
28
+ def css
18
29
  <<-CSS
19
30
  #{selector}
20
31
  {
21
32
  display:block;
22
33
  width:#{width}px;
23
34
  height:#{height}px;
24
- background:url('#{sprite_css_path || Sprite.sprite_css_path(configuration, sprite)}') no-repeat #{x || negative_pixelize(left)} #{y || negative_pixelize(top)};
35
+ background:url('#{background_property_url}?#{Time.now.to_i}') no-repeat #{x || negative_pixelize(left)} #{y || negative_pixelize(top)};
25
36
  }
26
37
  CSS
27
38
  end
@@ -1,18 +1,20 @@
1
1
  require 'active_support/ordered_hash'
2
2
 
3
- module Sprites
3
+ class Sprites
4
4
  class SpritePieces
5
5
  include Enumerable
6
6
 
7
- def initialize
7
+ def initialize(sprites, sprite)
8
+ @sprites, @sprite = sprites, sprite
8
9
  @sprite_pieces = ActiveSupport::OrderedHash.new do |sprite_pieces, path|
9
- sprite_pieces[path] = SpritePiece.new(path)
10
+ sprite_pieces[path] = SpritePiece.new(sprites, sprite, path)
10
11
  end
11
12
  end
12
13
 
13
14
  def add(path, css_selector, options = {})
14
15
  @sprite_pieces[path].css_selector = css_selector
15
- options.each {|k,v| @sprite_pieces[path].send(:"#{k}=", v) }
16
+ @sprite_pieces[path].configure(options)
17
+
16
18
  self
17
19
  end
18
20
 
@@ -29,17 +31,15 @@ module Sprites
29
31
  end
30
32
 
31
33
  def [](val)
32
- @sprite_pieces.has_key?(val) ?
33
- @sprite_pieces[val] :
34
- nil
34
+ @sprite_pieces[val] if @sprite_pieces.has_key?(val)
35
35
  end
36
36
 
37
37
  def element_at(index)
38
38
  @sprite_pieces.values[index]
39
39
  end
40
40
 
41
- def css(configuration = ::Sprites.configuration, sprite = @sprite)
42
- @sprite_pieces.values.map {|sp| sp.css(configuration, sprite)}.join("\n")
41
+ def css
42
+ @sprite_pieces.values.map {|sp| sp.css}.join("\n")
43
43
  end
44
44
  end
45
- end
45
+ end
@@ -6,32 +6,35 @@ rescue LoadError
6
6
  require 'RMagick'
7
7
  end
8
8
 
9
- module Sprites
9
+ class Sprites
10
10
  class SpriteGeneratorTester
11
11
  include Magick
12
12
 
13
13
  Selector = Struct.new(:selector, :x, :y, :width, :height)
14
14
 
15
- attr_reader :sprite, :configuration
16
- private :sprite, :configuration
15
+ attr_reader :sprite
16
+ private :sprite
17
17
 
18
- def initialize(sprite, configuration)
19
- @sprite, @configuration = sprite, configuration
18
+ def initialize(sprite)
19
+ @sprite = sprite
20
20
  end
21
21
 
22
22
  def accurate?
23
23
  test_generate.all? {|x| x == 0}
24
24
  end
25
25
 
26
+ def background_property_urls
27
+ background_property_urls = []
28
+ parser.each_rule_set do |rs|
29
+ background_property_urls << rs['background'][%r{url\('?(.+)(?:\?\d+)(?:')\)}, 1]
30
+ end
31
+ background_property_urls
32
+ end
33
+
26
34
  private
27
35
  def test_generate(gem_root = GEM_ROOT)
28
36
  sprite_pieces = @sprite.sprite_pieces
29
- sprite_image = Image.read(Sprite.sprite_full_path(configuration, sprite)).first
30
-
31
- stylesheet_path = Stylesheet.stylesheet_full_path(configuration, sprite.stylesheet)
32
- stylesheet_absolute_path = gem_root.join(stylesheet_path)
33
- parser = CssParser::Parser.new
34
- parser.load_file!(File.basename(stylesheet_absolute_path), File.dirname(stylesheet_absolute_path), :screen)
37
+ sprite_image = Image.read(sprite.path).first
35
38
 
36
39
  sprite_pieces_with_selector_data = []
37
40
 
@@ -52,7 +55,7 @@ module Sprites
52
55
  percent_diferences = sprite_pieces_with_selector_data.map do |sp, selector_data|
53
56
  begin
54
57
  raise selector_data.inspect if sp.nil?
55
- sprite_piece_path = gem_root.join(SpritePiece.sprite_piece_full_path(configuration, sp))
58
+ sprite_piece_path = sp.source_path
56
59
  sprite_piece_image = Image.read(sprite_piece_path).first
57
60
 
58
61
  curr_sprite_image = sprite_image.crop(
@@ -75,5 +78,13 @@ module Sprites
75
78
  sprite_image.destroy! if sprite_image
76
79
  sprite_image = nil
77
80
  end
81
+
82
+ def parser
83
+ stylesheet_path = sprite.stylesheet_path
84
+ parser = CssParser::Parser.new
85
+ parser.load_file!(File.basename(stylesheet_path), File.dirname(stylesheet_path), :screen)
86
+ parser
87
+ end
88
+
78
89
  end
79
90
  end