active_assets 0.1.0 → 0.2.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/.gitignore +4 -0
  2. data/README.md +168 -0
  3. data/Rakefile +6 -0
  4. data/active_assets.gemspec +11 -6
  5. data/config.ru +2 -0
  6. data/lib/active_assets.rb +1 -0
  7. data/lib/active_assets/active_expansions/railtie.rb +10 -9
  8. data/lib/active_assets/active_sprites.rb +13 -0
  9. data/lib/active_assets/active_sprites/railtie.rb +29 -0
  10. data/lib/active_assets/active_sprites/runner.rb +101 -0
  11. data/lib/active_assets/active_sprites/sprite.rb +89 -0
  12. data/lib/active_assets/active_sprites/sprite_piece.rb +63 -0
  13. data/lib/active_assets/active_sprites/sprite_stylesheet.rb +24 -0
  14. data/lib/active_assets/active_sprites/sprites.rb +51 -0
  15. data/lib/active_assets/railtie.rb +2 -0
  16. data/lib/rails/active_assets.rb +4 -5
  17. data/lib/rails/active_expansions.rb +11 -0
  18. data/lib/rails/active_sprites.rb +11 -0
  19. data/lib/tasks/{cache.rake → active_expansions/cache.rake} +0 -0
  20. data/lib/tasks/active_sprites/sprites.rake +4 -0
  21. data/script/console +1 -0
  22. data/script/server +1 -0
  23. data/script/test_server +1 -0
  24. data/test/active_assets/active_expansions/asset_test.rb +18 -1
  25. data/test/active_assets/active_expansions/expansions_test.rb +16 -2
  26. data/test/active_assets/active_sprites/runner_test.rb +43 -0
  27. data/test/active_assets/active_sprites/sprite_piece_test.rb +65 -0
  28. data/test/active_assets/active_sprites/sprite_test.rb +53 -0
  29. data/test/active_assets/active_sprites/sprites_test.rb +35 -0
  30. data/test/fixtures/rails_root/config/application.rb +1 -0
  31. data/test/fixtures/rails_root/config/environment.rb +2 -0
  32. data/test/fixtures/rails_root/config/sprites.rb +14 -0
  33. data/test/fixtures/rails_root/public/images/sprite_images/sprite3/1.gif +0 -0
  34. data/test/fixtures/rails_root/public/images/sprite_images/sprite3/2.gif +0 -0
  35. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Argentina.gif +0 -0
  36. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Australia.gif +0 -0
  37. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Austria.gif +0 -0
  38. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Belgium.gif +0 -0
  39. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Brazil.gif +0 -0
  40. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Cameroon.gif +0 -0
  41. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Canada.gif +0 -0
  42. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Chile.gif +0 -0
  43. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/China.gif +0 -0
  44. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Denmark.gif +0 -0
  45. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Finland.gif +0 -0
  46. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/France.gif +0 -0
  47. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Germany.gif +0 -0
  48. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Greece.gif +0 -0
  49. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Hong Kong.gif +0 -0
  50. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Hungary.gif +0 -0
  51. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Iceland.gif +0 -0
  52. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/India.gif +0 -0
  53. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Indonesia.gif +0 -0
  54. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Ireland.gif +0 -0
  55. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Israel.gif +0 -0
  56. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Italy.gif +0 -0
  57. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Japan.gif +0 -0
  58. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Malaysia.gif +0 -0
  59. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Mexico.gif +0 -0
  60. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/New Zealand.gif +0 -0
  61. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Norway.gif +0 -0
  62. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Pakistan.gif +0 -0
  63. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Palestine.gif +0 -0
  64. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Peru.gif +0 -0
  65. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Poland.gif +0 -0
  66. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Portugal.gif +0 -0
  67. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Puerto Rico.gif +0 -0
  68. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Romania.gif +0 -0
  69. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Russia.gif +0 -0
  70. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Saudi Arabia.gif +0 -0
  71. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Singapore.gif +0 -0
  72. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/South Africa.gif +0 -0
  73. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/South Korea.gif +0 -0
  74. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Spain.gif +0 -0
  75. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Sweden.gif +0 -0
  76. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Switzerland.gif +0 -0
  77. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Thailand.gif +0 -0
  78. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/The Netherlands.gif +0 -0
  79. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Turkey.gif +0 -0
  80. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/UK.gif +0 -0
  81. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/USA.gif +0 -0
  82. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Ukraine.gif +0 -0
  83. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Uruguay.gif +0 -0
  84. data/test/fixtures/rails_root/public/images/sprite_images/sprite4/Venezuela.gif +0 -0
  85. data/test/fixtures/sinatra_root/active_assets_test_app.rb +12 -0
  86. data/test/fixtures/sinatra_root/views/layout.erb +7 -0
  87. data/test/fixtures/sinatra_root/views/sprite.erb +3 -0
  88. data/test/helper.rb +50 -0
  89. data/test/support/rails_helper.rb +10 -1
  90. data/vendor/bin/ng +0 -0
  91. data/vendor/bin/ng.exe +0 -0
  92. data/vendor/jruby-complete-1.5.6.jar +0 -0
  93. metadata +230 -21
@@ -0,0 +1,63 @@
1
+ module ActiveAssets
2
+ module ActiveSprites
3
+ class SpritePiece
4
+ class ValidationError < StandardError
5
+ attr_reader :sprite_piece, :missing_fields
6
+ def initialize(sprite_piece, missing_fields)
7
+ @sprite, @missing_fields = sprite_piece, missing_fields
8
+ super("#{"Your sprite piece could not be created. " if @sprite_piece.nil?} Your sprite piece is invalid. It is missing the following fields: #{@missing_fields.join(', ')}")
9
+ end
10
+ end
11
+
12
+ class Mapping
13
+ attr_reader :path, :css_selector
14
+
15
+ def initialize(path, css_selector)
16
+ raise ValidationError.new(nil, [:path]) if path.blank?
17
+ @path, @css_selector = path, css_selector
18
+ end
19
+ end
20
+
21
+ GEOMETRY_PROPS = [:x, :y, :width, :height]
22
+ attr_reader(*GEOMETRY_PROPS)
23
+ attr_accessor :details
24
+ delegate :path, :css_selector, :to => :mapping
25
+
26
+ def configure(mapping, options = {}, &blk)
27
+ @mapping = mapping
28
+ options.each {|k,v| send(k, v)}
29
+ instance_eval(&blk) if block_given?
30
+ self
31
+ end
32
+
33
+ def to_s
34
+ return '' if details.nil?
35
+ <<-CSS
36
+ #{css_selector}
37
+ {
38
+ width:#{width || details.width};
39
+ height:#{height || details.height};
40
+ background:url('#{details.sprite_path}') no-repeat #{x || details.x} #{y || details.y};
41
+ display:block;
42
+ }
43
+ CSS
44
+ end
45
+
46
+ GEOMETRY_PROPS.each do |prop|
47
+ eval <<-METH
48
+ def #{prop}(*args)
49
+ #{prop}, *_ = args
50
+ @#{prop} = #{prop} if #{prop}
51
+ @#{prop}
52
+ end
53
+ METH
54
+ end
55
+
56
+ private
57
+ def mapping
58
+ @mapping
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,24 @@
1
+ require 'fileutils'
2
+
3
+ module ActiveAssets
4
+ module ActiveSprites
5
+ class SpriteStylesheet
6
+ def initialize(sprite_path, sprite_pieces)
7
+ @sprite_path, @sprite_pieces = sprite_path, sprite_pieces
8
+ end
9
+
10
+ def write(path)
11
+ to_s!
12
+ FileUtils.mkdir_p(File.dirname(path))
13
+ File.open(path, 'w+') do |f|
14
+ f.write @as_string
15
+ end
16
+ end
17
+
18
+ private
19
+ def to_s!
20
+ @as_string ||= @sprite_pieces.map(&:to_s).join("\n")
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,51 @@
1
+ module ActiveAssets
2
+ module ActiveSprites
3
+ class Sprites
4
+ def initialize
5
+ @sprites = Hash.new do |sprites, name|
6
+ sprites[name] = Sprite.new
7
+ end
8
+ end
9
+
10
+ def describe(&blk)
11
+ instance_eval(&blk) if block_given?
12
+ self
13
+ end
14
+
15
+ def all
16
+ @sprites.values
17
+ end
18
+
19
+ def sprite(*args, &blk)
20
+ sprite_path, stylesheet_path, options, as =
21
+ case args.first
22
+ when Hash
23
+ options = args.shift
24
+ args = *options.find {|k,v| k.is_a?(String) }
25
+ (args << options).tap {|a| a.last.delete(a.first)}
26
+ when Symbol
27
+ # todo make default paths configurable
28
+ ["sprites/#{args.first.to_s}.png", "sprites/#{args.first.to_s}.css", args.extract_options!, args.first]
29
+ when String
30
+ path = args.first
31
+ [path, "#{File.dirname(path)}/#{File.basename(path, File.extname(path))}.css", args.extract_options!]
32
+ end
33
+ options.reverse_merge!(:as => as)
34
+ @sprites[options[:as] || sprite_path].configure(sprite_path, stylesheet_path, options, &blk)
35
+ end
36
+
37
+ def [](name)
38
+ return nil unless @sprites.has_key?(name)
39
+ @sprites[name]
40
+ end
41
+
42
+ def clear
43
+ @sprites.clear
44
+ end
45
+
46
+ def generate!
47
+ Runner.new(@sprites).generate!
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,2 @@
1
+ require 'active_assets/active_expansions/railtie'
2
+ require 'active_assets/active_sprites/railtie'
@@ -1,11 +1,10 @@
1
+ require 'rails/active_expansions'
2
+ require 'rails/active_sprites'
1
3
  require 'active_assets'
2
4
 
3
5
  module Rails
4
6
  module ActiveAssets
5
- def expansions(&blk)
6
- @expansions ||= ::ActiveAssets::ActiveExpansions::Expansions.new
7
- @expansions.instance_eval(&blk) if block_given?
8
- @expansions
9
- end
7
+ include ActiveExpansions
8
+ include ActiveSprites
10
9
  end
11
10
  end
@@ -0,0 +1,11 @@
1
+ require 'active_assets/active_expansions'
2
+
3
+ module Rails
4
+ module ActiveExpansions
5
+ def expansions(&blk)
6
+ @expansions ||= ::ActiveAssets::ActiveExpansions::Expansions.new
7
+ @expansions.instance_eval(&blk) if block_given?
8
+ @expansions
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'active_assets/active_sprites'
2
+
3
+ module Rails
4
+ module ActiveSprites
5
+ def sprites(&blk)
6
+ @sprites ||= ::ActiveAssets::ActiveSprites::Sprites.new
7
+ @sprites.instance_eval(&blk) if block_given?
8
+ @sprites
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ desc "Sprites bitch!"
2
+ task :sprites => :environment do
3
+ Rails.application.sprites.generate!
4
+ end
data/script/console ADDED
@@ -0,0 +1 @@
1
+ irb -I./test/fixtures/rails_root -rrubygems -rbundler/setup -rconfig/environment
data/script/server ADDED
@@ -0,0 +1 @@
1
+ rackup -I./test/fixtures/sinatra_root -p 3000 -s thin
@@ -0,0 +1 @@
1
+ java -Xms32m -Xmx1024m -cp vendor/jruby-complete-1.5.6.jar com.martiansoftware.nailgun.NGServer
@@ -1,4 +1,5 @@
1
1
  require 'helper'
2
+ require 'securerandom'
2
3
 
3
4
  class AssetTest < Test::Unit::TestCase
4
5
  def setup
@@ -35,6 +36,22 @@ class AssetTest < Test::Unit::TestCase
35
36
 
36
37
  def test_valid_bang
37
38
  asset = ActiveAssets::ActiveExpansions::Asset.new(nil, :js, :defaults, [:development, :test], "not false")
38
- assert_raise ActiveAssets::ActiveExpansions::Asset::ValidationError do asset.valid!; end
39
+ assert_raise(ActiveAssets::ActiveExpansions::Asset::ValidationError) { asset.valid! }
40
+ end
41
+
42
+ def test_invalid_type
43
+ asset = ActiveAssets::ActiveExpansions::Asset.new('/path/to/asset', :pdf, :defaults, [:development, :test], false)
44
+ assert_raises(ActiveAssets::ActiveExpansions::Asset::InvalidAssetType) { asset.valid! }
45
+ end
46
+
47
+ ActiveAssets::ActiveExpansions::Asset.members.each do |member|
48
+ eval <<-EOS
49
+ def test_#{member}_equals
50
+ val = SecureRandom.hex
51
+ asset = ActiveAssets::ActiveExpansions::Asset.new('/path/to/asset', :js, :defaults, [:development, :test], false)
52
+ asset.#{member}= val
53
+ assert_equal val, asset.#{member}
54
+ end
55
+ EOS
39
56
  end
40
57
  end
@@ -2,12 +2,12 @@ require 'helper'
2
2
 
3
3
  class ExpansionsTest < Test::Unit::TestCase
4
4
  def setup
5
- initialize_application_or_load_assets!
5
+ initialize_application_or_load_expansions!
6
6
  end
7
7
 
8
8
  def teardown
9
9
  delete_cached_assets!
10
- Rails.application.expansions.clear
10
+ tear_down_assets
11
11
  end
12
12
 
13
13
  def test_new
@@ -145,4 +145,18 @@ class ExpansionsTest < Test::Unit::TestCase
145
145
  end
146
146
  end
147
147
 
148
+ def test_expansion_1
149
+ Rails.application.expansions do
150
+ expansion :foo do
151
+ `vendor/jquery.mousewheel.js`
152
+ end
153
+
154
+ expansion :foo do
155
+ `bar/bas.js`
156
+ end
157
+ end
158
+
159
+ assert_equal %w{vendor/jquery.mousewheel.js bar/bas.js}, Rails.application.expansions.javascripts[:foo].assets.map(&:path)
160
+ end
161
+
148
162
  end
@@ -0,0 +1,43 @@
1
+ require 'helper'
2
+ require 'fileutils'
3
+
4
+ class RunnerTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ initialize_application_or_load_sprites!
8
+
9
+ assert_false Rails.application.sprites.all.empty?
10
+
11
+ assert_nothing_raised do
12
+ Rails.application.sprites.generate!
13
+ end
14
+ end
15
+
16
+ def teardown
17
+ FileUtils.rm_rf(Rails.root.join('public/images/sprites'))
18
+ FileUtils.rm_rf(Rails.root.join('public/stylesheets/sprites'))
19
+
20
+ tear_down_assets
21
+ end
22
+
23
+
24
+ def test_generate
25
+ visit "/sprite?sprite_path=/images/#{Rails.application.sprites['sprites/4.png'].path}"
26
+ assert_equal 2400, page.find('#sprite').native.height
27
+ end
28
+
29
+ def test_generate_2
30
+ visit "/sprite?sprite_path=/images/#{Rails.application.sprites['sprites/3.png'].path}"
31
+ assert_equal 96, page.find('#sprite').native.height
32
+ end
33
+
34
+ def test_sprite_exists
35
+ assert File.exists?(Rails.root.join('public/images/sprites/3.png'))
36
+ assert File.exists?(Rails.root.join('public/images/sprites/4.png'))
37
+ end
38
+
39
+ def test_stylesheets_exists
40
+ assert File.exists?(Rails.root.join('public/stylesheets/sprites/3.css'))
41
+ assert File.exists?(Rails.root.join('public/stylesheets/sprites/4.css'))
42
+ end
43
+ end
@@ -0,0 +1,65 @@
1
+ require 'helper'
2
+
3
+ class SpritePiecetest < Test::Unit::TestCase
4
+ def setup
5
+ initialize_application_or_load_sprites!
6
+ end
7
+
8
+ def teardown
9
+ tear_down_assets
10
+ end
11
+
12
+ def test_configure_with_block
13
+ Rails.application.sprites do
14
+ sprite :sprite1 do
15
+ _"sprite_images/sprite1/1.png" => ".klass_1" do
16
+ x 'right'
17
+ y 'top'
18
+ width '320px'
19
+ height '240px'
20
+ end
21
+ end
22
+ end
23
+
24
+ assert_equal "240px", sprites[:sprite1]["sprite_images/sprite1/1.png"].height
25
+ assert_equal "320px", sprites[:sprite1]["sprite_images/sprite1/1.png"].width
26
+ assert_equal "top", sprites[:sprite1]["sprite_images/sprite1/1.png"].y
27
+ assert_equal 'right', sprites[:sprite1]["sprite_images/sprite1/1.png"].x
28
+ end
29
+
30
+ def test_configure_with_options
31
+ Rails.application.sprites do
32
+ sprite :sprite2 do
33
+ _"sprite_images/sprite1/1.png" => ".klass_1", :x => 'right', :y => 'top', :width => '320px', :height => '240px'
34
+ _"sprite_images/sprite1/2.png" => ".klass_2"
35
+ end
36
+ end
37
+
38
+ assert_equal '.klass_2', sprites[:sprite2]["sprite_images/sprite1/2.png"].css_selector
39
+ assert_equal '.klass_1', sprites[:sprite2]["sprite_images/sprite1/1.png"].css_selector
40
+ assert_equal "240px", sprites[:sprite2]["sprite_images/sprite1/1.png"].height
41
+ assert_equal "320px", sprites[:sprite2]["sprite_images/sprite1/1.png"].width
42
+ assert_equal "top", sprites[:sprite2]["sprite_images/sprite1/1.png"].y
43
+ assert_equal 'right', sprites[:sprite2]["sprite_images/sprite1/1.png"].x
44
+ end
45
+
46
+ def test_raises_validation_error_when_path_is_blank
47
+ assert_raises ActiveAssets::ActiveSprites::SpritePiece::ValidationError do
48
+ Rails.application.sprites do
49
+ sprite :sprite2 do
50
+ _"" => ".klass_1"
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ def test_ordered
57
+ paths = []
58
+ Dir[Rails.root.join('public/images/sprite_images/sprite4/*.{png,gif,jpg}')].each do |path|
59
+ image_path = path.match(%r{^.*/public/images/(.*)$})[1]
60
+ paths << image_path
61
+ end
62
+
63
+ assert_equal paths, Rails.application.sprites['sprites/4.png'].sprite_pieces.map(&:path)
64
+ end
65
+ end
@@ -0,0 +1,53 @@
1
+ require 'helper'
2
+
3
+ class SpriteTest < Test::Unit::TestCase
4
+ def setup
5
+ initialize_application_or_load_sprites!
6
+ end
7
+
8
+ def teardown
9
+ tear_down_assets
10
+ end
11
+
12
+ def sprites
13
+ Rails.application.sprites
14
+ end
15
+
16
+ def test_underscore_method
17
+ assert_nothing_raised do
18
+ Rails.application.sprites do
19
+ sprite :foo do
20
+ _"sprite_images/foo/1.png" => '.my_klass'
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ def test_underscore_method_actually_adds_the_sp
27
+ Rails.application.sprites do
28
+ sprite :bar, :orientation => :horizontal do
29
+ _"sprite_images/foo/1.png" => '.my_klass'
30
+ end
31
+ end
32
+
33
+ path = "sprite_images/foo/1.png"
34
+ assert sprites[:bar].has_sprite_piece_with_path?(path)
35
+ assert_equal '.my_klass', sprites[:bar][path].css_selector
36
+ end
37
+
38
+ def test_sprite_validation
39
+ assert_raises ActiveAssets::ActiveSprites::Sprite::ValidationError do
40
+ Rails.application.sprites do
41
+ sprite ''
42
+ end
43
+ end
44
+ end
45
+
46
+ def test_raises_invalid_orientation
47
+ assert_raises ActiveAssets::ActiveSprites::Sprite::OrientationInvalid do
48
+ Rails.application.sprites do
49
+ sprite :bar, :orientation => :bad
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,35 @@
1
+ require 'helper'
2
+
3
+ class SpritesTest < Test::Unit::TestCase
4
+ def setup
5
+ initialize_application_or_load_sprites!
6
+ end
7
+
8
+ def teardown
9
+ tear_down_assets
10
+ end
11
+
12
+ def test_describe
13
+ assert Rails.application.sprites.kind_of?(ActiveAssets::ActiveSprites::Sprites)
14
+ end
15
+
16
+ def test_all
17
+ assert Rails.application.sprites.all.kind_of?(Array)
18
+ end
19
+
20
+ def test_sprite
21
+ assert_nothing_raised do
22
+ Rails.application.sprites do
23
+ sprite :foo
24
+ end
25
+ end
26
+ end
27
+
28
+ def test_sprite_with_mapping
29
+ Rails.application.sprites do
30
+ sprite 'sprites/global.png' => 'sprites/global.css'
31
+ end
32
+
33
+ assert_equal 'sprites/global.css', Rails.application.sprites['sprites/global.png'].stylesheet_path
34
+ end
35
+ end