montage 0.2.1

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 (65) hide show
  1. data/.document +5 -0
  2. data/.gitignore +31 -0
  3. data/History.md +40 -0
  4. data/LICENSE +19 -0
  5. data/README.md +89 -0
  6. data/Rakefile +41 -0
  7. data/VERSION +1 -0
  8. data/bin/montage +22 -0
  9. data/lib/montage.rb +33 -0
  10. data/lib/montage/commands.rb +32 -0
  11. data/lib/montage/commands/generate.rb +234 -0
  12. data/lib/montage/commands/init.rb +119 -0
  13. data/lib/montage/core_ext.rb +80 -0
  14. data/lib/montage/project.rb +185 -0
  15. data/lib/montage/sass_builder.rb +37 -0
  16. data/lib/montage/source.rb +75 -0
  17. data/lib/montage/sprite.rb +132 -0
  18. data/lib/montage/templates/montage.yml +26 -0
  19. data/lib/montage/templates/sass_mixins.erb +20 -0
  20. data/lib/montage/templates/sources/book.png +0 -0
  21. data/lib/montage/templates/sources/box-label.png +0 -0
  22. data/lib/montage/templates/sources/calculator.png +0 -0
  23. data/lib/montage/templates/sources/calendar-month.png +0 -0
  24. data/lib/montage/templates/sources/camera.png +0 -0
  25. data/lib/montage/templates/sources/eraser.png +0 -0
  26. data/lib/montage/version.rb +3 -0
  27. data/montage.gemspec +145 -0
  28. data/spec/fixtures/custom_dirs/montage.yml +8 -0
  29. data/spec/fixtures/default/montage.yml +7 -0
  30. data/spec/fixtures/default/public/images/sprites/src/one.png +0 -0
  31. data/spec/fixtures/default/public/images/sprites/src/three.png +0 -0
  32. data/spec/fixtures/default/public/images/sprites/src/two.png +0 -0
  33. data/spec/fixtures/directory_config/config/montage.yml +5 -0
  34. data/spec/fixtures/missing_source/montage.yml +3 -0
  35. data/spec/fixtures/missing_source_dir/montage.yml +5 -0
  36. data/spec/fixtures/root_config/montage.yml +5 -0
  37. data/spec/fixtures/root_config/public/images/sprites/src/source_one.png +0 -0
  38. data/spec/fixtures/root_config/public/images/sprites/src/source_three.jpg +0 -0
  39. data/spec/fixtures/root_config/public/images/sprites/src/source_two +0 -0
  40. data/spec/fixtures/sources/hundred.png +0 -0
  41. data/spec/fixtures/sources/mammoth.png +0 -0
  42. data/spec/fixtures/sources/other.png +0 -0
  43. data/spec/fixtures/sources/twenty.png +0 -0
  44. data/spec/fixtures/subdirs/montage.yml +5 -0
  45. data/spec/fixtures/subdirs/sub/sub/keep +0 -0
  46. data/spec/lib/command_runner.rb +140 -0
  47. data/spec/lib/fixtures.rb +7 -0
  48. data/spec/lib/have_public_method_defined.rb +19 -0
  49. data/spec/lib/project_helper.rb +135 -0
  50. data/spec/lib/shared_project_specs.rb +32 -0
  51. data/spec/lib/shared_sprite_specs.rb +30 -0
  52. data/spec/montage/commands/generate_spec.rb +308 -0
  53. data/spec/montage/commands/init_spec.rb +120 -0
  54. data/spec/montage/core_ext_spec.rb +33 -0
  55. data/spec/montage/project_spec.rb +181 -0
  56. data/spec/montage/sass_builder_spec.rb +269 -0
  57. data/spec/montage/source_spec.rb +53 -0
  58. data/spec/montage/spec/have_public_method_defined_spec.rb +31 -0
  59. data/spec/montage/sprite_spec.rb +170 -0
  60. data/spec/rcov.opts +8 -0
  61. data/spec/spec.opts +4 -0
  62. data/spec/spec_helper.rb +19 -0
  63. data/tasks/spec.rake +17 -0
  64. data/tasks/yard.rake +11 -0
  65. metadata +249 -0
@@ -0,0 +1,120 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ # ----------------------------------------------------------------------------
4
+
5
+ context 'Generating a new project in the current directory' do
6
+ before(:all) do
7
+ @runner = Montage::Spec::InitCommandRunner.new.run!
8
+ end
9
+
10
+ it { @runner.should be_success }
11
+ it { @runner.stdout.should =~ /Your project was created/ }
12
+ it { @runner.path_to_file('montage.yml').should be_file }
13
+
14
+ # Example sources?
15
+
16
+ it 'should copy the sample source images' do
17
+ %w( book box-label calculator calendar-month camera eraser ).each do |source|
18
+ (@runner.project.paths.sources + "#{source}.png").should be_file
19
+ end
20
+ end
21
+
22
+ # Config
23
+
24
+ describe 'the montage.yml file' do
25
+ before(:all) do
26
+ @config = File.read(@runner.project.paths.config)
27
+ end
28
+
29
+ it { @config.should =~ %r{^ config.sprites:\s+"public/images/sprites"$} }
30
+ it { @config.should =~ %r{^ config.sources:\s+"public/images/sprites/src"$} }
31
+ end
32
+ end
33
+
34
+ # ----------------------------------------------------------------------------
35
+
36
+ context 'Generating a new project in a path which has a ./config directory' do
37
+ before(:all) do
38
+ @runner = Montage::Spec::InitCommandRunner.new
39
+ @runner.mkdir('config')
40
+ @runner.run!
41
+ end
42
+
43
+ it { @runner.should be_success }
44
+ it { @runner.stdout.should =~ /Your project was created/ }
45
+ it { @runner.path_to_file('config/montage.yml').should be_file }
46
+ it { @runner.path_to_file('montage.yml').should_not be_file }
47
+ end
48
+
49
+ # ----------------------------------------------------------------------------
50
+
51
+ context 'Generating a new project in an existing project directory' do
52
+ before(:all) do
53
+ @runner = Montage::Spec::InitCommandRunner.new
54
+ 2.times { @runner.run! }
55
+ end
56
+
57
+ it { @runner.should be_failure }
58
+ it { @runner.stdout.should =~ /A Montage project already exists in the current directory/ }
59
+ end
60
+
61
+ # ----------------------------------------------------------------------------
62
+
63
+ context 'Generating a new project in an existing project which has a ./config directory' do
64
+ before(:all) do
65
+ @runner = Montage::Spec::InitCommandRunner.new
66
+ @runner.mkdir('config')
67
+ 2.times { @runner.run! }
68
+ end
69
+
70
+ it { @runner.should be_failure }
71
+ it { @runner.stdout.should =~ /A Montage project already exists in the current directory/ }
72
+ end
73
+
74
+ # ----------------------------------------------------------------------------
75
+
76
+ context 'Generating a new project with a custom sprites directory' do
77
+ describe 'the montage.yml file' do
78
+ before(:all) do
79
+ @runner = Montage::Spec::InitCommandRunner.new(
80
+ :sprites => 'public/other').run!
81
+
82
+ @config = File.read(@runner.project.paths.config)
83
+ end
84
+
85
+ it { @config.should =~ %r{^ config.sprites:\s+"public/other"$} }
86
+ it { @config.should =~ %r{^ config.sources:\s+"public/other/src"$} }
87
+ end
88
+ end
89
+
90
+ # ----------------------------------------------------------------------------
91
+
92
+ context 'Generating a new project with an absolute custom sprites directory' do
93
+ describe 'the montage.yml file' do
94
+ before(:all) do
95
+ @runner = Montage::Spec::InitCommandRunner.new(
96
+ :sprites => '/tmp').run!
97
+
98
+ @config = File.read(@runner.project.paths.config)
99
+ end
100
+
101
+ it { @config.should =~ %r{^ config.sprites:\s+"/tmp"$} }
102
+ it { @config.should =~ %r{^ config.sources:\s+"/tmp/src"$} }
103
+ end
104
+ end
105
+
106
+ # ----------------------------------------------------------------------------
107
+
108
+ context 'Generating a new project with a custom sprites and sources directory' do
109
+ describe 'the montage.yml file' do
110
+ before(:all) do
111
+ @runner = Montage::Spec::InitCommandRunner.new(
112
+ :sprites => 'public/other', :sources => 'src/sprites').run!
113
+
114
+ @config = File.read(@runner.project.paths.config)
115
+ end
116
+
117
+ it { @config.should =~ %r{^ config.sprites:\s+"public/other"$} }
118
+ it { @config.should =~ %r{^ config.sources:\s+"src/sprites"$} }
119
+ end
120
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe String do
4
+ it 'should not do anything when there is no leading whitespace' do
5
+ "abc\ndef\nhij".unindent.should == "abc\ndef\nhij"
6
+ end
7
+
8
+ it 'should remove leading whitespace consistently' do
9
+ " abc\n def\n hij".unindent.should == "abc\ndef\nhij"
10
+ end
11
+
12
+ it 'should remove no whitespace when one line has none' do
13
+ " abc\ndef\n hij".unindent.should == " abc\ndef\n hij"
14
+ end
15
+
16
+ it 'should ignore blank lines' do
17
+ " abc\n def\n\n hij".unindent.should == "abc\ndef\n\nhij"
18
+ end
19
+
20
+ it 'should remove no more whitespace than required' do
21
+ # Left-most at beginning.
22
+ unindented = " abc\n def\n hij\n lmn".unindent
23
+ unindented.should == "abc\n def\n hij\n lmn"
24
+
25
+ # Left-most in middle.
26
+ unindented = " abc\n def\n hij\n lmn".unindent
27
+ unindented.should == " abc\n def\nhij\n lmn"
28
+
29
+ # Left-most at end.
30
+ unindented = " abc\n def\n hij\n lmn".unindent
31
+ unindented.should == " abc\n def\n hij\nlmn"
32
+ end
33
+ end
@@ -0,0 +1,181 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe Montage::Project do
4
+ subject { Montage::Project }
5
+
6
+ # Class Methods ============================================================
7
+
8
+ # --- find -----------------------------------------------------------------
9
+
10
+ it { should respond_to(:find) }
11
+
12
+ describe '.find' do
13
+ describe 'when given a project root with montage.yml in the root' do
14
+ before(:all) do
15
+ @project = Montage::Project.find(fixture_path(:root_config))
16
+ @root = Pathname.new(fixture_path(:root_config))
17
+ @config = Pathname.new(fixture_path(:root_config, 'montage.yml'))
18
+ end
19
+
20
+ it_should_behave_like 'a project with correct paths'
21
+ end # when given a project root with montage.yml in the root
22
+
23
+ describe 'when given a project root with montage.yml in ./config' do
24
+ before(:all) do
25
+ @project = Montage::Project.find(fixture_path(:directory_config))
26
+ @root = Pathname.new(fixture_path(:directory_config))
27
+ @config = Pathname.new(
28
+ fixture_path(:directory_config, 'config/montage.yml'))
29
+ end
30
+
31
+ it_should_behave_like 'a project with correct paths'
32
+ end # when given a project root with montage.yml in ./config
33
+
34
+ describe 'when given a project subdirectory' do
35
+ before(:all) do
36
+ @project = Montage::Project.find(fixture_path(:subdirs, 'sub/sub'))
37
+ @root = Pathname.new(fixture_path(:subdirs))
38
+ @config = Pathname.new(fixture_path(:subdirs, 'montage.yml'))
39
+ end
40
+
41
+ it_should_behave_like 'a project with correct paths'
42
+ end # when given a project subdirectory
43
+
44
+ describe 'when given a configuration file in the root' do
45
+ before(:all) do
46
+ @project = Montage::Project.find(
47
+ fixture_path(:root_config, 'montage.yml'))
48
+
49
+ @root = Pathname.new(fixture_path(:root_config))
50
+ @config = Pathname.new(fixture_path(:root_config, 'montage.yml'))
51
+ end
52
+
53
+ it_should_behave_like 'a project with correct paths'
54
+ end # when given a configuration file in the root
55
+
56
+ describe 'when given a configuration file in ./config' do
57
+ before(:all) do
58
+ @project = Montage::Project.find(
59
+ fixture_path(:directory_config, 'config/montage.yml'))
60
+ @root = Pathname.new(fixture_path(:directory_config))
61
+ @config = Pathname.new(
62
+ fixture_path(:directory_config, 'config/montage.yml'))
63
+ end
64
+
65
+ it_should_behave_like 'a project with correct paths'
66
+ end # when given a configuration file in ./config
67
+
68
+ describe 'when the config file specifies custom directories' do
69
+ before(:all) do
70
+ @project = Montage::Project.find(fixture_path(:custom_dirs))
71
+ @base = Pathname.new(fixture_path(:custom_dirs)) + 'custom'
72
+ end
73
+
74
+ it 'should set the sources path' do
75
+ @project.paths.sources.should == @base + 'sources'
76
+ end
77
+
78
+ it 'should set the sprites path' do
79
+ @project.paths.sprites.should == @base + 'output'
80
+ end
81
+
82
+ it 'should set the SASS output path' do
83
+ @project.paths.sass.should == @base + 'sass'
84
+ end
85
+ end
86
+
87
+ describe 'when the config file specifies not to generate Sass' do
88
+ before(:all) do
89
+ @helper = Montage::Spec::ProjectHelper.new
90
+ @helper.write_config <<-CONFIG
91
+ ---
92
+ config.sass: false
93
+ CONFIG
94
+ end
95
+
96
+ it 'should set the SASS output path to false' do
97
+ @helper.project.paths.sass.should be_false
98
+ end
99
+ end
100
+
101
+ describe 'when given an empty directory' do
102
+ it 'should raise an error' do
103
+ running = lambda { Montage::Project.find(fixture_path(:empty)) }
104
+ running.should raise_exception(Montage::MissingProject)
105
+ end
106
+ end # when given an empty directory
107
+
108
+ describe 'when given an invalid path' do
109
+ it 'should raise an error' do
110
+ running = lambda { Montage::Project.find('__invalid__') }
111
+ running.should raise_exception(Montage::MissingProject)
112
+ end
113
+ end # when given an invalid path
114
+ end
115
+
116
+ # Instance Methods =========================================================
117
+
118
+ it { should have_public_method_defined(:paths) }
119
+
120
+ # --- sprites --------------------------------------------------------------
121
+
122
+ it { should have_public_method_defined(:sprites) }
123
+
124
+ describe '#sprites' do
125
+ context "when the project has one sprite with two sources" do
126
+ before(:each) do
127
+ @helper = Montage::Spec::ProjectHelper.new
128
+ @helper.write_config <<-CONFIG
129
+ ---
130
+ sprite_one:
131
+ - one
132
+ - two
133
+ CONFIG
134
+
135
+ @helper.write_source('one', 100, 25)
136
+ @helper.write_source('two', 100, 25)
137
+ end
138
+
139
+ it 'should return an array with one element' do
140
+ @helper.project.sprites.should have(1).sprite
141
+ end
142
+
143
+ it 'should have two sources in the sprite' do
144
+ @helper.project.sprites.first.should have(2).sources
145
+ end
146
+ end # when the project has one sprite with two sources
147
+
148
+ context "when the project has two sprites with 2/1 sources" do
149
+ before(:each) do
150
+ @helper = Montage::Spec::ProjectHelper.new
151
+ @helper.write_config <<-CONFIG
152
+ ---
153
+ sprite_one:
154
+ - one
155
+ - two
156
+
157
+ sprite_two:
158
+ - three
159
+ CONFIG
160
+
161
+ @helper.write_source('one', 100, 25)
162
+ @helper.write_source('two', 100, 25)
163
+ @helper.write_source('three', 100, 25)
164
+ end
165
+
166
+ it 'should return an array with two elements' do
167
+ @helper.project.sprites.should have(2).sprite
168
+ end
169
+
170
+ it 'should have two sources in the first sprite' do
171
+ @helper.project.sprite('sprite_one').should have(2).sources
172
+ end
173
+
174
+ it 'should have one source in the second sprite' do
175
+ @helper.project.sprite('sprite_two').should have(1).sources
176
+ end
177
+ end # when the project has one sprite with two sources
178
+
179
+ end
180
+
181
+ end
@@ -0,0 +1,269 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe Montage::SassBuilder do
4
+ subject { Montage::SassBuilder }
5
+
6
+ # --- write ----------------------------------------------------------------
7
+
8
+ it { should have_public_method_defined(:write) }
9
+
10
+ describe '#write' do
11
+ before(:each) do
12
+ @helper = Montage::Spec::ProjectHelper.new
13
+ end
14
+
15
+ context 'with a project containing a single sprite and two sources' do
16
+ before(:each) do
17
+ @helper.write_config <<-CONFIG
18
+ ---
19
+ only:
20
+ - one
21
+ - two
22
+ CONFIG
23
+
24
+ @helper.write_source('one')
25
+ @helper.write_source('two')
26
+
27
+ Montage::SassBuilder.new(@helper.project).write
28
+
29
+ @sass_path = @helper.path_to_file(
30
+ 'public/stylesheets/sass/_montage.sass')
31
+
32
+ if @sass_path.file?
33
+ @sass = File.read(@helper.path_to_file(
34
+ 'public/stylesheets/sass/_montage.sass'))
35
+ else
36
+ @sass = 'MISSING SASS FILE'
37
+ end
38
+ end
39
+
40
+ it 'should save the Sass file' do
41
+ @sass_path.should be_file
42
+ end
43
+
44
+ it 'should contain the sprite mixin' do
45
+ @sass.should =~ /^=only-sprite/
46
+ end
47
+
48
+ it 'should include a condition for the "one" source' do
49
+ expected = Regexp.escape(
50
+ %[ @if $icon == "one"\n] +
51
+ %[ $y_offset: $y_offset - 0px])
52
+
53
+ @sass.should =~ /^#{expected}/
54
+ end
55
+
56
+ it 'should include a condition for the "two" source' do
57
+ expected = Regexp.escape(
58
+ %[ @else if $icon == "two"\n] +
59
+ %[ $y_offset: $y_offset - #{20 + @helper.project.padding}px])
60
+
61
+ @sass.should =~ /^#{expected}/
62
+ end
63
+
64
+ it 'should include the background statement' do
65
+ @sass.should include(
66
+ " background: url(/images/sprites/only.png)")
67
+ end
68
+
69
+ describe 'the generated mixins' do
70
+ it 'should correctly position the first source' do
71
+ sass = Sass::Engine.new(<<-SASS.unindent).render
72
+ @import #{@helper.project.paths.sass.realpath + '_montage.sass'}
73
+
74
+ .rule
75
+ +only-sprite("one")
76
+ SASS
77
+
78
+ sass.should include(
79
+ 'background: url(/images/sprites/only.png) 0px 0px no-repeat')
80
+ end
81
+
82
+ it 'should correctly position the second source' do
83
+ sass = Sass::Engine.new(<<-SASS.unindent).render
84
+ @import #{@helper.project.paths.sass.realpath + '_montage.sass'}
85
+
86
+ .rule
87
+ +only-sprite("two")
88
+ SASS
89
+
90
+ sass.should include(
91
+ 'background: url(/images/sprites/only.png) 0px -40px no-repeat')
92
+ end
93
+
94
+ it 'should apply x-offsets' do
95
+ sass = Sass::Engine.new(<<-SASS.unindent).render
96
+ @import #{@helper.project.paths.sass.realpath + '_montage.sass'}
97
+
98
+ .rule
99
+ +only-sprite("one", 5px)
100
+ SASS
101
+
102
+ sass.should include(
103
+ 'background: url(/images/sprites/only.png) 5px 0px no-repeat')
104
+ end
105
+
106
+ it 'should apply y-offsets' do
107
+ sass = Sass::Engine.new(<<-SASS.unindent).render
108
+ @import #{@helper.project.paths.sass.realpath + '_montage.sass'}
109
+
110
+ .rule
111
+ +only-sprite("two", 0px, -10px)
112
+ SASS
113
+
114
+ # -20px (source one) - 20px (padding) - 10px (third arg) = -50px
115
+ sass.should include(
116
+ 'background: url(/images/sprites/only.png) 0px -50px no-repeat')
117
+ end
118
+ end
119
+ end # with a project containing a single sprite and two sources
120
+
121
+ context 'with a project containing two sprites, each with two sources' do
122
+ before(:each) do
123
+ @helper.write_config <<-CONFIG
124
+ ---
125
+ first:
126
+ - one
127
+ - two
128
+
129
+ second:
130
+ - three
131
+ - four
132
+ CONFIG
133
+
134
+ %w( one two three four ).each do |source|
135
+ @helper.write_source(source)
136
+ end
137
+
138
+ Montage::SassBuilder.new(@helper.project).write
139
+
140
+ @sass_path = @helper.path_to_file(
141
+ 'public/stylesheets/sass/_montage.sass')
142
+
143
+ if @sass_path.file?
144
+ @sass = File.read(@helper.path_to_file(
145
+ 'public/stylesheets/sass/_montage.sass'))
146
+ else
147
+ @sass = 'MISSING SASS FILE'
148
+ end
149
+ end
150
+
151
+ it 'should save the Sass file' do
152
+ @sass_path.should be_file
153
+ end
154
+
155
+ it 'should contain both sprite mixins' do
156
+ @sass.should =~ /^=first-sprite/
157
+ @sass.should =~ /^=second-sprite/
158
+ end
159
+
160
+ it 'should include a condition for the "one" source' do
161
+ expected = Regexp.escape(
162
+ %[ @if $icon == "one"\n] +
163
+ %[ $y_offset: $y_offset - 0px])
164
+
165
+ @sass.should =~ /^#{expected}/
166
+ end
167
+
168
+ it 'should include a condition for the "two" source' do
169
+ expected = Regexp.escape(
170
+ %[ @else if $icon == "two"\n] +
171
+ %[ $y_offset: $y_offset - #{20 + @helper.project.padding}px])
172
+
173
+ @sass.should =~ /^#{expected}/
174
+ end
175
+
176
+ it 'should include a condition for the "three" source' do
177
+ expected = Regexp.escape(
178
+ %[ @if $icon == "three"\n] +
179
+ %[ $y_offset: $y_offset - 0px])
180
+
181
+ @sass.should =~ /^#{expected}/
182
+ end
183
+
184
+ it 'should include a condition for the "four" source' do
185
+ expected = Regexp.escape(
186
+ %[ @else if $icon == "four"\n] +
187
+ %[ $y_offset: $y_offset - #{20 + @helper.project.padding}px])
188
+
189
+ @sass.should =~ /^#{expected}/
190
+ end
191
+
192
+ it 'should include the background statement for the first sprite' do
193
+ @sass.should include(
194
+ " background: url(/images/sprites/first.png)")
195
+ end
196
+
197
+ it 'should include the background statement for the second sprite' do
198
+ @sass.should include(
199
+ " background: url(/images/sprites/second.png)")
200
+ end
201
+ end # with a project containing two sprites, each with two sources
202
+
203
+ context 'with a project using a custom SASS location' do
204
+ before(:each) do
205
+ @helper.write_config <<-CONFIG
206
+ ---
207
+ config.sass: "public/sass"
208
+
209
+ only:
210
+ - one
211
+ CONFIG
212
+
213
+ @helper.write_source('one')
214
+ Montage::SassBuilder.new(@helper.project).write
215
+ end
216
+
217
+ it 'should save the Sass file' do
218
+ @helper.path_to_file(
219
+ 'public/sass/_montage.sass').should be_file
220
+ end
221
+ end # with a project using a custom SASS location
222
+
223
+ context 'with a project using a custom SASS location with a file name' do
224
+ before(:each) do
225
+ @helper.write_config <<-CONFIG
226
+ ---
227
+ config.sass: "public/sass/_here.sass"
228
+
229
+ only:
230
+ - one
231
+ CONFIG
232
+
233
+ @helper.write_source('one')
234
+ Montage::SassBuilder.new(@helper.project).write
235
+ end
236
+
237
+ it 'should save the Sass file' do
238
+ @helper.path_to_file(
239
+ 'public/sass/_here.sass').should be_file
240
+ end
241
+ end # with a project using a custom SASS location with a file name
242
+
243
+ context 'with a project using a custom sprite_url setting' do
244
+ before(:each) do
245
+ @helper.write_config <<-CONFIG
246
+ ---
247
+ config.sprite_url: "/right/about/here"
248
+
249
+ only:
250
+ - one
251
+ CONFIG
252
+
253
+ @helper.write_source('one')
254
+
255
+ Montage::SassBuilder.new(@helper.project).write
256
+
257
+ @sass = File.read(@helper.path_to_file(
258
+ 'public/stylesheets/sass/_montage.sass'))
259
+ end
260
+
261
+ it 'should include the background statement' do
262
+ @sass.should include(
263
+ " background: url(/right/about/here/only.png)")
264
+ end
265
+ end # with a project using a custom sprite_url setting
266
+
267
+ end # build
268
+
269
+ end