spritely 0.3.2 → 1.0.0

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/spritely.rb +11 -34
  3. data/lib/spritely/collection.rb +12 -11
  4. data/lib/spritely/engine.rb +4 -0
  5. data/lib/spritely/generators/base.rb +0 -16
  6. data/lib/spritely/generators/chunky_png.rb +1 -4
  7. data/lib/spritely/image_set.rb +2 -2
  8. data/lib/spritely/sass_functions.rb +30 -29
  9. data/lib/spritely/sprite_map.rb +14 -31
  10. data/lib/spritely/sprockets/preprocessor.rb +65 -0
  11. data/lib/spritely/sprockets/transformer.rb +43 -0
  12. data/lib/spritely/version.rb +1 -1
  13. data/spec/fixtures/rails-app-changes/app/assets/stylesheets/sprites.css.scss +10 -18
  14. data/spec/fixtures/rails-app/app/assets/images/sprites/application.png.sprite +5 -0
  15. data/spec/fixtures/rails-app/app/assets/images/sprites/foo.png.sprite +1 -0
  16. data/spec/fixtures/rails-app/app/assets/stylesheets/sprites.css.scss +6 -14
  17. data/spec/fixtures/rails-app/app/assets/stylesheets/sprites_2.css.scss +4 -6
  18. data/spec/integration/precompilation_spec.rb +2 -14
  19. data/spec/spec_helper.rb +0 -4
  20. data/spec/spritely/collection_spec.rb +9 -8
  21. data/spec/spritely/generators/chunky_png_spec.rb +8 -13
  22. data/spec/spritely/image_set_spec.rb +2 -8
  23. data/spec/spritely/sass_functions_spec.rb +38 -37
  24. data/spec/spritely/sprite_map_spec.rb +16 -52
  25. data/spec/spritely/sprockets/preprocessor_spec.rb +33 -0
  26. data/spec/support/rails_app_helpers.rb +4 -5
  27. metadata +38 -49
  28. data/lib/generators/spritely/install_generator.rb +0 -17
  29. data/lib/spritely/adapters/sprockets_2.rb +0 -13
  30. data/lib/spritely/adapters/sprockets_3.rb +0 -11
  31. data/lib/spritely/cache.rb +0 -51
  32. data/lib/spritely/options.rb +0 -59
  33. data/lib/spritely/sprockets/manifest.rb +0 -20
  34. data/spec/generators/spritely/install_generator_spec.rb +0 -28
  35. data/spec/spritely/cache_spec.rb +0 -24
  36. data/spec/spritely/options_spec.rb +0 -29
  37. data/spec/spritely_spec.rb +0 -41
  38. data/spec/support/shared_examples.rb +0 -40
  39. data/spec/support/shared_examples/sprockets_2_sass_functions_helpers.rb +0 -13
  40. data/spec/support/shared_examples/sprockets_3_sass_functions_helpers.rb +0 -15
@@ -1,3 +1,3 @@
1
1
  module Spritely
2
- VERSION = "0.3.2"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -1,26 +1,18 @@
1
- $application-sprite: spritely-map("application/*.png",
2
- $background-repeat: true,
3
- $football-spacing: 100px,
4
- $mario-spacing: 10px,
5
- $mario-position: right,
6
- $spacing: 5px
7
- );
8
-
9
1
  body {
10
- background-image: spritely-url($application-sprite);
11
- background-position: spritely-position($application-sprite, "background");
2
+ background-image: spritely-url("application");
3
+ background-position: spritely-position("application", "background");
12
4
  }
13
5
 
14
6
  #mario {
15
- background-image: spritely-url($application-sprite);
16
- background-position: spritely-position($application-sprite, "mario");
17
- width: spritely-width($application-sprite, "mario");
18
- height: spritely-height($application-sprite, "mario");
7
+ background-image: spritely-url("application");
8
+ background-position: spritely-position("application", "mario");
9
+ width: spritely-width("application", "mario");
10
+ height: spritely-height("application", "mario");
19
11
  }
20
12
 
21
13
  #arrow {
22
- background-image: spritely-url($application-sprite);
23
- background-position: spritely-position($application-sprite, "dropdown-arrow");
24
- width: spritely-width($application-sprite, "dropdown-arrow");
25
- height: spritely-height($application-sprite, "dropdown-arrow");
14
+ background-image: spritely-url("application");
15
+ background-position: spritely-position("application", "dropdown-arrow");
16
+ width: spritely-width("application", "dropdown-arrow");
17
+ height: spritely-height("application", "dropdown-arrow");
26
18
  }
@@ -0,0 +1,5 @@
1
+ //= repeat background true
2
+ //= spacing football 100
3
+ //= spacing mario 10
4
+ //= position mario right
5
+ //= spacing 5
@@ -1,19 +1,11 @@
1
- $application-sprite: spritely-map("application/*.png",
2
- $background-repeat: true,
3
- $football-spacing: 100px,
4
- $mario-spacing: 10px,
5
- $mario-position: right,
6
- $spacing: 5px
7
- );
8
-
9
1
  body {
10
- background-image: spritely-url($application-sprite);
11
- background-position: spritely-position($application-sprite, "background");
2
+ background-image: spritely-url("application");
3
+ background-position: spritely-position("application", "background");
12
4
  }
13
5
 
14
6
  #mario {
15
- background-image: spritely-url($application-sprite);
16
- background-position: spritely-position($application-sprite, "mario");
17
- width: spritely-width($application-sprite, "mario");
18
- height: spritely-height($application-sprite, "mario");
7
+ background-image: spritely-url("application");
8
+ background-position: spritely-position("application", "mario");
9
+ width: spritely-width("application", "mario");
10
+ height: spritely-height("application", "mario");
19
11
  }
@@ -1,8 +1,6 @@
1
- $foo-sprite: spritely-map("foo/*.png", $spacing: 5px);
2
-
3
1
  #foo {
4
- background-image: spritely-url($foo-sprite);
5
- background-position: spritely-position($foo-sprite, "fool");
6
- width: spritely-width($foo-sprite, "fool");
7
- height: spritely-height($foo-sprite, "fool");
2
+ background-image: spritely-url("foo");
3
+ background-position: spritely-position("foo", "fool");
4
+ width: spritely-width("foo", "fool");
5
+ height: spritely-height("foo", "fool");
8
6
  }
@@ -1,14 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Precompilation', :integration do
4
- it 'should create the sprite in the right location' do
5
- render_asset('sprites.css')
6
- expect(File).to exist(File.join('app', 'assets', 'images', 'sprites', 'application.png'))
7
- end
8
-
9
4
  it 'should compile the correct-looking sprite file' do
10
5
  render_asset('sprites.css')
11
- compiled_sprite = ChunkyPNG::Image.from_file(File.join('app', 'assets', 'images', 'sprites', 'application.png'))
6
+ runner %~Rails.application.assets["sprites/application.png"].write_to("compiled-sprite.png")~
7
+ compiled_sprite = ChunkyPNG::Image.from_file('compiled-sprite.png')
12
8
  correct_sprite = ChunkyPNG::Image.from_file(File.join(__dir__, '..', 'fixtures', 'correct-sprite.png'))
13
9
  expect(compiled_sprite).to eq(correct_sprite)
14
10
  end
@@ -26,14 +22,6 @@ describe 'Precompilation', :integration do
26
22
  expect(sprite_files.length).to eq(1)
27
23
  end
28
24
 
29
- it 'should compile even if the sprite files no longer exist' do
30
- compile_assets
31
- FileUtils.rm_rf(Dir.glob(File.join('app', 'assets', 'images', 'sprites', '*.png')))
32
- compile_assets
33
- expect(File).to exist(File.join('app', 'assets', 'images', 'sprites', 'application.png'))
34
- expect(File).to exist(File.join('app', 'assets', 'images', 'sprites', 'foo.png'))
35
- end
36
-
37
25
  it 'should correctly compile a new sprite image and CSS when files change' do
38
26
  compile_assets
39
27
  FileUtils.cp_r "#{__dir__}/../fixtures/rails-app-changes/.", "."
@@ -1,6 +1,5 @@
1
1
  require 'rspec'
2
2
  require 'rspec/its'
3
- require 'generator_spec/generator_example_group'
4
3
  require 'spritely'
5
4
 
6
5
  require 'pry-byebug'
@@ -12,9 +11,6 @@ RSpec.configure do |config|
12
11
  c.syntax = :expect
13
12
  end
14
13
 
15
- config.include "Sprockets#{Spritely.sprockets_version}SassFunctionsHelpers".constantize, :sass_functions
16
-
17
14
  config.include RailsAppHelpers, :integration
18
- config.include GeneratorSpec::GeneratorExampleGroup, :generator
19
15
  config.around(:each, :integration) { |example| within_rails_app(&example) }
20
16
  end
@@ -4,15 +4,15 @@ describe Spritely::Collection do
4
4
  let(:first_set) { double(repeated?: true, name: 'foo', width: 1, outer_height: 10, images: [1]) }
5
5
  let(:second_set) { double(repeated?: false, name: 'bar', width: 100, outer_height: 100, images: [2, 3]) }
6
6
 
7
- subject { Spritely::Collection.new(['file-1.png', 'file-2.png'], {'file-1' => {repeat: true}}) }
7
+ subject { Spritely::Collection.new(['file-1.png', 'file-2.png'], { global: { spacing: '5' }, images: { 'file-1' => { repeat: 'true' } } }) }
8
8
 
9
9
  before do
10
- allow(Spritely::ImageSet).to receive(:new).with('file-1.png', repeat: true).and_return(first_set)
11
- allow(Spritely::ImageSet).to receive(:new).with('file-2.png', nil).and_return(second_set)
10
+ allow(Spritely::ImageSet).to receive(:new).with('file-1.png', repeat: 'true').and_return(first_set)
11
+ allow(Spritely::ImageSet).to receive(:new).with('file-2.png', spacing: '5').and_return(second_set)
12
12
  end
13
13
 
14
14
  its(:files) { should eq(['file-1.png', 'file-2.png']) }
15
- its(:options) { should eq({'file-1' => {repeat: true}}) }
15
+ its(:options) { should eq({ global: { spacing: '5' }, images: { 'file-1' => { repeat: 'true' } } }) }
16
16
  its(:images) { should eq([1, 2, 3]) }
17
17
  its(:height) { should eq(110) }
18
18
 
@@ -29,12 +29,12 @@ describe Spritely::Collection do
29
29
  describe '#width' do
30
30
  let(:third_set) { double(repeated?: false, width: 65, height: 100) }
31
31
 
32
- subject { Spritely::Collection.new(['file-1.png', 'file-2.png', 'file-3.png'], {}) }
32
+ subject { Spritely::Collection.new(['file-1.png', 'file-2.png', 'file-3.png'], { global: {}, images: {} }) }
33
33
 
34
34
  before do
35
- allow(Spritely::ImageSet).to receive(:new).with('file-1.png', nil).and_return(first_set)
36
- allow(Spritely::ImageSet).to receive(:new).with('file-2.png', nil).and_return(second_set)
37
- allow(Spritely::ImageSet).to receive(:new).with('file-3.png', nil).and_return(third_set)
35
+ allow(Spritely::ImageSet).to receive(:new).with('file-1.png', {}).and_return(first_set)
36
+ allow(Spritely::ImageSet).to receive(:new).with('file-2.png', {}).and_return(second_set)
37
+ allow(Spritely::ImageSet).to receive(:new).with('file-3.png', {}).and_return(third_set)
38
38
  end
39
39
 
40
40
  its(:width) { should eq(100) }
@@ -77,6 +77,7 @@ describe Spritely::Collection do
77
77
  end
78
78
 
79
79
  its(:cache_key) { should eq('foobar') }
80
+ its(:to_s) { should eq('foobar') }
80
81
  end
81
82
 
82
83
  describe '#position!' do
@@ -1,32 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spritely::Generators::ChunkyPng do
4
- let(:png_canvas) { double(metadata: {}) }
4
+ let(:png_canvas) { double(metadata: {}, to_blob: "final PNG content") }
5
+ let(:images) { [OpenStruct.new(data: 'first image data', left: 1, top: 10), OpenStruct.new(data: 'second image data', left: 2, top: 20)] }
6
+ let(:sprite_map) { double(images: images, width: 100, height: 200, filename: 'blah.png', cache_key: 'cachevalue') }
5
7
 
6
8
  subject { Spritely::Generators::ChunkyPng.new(sprite_map) }
7
9
 
8
- include_examples "a generator"
9
-
10
10
  before { allow(::ChunkyPNG::Image).to receive(:new).with(100, 200).and_return(png_canvas) }
11
11
 
12
+ its(:sprite_map) { should eq(sprite_map) }
13
+
12
14
  describe '#build!' do
13
15
  before do
14
16
  allow(::ChunkyPNG::Image).to receive(:from_blob).with('first image data').and_return('first image chunk')
15
17
  allow(::ChunkyPNG::Image).to receive(:from_blob).with('second image data').and_return('second image chunk')
16
18
  end
17
19
 
18
- it 'should append each image to the PNG canvas' do
20
+ it 'should append each image to the PNG canvas and output to string' do
19
21
  expect(png_canvas).to receive(:replace!).with('first image chunk', 1, 10)
20
22
  expect(png_canvas).to receive(:replace!).with('second image chunk', 2, 20)
21
- subject.build!
22
- end
23
- end
24
-
25
- describe '#save!' do
26
- it 'should save the PNG canvas' do
27
- expect(png_canvas).to receive(:save).with('blah.png', :fast_rgba)
28
- subject.save!
29
- expect(png_canvas.metadata).to include('cache_key' => 'cachevalue')
23
+ expect(png_canvas).to receive(:to_blob).with(:fast_rgba)
24
+ expect(subject.build!).to eq('final PNG content')
30
25
  end
31
26
  end
32
27
  end
@@ -3,7 +3,7 @@ require 'ostruct'
3
3
 
4
4
  describe Spritely::ImageSet do
5
5
  let(:path) { "#{__dir__}/../fixtures/test/foo.png" }
6
- let(:options) { {repeat: true, spacing: 10, position: 'right'} }
6
+ let(:options) { {repeat: 'true', spacing: '10', position: 'right'} }
7
7
 
8
8
  subject { Spritely::ImageSet.new(path, options) }
9
9
 
@@ -26,12 +26,6 @@ describe Spritely::ImageSet do
26
26
  describe '#repeated?' do
27
27
  it { should be_repeated }
28
28
 
29
- context 'repeat option is passed as truthy' do
30
- let(:options) { {repeat: 'repeat'} }
31
-
32
- it { should be_repeated }
33
- end
34
-
35
29
  context 'repeat option is passed as false' do
36
30
  let(:options) { {repeat: false} }
37
31
 
@@ -85,7 +79,7 @@ describe Spritely::ImageSet do
85
79
  end
86
80
 
87
81
  context 'it is also positioned to the right' do
88
- let(:options) { {position: 'right', repeat: true} }
82
+ let(:options) { {position: 'right', repeat: 'true'} }
89
83
 
90
84
  its(:left) { should eq(0) }
91
85
 
@@ -1,54 +1,45 @@
1
1
  require 'spec_helper'
2
2
  require 'sprockets'
3
- require 'ostruct'
4
3
 
5
- describe Spritely::SassFunctions, :sass_functions do
6
- class SpriteMapDouble < Sass::Script::Literal
7
- def name; 'test'; end
8
- def filename; 'test.png'; end
9
- def files; []; end
10
- end
11
-
12
- let(:directory) { __dir__ }
13
- let(:sprite_map) { SpriteMapDouble.new }
4
+ describe Spritely::SassFunctions do
5
+ let(:asset) { double(metadata: { sprite_directives: 'directives' }) }
6
+ let(:sprite_map) { double(name: 'test') }
14
7
  let(:image) { double(left: 10, top: 12, width: 25, height: 50) }
15
8
 
16
9
  before do
17
- allow(Spritely).to receive(:directory).and_return(directory)
18
- allow(Spritely).to receive_message_chain(:sprockets_adapter, :reset_cache!)
19
- allow(Spritely::SpriteMap).to receive(:create).and_return(sprite_map)
10
+ allow(sprockets_environment).to receive(:find_asset).with('sprites/test.png.sprite').and_return(asset)
11
+ allow(Spritely::SpriteMap).to receive(:new).with('test', sprockets_environment, 'directives').and_return(sprite_map)
20
12
  allow(sprite_map).to receive(:find).with('bar').and_return(image)
21
13
  end
22
14
 
23
- shared_examples "a sprite function that checks image existence" do
24
- let(:image) { nil }
15
+ shared_examples "a sprite function that checks sprite map and image existence" do
16
+ context "the sprite map doesn't exist" do
17
+ let(:asset) { nil }
25
18
 
26
- it 'should raise a nice exception' do
27
- expect { subject }.to raise_error(Sass::SyntaxError, "No image 'bar' found in sprite map 'test'.")
19
+ it 'should raise a nice exception' do
20
+ expect { subject }.to raise_error(Sass::SyntaxError, "No sprite map 'test' found.")
21
+ end
28
22
  end
29
- end
30
23
 
31
- shared_examples "a sprite function that resets the sprockets directory caches" do
32
- it 'should clear the Sprockets cache' do
33
- subject
24
+ context "the image doesn't exist in the sprite map" do
25
+ let(:image) { nil }
34
26
 
35
- expect(Spritely.sprockets_adapter).to have_received(:reset_cache!).with(sprockets_environment, 'test.png')
27
+ it 'should raise a nice exception' do
28
+ expect { subject }.to raise_error(Sass::SyntaxError, "No image 'bar' found in sprite map 'test'.")
29
+ end
36
30
  end
37
31
  end
38
32
 
39
33
  describe '#spritely_url' do
40
- subject { evaluate(".background-image { background-image: spritely-url(spritely-map('test/*.png')); }") }
41
-
42
- it_should_behave_like "a sprite function that resets the sprockets directory caches"
34
+ subject { evaluate(".background-image { background-image: spritely-url('test'); }") }
43
35
 
44
36
  it { should eq(".background-image {\n background-image: url(sprites/test.png); }\n") }
45
37
  end
46
38
 
47
39
  describe '#spritely_position' do
48
- subject { evaluate(".background-position { background-position: spritely-position(spritely-map('test/*.png'), 'bar'); }") }
40
+ subject { evaluate(".background-position { background-position: spritely-position('test', 'bar'); }") }
49
41
 
50
- it_should_behave_like "a sprite function that checks image existence"
51
- it_should_behave_like "a sprite function that resets the sprockets directory caches"
42
+ it_should_behave_like "a sprite function that checks sprite map and image existence"
52
43
 
53
44
  it { should eq(".background-position {\n background-position: -10px -12px; }\n") }
54
45
 
@@ -60,29 +51,39 @@ describe Spritely::SassFunctions, :sass_functions do
60
51
  end
61
52
 
62
53
  describe '#spritely_background' do
63
- subject { evaluate(".background { background: spritely-background(spritely-map('test/*.png'), 'bar'); }") }
54
+ subject { evaluate(".background { background: spritely-background('test', 'bar'); }") }
64
55
 
65
- it_should_behave_like "a sprite function that checks image existence"
66
- it_should_behave_like "a sprite function that resets the sprockets directory caches"
56
+ it_should_behave_like "a sprite function that checks sprite map and image existence"
67
57
 
68
58
  it { should eq(".background {\n background: url(sprites/test.png) -10px -12px; }\n") }
69
59
  end
70
60
 
71
61
  describe '#spritely_width' do
72
- subject { evaluate(".width { width: spritely-width(spritely-map('test/*.png'), 'bar'); }") }
62
+ subject { evaluate(".width { width: spritely-width('test', 'bar'); }") }
73
63
 
74
- it_should_behave_like "a sprite function that checks image existence"
75
- it_should_behave_like "a sprite function that resets the sprockets directory caches"
64
+ it_should_behave_like "a sprite function that checks sprite map and image existence"
76
65
 
77
66
  it { should eq(".width {\n width: 25px; }\n") }
78
67
  end
79
68
 
80
69
  describe '#spritely_height' do
81
- subject { evaluate(".height { height: spritely-height(spritely-map('test/*.png'), 'bar'); }") }
70
+ subject { evaluate(".height { height: spritely-height('test', 'bar'); }") }
82
71
 
83
- it_should_behave_like "a sprite function that checks image existence"
84
- it_should_behave_like "a sprite function that resets the sprockets directory caches"
72
+ it_should_behave_like "a sprite function that checks sprite map and image existence"
85
73
 
86
74
  it { should eq(".height {\n height: 50px; }\n") }
87
75
  end
76
+
77
+ def evaluate(value)
78
+ Sprockets::ScssProcessor.call(environment: sprockets_environment, data: value, filename: "test.scss", metadata: {}, cache: Sprockets::Cache.new)[:data]
79
+ end
80
+
81
+ def sprockets_environment
82
+ @sprockets_environment ||= Sprockets::CachedEnvironment.new(Sprockets::Environment.new).tap do |sprockets_environment|
83
+ sprockets_environment.context_class.class_eval do
84
+ def link_asset(path); end
85
+ def asset_path(path, options = {}); path; end
86
+ end
87
+ end
88
+ end
88
89
  end
@@ -1,48 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spritely::SpriteMap do
4
- let(:options_hash) { {'some_new_image_x' => 123, 'some_new_image_y' => 456, 'another_image_repeat' => true} }
5
- let(:options_object) { double(options: 'options', cache_key: 'options') }
4
+ let(:options) { { global: {}, images: { 'some-new-image' => { x: '123', y: '456' }, 'another-image' => { repeat: 'true' } } } }
5
+ let(:environment) { double(paths: ["#{__dir__}/../fixtures"]) }
6
6
 
7
- subject { Spritely::SpriteMap.new('test/*.png', options_hash) }
7
+ subject { Spritely::SpriteMap.new('test', environment, options) }
8
8
 
9
- before do
10
- allow(Spritely).to receive_message_chain(:environment, :paths).and_return(["#{__dir__}/../fixtures"])
11
- allow(Spritely).to receive(:directory).and_return(File)
12
- allow(Spritely::Options).to receive(:new).with(options_hash).and_return(options_object)
13
- end
14
-
15
- it { should be_a(Sass::Script::Literal) }
16
-
17
- its(:glob) { should eq('test/*.png') }
18
- its(:options) { should eq(options_object) }
19
9
  its(:name) { should eq('test') }
20
- its(:filename) { should eq('test.png') }
21
- its(:inspect) { should eq("#<Spritely::SpriteMap name=test options=#{options_object}>") }
22
-
23
- describe '.create' do
24
- let(:sprite_map) { double(needs_generation?: true) }
25
-
26
- it 'should attempt to generate the sprite' do
27
- allow(Spritely::SpriteMap).to receive(:new).with('test/*.png').and_return(sprite_map)
28
- expect(sprite_map).to receive(:generate!)
29
- Spritely::SpriteMap.create('test/*.png')
30
- end
31
- end
10
+ its(:glob) { should eq('test/*.png') }
11
+ its(:environment) { should eq(environment) }
12
+ its(:options) { should eq(options) }
13
+ its(:inspect) { should eq("#<Spritely::SpriteMap name=test options=#{options}>") }
32
14
 
33
15
  describe '#cache_key' do
34
- before do
35
- allow(subject).to receive(:collection).and_return('collection value')
36
- allow(Spritely::Cache).to receive(:generate).with(options_object, 'collection value').and_return('cache value')
37
- end
16
+ before { allow(subject).to receive(:collection).and_return(double(to_s: 'collection cache value')) }
38
17
 
39
- its(:cache_key) { should eq('cache value') }
18
+ its(:cache_key) { should eq('d9e141f6c3f40279f579b62a201c8f72') }
40
19
  end
41
20
 
42
21
  describe '#collection' do
43
22
  let(:collection) { double(find: 'find value', width: 'width value', height: 'height value', images: 'images value') }
44
23
 
45
- before { allow(Spritely::Collection).to receive(:create).with(["#{__dir__}/../fixtures/test/foo.png"], options_object).and_return(collection) }
24
+ before { allow(Spritely::Collection).to receive(:create).with(["#{__dir__}/../fixtures/test/foo.png"], options).and_return(collection) }
46
25
 
47
26
  its(:collection) { should eq(collection) }
48
27
 
@@ -54,29 +33,14 @@ describe Spritely::SpriteMap do
54
33
  end
55
34
  end
56
35
 
57
- describe '#generate!' do
58
- it 'should start the ChunkyPNG generator' do
59
- expect(Spritely::Generators::ChunkyPng).to receive(:create!).with(subject)
60
- subject.generate!
61
- end
62
- end
63
-
64
- describe '#needs_generation?' do
65
- let(:file_exists) { false }
36
+ describe '#save!' do
37
+ let(:generator) { double }
66
38
 
67
- before { allow(File).to receive(:exist?).with('test.png').and_return(file_exists) }
68
-
69
- its(:needs_generation?) { should be_truthy }
70
-
71
- context 'the sprite file already exists' do
72
- let(:file_exists) { true }
73
-
74
- before do
75
- allow(subject).to receive(:cache_key).and_return('value')
76
- allow(Spritely::Cache).to receive(:busted?).with('test.png', 'value').and_return(true)
77
- end
39
+ it 'should start the ChunkyPNG generator' do
40
+ expect(Spritely::Generators::ChunkyPng).to receive(:new).with(subject).and_return(generator)
41
+ expect(generator).to receive(:build!)
78
42
 
79
- its(:needs_generation?) { should be_truthy }
43
+ subject.save!
80
44
  end
81
45
  end
82
46