stylo 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ begin
18
18
  gem.add_development_dependency "sinatra", ">= 0"
19
19
  gem.add_development_dependency "rails", ">= 3.0.0"
20
20
  gem.add_runtime_dependency "haml", ">= 3.0.21"
21
- gem.version = "0.5.1"
21
+ gem.version = "0.6.0"
22
22
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
23
23
  end
24
24
  Jeweler::GemcutterTasks.new
data/TODO CHANGED
@@ -1,4 +1,4 @@
1
- support switching off combining (for development)
1
+ make configuration nicer and more flexible
2
2
  add minification for javascript
3
3
  add minification for css
4
- make it so sass is only used if the sass gem is not available (without making the pipeline configuration messy)
4
+ make it so sass is not used if the sass gem is not available (without making the pipeline configuration messy)
@@ -0,0 +1,5 @@
1
+ @import "a_folder/parent.css";
2
+
3
+ #grand-parent {
4
+ color: red;
5
+ }
@@ -0,0 +1,11 @@
1
+ #child {
2
+ background: #000000;
3
+ }
4
+
5
+ #parent {
6
+ background: #FFFFFF;
7
+ }
8
+
9
+ #grand-parent {
10
+ color: red;
11
+ }
@@ -2,10 +2,20 @@ Given /^"([^"]*)" is located at "([^"]*)" in the asset location$/ do |filename,
2
2
  cp fixture_path(filename), temp_path(folder)
3
3
  end
4
4
 
5
+ Given /^a folder "([^"]*)" exists at "([^"]*)" in the asset location$/ do |folder_name, folder|
6
+ mkdir temp_path("#{folder}/#{folder_name}")
7
+ end
8
+
9
+
5
10
  When /^a request is made for "([^"]*)"$/ do |path|
6
11
  get path
7
12
  end
8
13
 
14
+ When /^a request is made for "([^"]*)" the following error should be raised$/ do |path, expected_error|
15
+ proc { get path }.should raise_error(expected_error)
16
+ end
17
+
18
+
9
19
  Then /^the response body should look like "([^"]*)"$/ do |filename|
10
20
  last_response.body.should == load_fixture(filename)
11
21
  end
@@ -29,4 +39,4 @@ end
29
39
 
30
40
  When /^css combining is disabled$/ do
31
41
  Stylo::Config.css_combining_enabled = false
32
- end
42
+ end
@@ -25,6 +25,14 @@ Feature: Stylesheet serving
25
25
  When a request is made for "stylesheets/grand_parent.css"
26
26
  Then the response body should look like "grand_parent_with_parent_with_child.css"
27
27
 
28
+ Scenario: Stylesheet combining in nested folders
29
+ Given "nested_folder_grand_parent.css" is located at "stylesheets" in the asset location
30
+ And a folder "a_folder" exists at "stylesheets" in the asset location
31
+ And "parent.css" is located at "stylesheets/a_folder" in the asset location
32
+ And "child.css" is located at "stylesheets/a_folder" in the asset location
33
+ When a request is made for "stylesheets/nested_folder_grand_parent.css"
34
+ Then the response body should look like "nested_folder_grand_parent_with_parent_with_child.css"
35
+
28
36
  Scenario: Stylesheet responses should have the correct headers
29
37
  Given "child.css" is located at "stylesheets" in the asset location
30
38
  When a request is made for "stylesheets/child.css"
@@ -35,4 +43,11 @@ Feature: Stylesheet serving
35
43
  Scenario: Stylesheets should be cached
36
44
  Given "child.css" is located at "stylesheets" in the asset location
37
45
  When a request is made for "stylesheets/child.css"
38
- Then the "Cache-Control" header should be "public, max-age=86400"
46
+ Then the "Cache-Control" header should be "public, max-age=86400"
47
+
48
+ Scenario: When a referenced stylesheet does not exist
49
+ Given "parent.css" is located at "stylesheets" in the asset location
50
+ When a request is made for "stylesheets/parent.css" the following error should be raised
51
+ """
52
+ Cannot find referenced asset 'child.css'.
53
+ """
@@ -1,14 +1,17 @@
1
1
  module Stylo
2
2
  class Combiner
3
- def initialize(asset_directory, require_pattern)
3
+ def initialize(require_pattern)
4
4
  @require_pattern = require_pattern
5
- @asset_directory = asset_directory
6
5
  end
7
6
 
8
- def process(content)
7
+ def process(base_directory, content)
9
8
  content.gsub @require_pattern do |match|
10
- process(AssetLoader.load_content(File.join(@asset_directory, $1)))
9
+ required_dir = File.dirname($1)
10
+ required_dir = required_dir == '.' ? base_directory : File.join(base_directory, required_dir)
11
+
12
+ raise "Cannot find referenced asset '#{$1}'." if !(content = AssetLoader.load_content(File.join(base_directory, $1)))
13
+ process(required_dir, content)
11
14
  end
12
15
  end
13
16
  end
14
- end
17
+ end
@@ -8,7 +8,7 @@ module Stylo
8
8
  return unless content = AssetLoader.load_content(response.path)
9
9
 
10
10
  if Config.javascript_combining_enabled
11
- content = Combiner.new(File.dirname(response.path), REQUIRE_PATTERN).process(content)
11
+ content = Combiner.new(REQUIRE_PATTERN).process(File.dirname(response.path), content)
12
12
  end
13
13
 
14
14
  response.set_body content, :javascript
@@ -8,11 +8,11 @@ module Stylo
8
8
  content = AssetLoader.load_content(response.path.gsub('.css', '.scss'))
9
9
  return if content.nil?
10
10
 
11
- combined_content = Combiner.new(File.dirname(response.path), REQUIRE_PATTERN).process(content)
11
+ combined_content = Combiner.new(REQUIRE_PATTERN).process(File.dirname(response.path), content)
12
12
  processed_content = ::Sass::Engine.new(combined_content, {:syntax => :scss}).render
13
13
 
14
14
  response.set_body(processed_content, :css)
15
15
  end
16
16
  end
17
17
  end
18
- end
18
+ end
@@ -8,11 +8,11 @@ module Stylo
8
8
  return unless content = AssetLoader.load_content(response.path)
9
9
 
10
10
  if Config.css_combining_enabled
11
- content = Combiner.new(File.dirname(response.path), REQUIRE_PATTERN).process(content)
11
+ content = Combiner.new(REQUIRE_PATTERN).process(File.dirname(response.path), content)
12
12
  end
13
13
 
14
14
  response.set_body content, :css
15
15
  end
16
16
  end
17
17
  end
18
- end
18
+ end
@@ -2,13 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  describe Stylo::Combiner do
4
4
  let(:request_path_directory) { 'assets' }
5
- let(:combiner) { Stylo::Combiner.new(request_path_directory, /require "(.*)";/) }
5
+ let(:combiner) { Stylo::Combiner.new(/require "(.*)";/) }
6
6
 
7
7
  describe "when the content does not contain the require pattern" do
8
8
  let(:content) { "This is some text." }
9
9
 
10
10
  it "should return the content" do
11
- combiner.process(content).should == content
11
+ combiner.process(request_path_directory, content).should == content
12
12
  end
13
13
  end
14
14
 
@@ -22,20 +22,36 @@ describe Stylo::Combiner do
22
22
  it "should load required content from the asset loader" do
23
23
  Stylo::AssetLoader.should_receive(:load_content).with('assets/some_other_file').and_return('the required content.')
24
24
 
25
- combiner.process(content)
25
+ combiner.process(request_path_directory, content)
26
26
  end
27
27
 
28
- it "should return the combined content" do
29
- combiner.process(content).should == 'the required content. and then some other content'
28
+ describe "when the required content exists" do
29
+ before(:each) do
30
+ Stylo::AssetLoader.stub(:load_content).with('assets/some_other_file').and_return('the required content.')
31
+ end
32
+
33
+ it "should return the required content" do
34
+ combiner.process(request_path_directory, content).should == 'the required content. and then some other content'
35
+ end
36
+
37
+ describe "and the required content has the require pattern" do
38
+ it "should combine the content recursively" do
39
+ Stylo::AssetLoader.stub(:load_content).with('assets/some_other_file').and_return('require "yet_another_file"; the required content.')
40
+ Stylo::AssetLoader.stub(:load_content).with('assets/yet_another_file').and_return('the other required content.')
41
+
42
+ combiner.process(request_path_directory, content).should == "the other required content. the required content. and then some other content"
43
+ end
44
+ end
30
45
  end
31
46
 
32
- describe "and the required content has the require pattern" do
33
- it "should combine the content recursively" do
34
- Stylo::AssetLoader.stub(:load_content).with('assets/some_other_file').and_return('require "yet_another_file"; the required content.')
35
- Stylo::AssetLoader.stub(:load_content).with('assets/yet_another_file').and_return('the other required content.')
47
+ describe "when the required content does not exist" do
48
+ before(:each) do
49
+ Stylo::AssetLoader.stub(:load_content).with('assets/some_other_file').and_return(nil)
50
+ end
36
51
 
37
- combiner.process(content).should == "the other required content. the required content. and then some other content"
52
+ it "should raise an error" do
53
+ proc { combiner.process(request_path_directory, content) }.should raise_error("Cannot find referenced asset 'some_other_file'.")
38
54
  end
39
55
  end
40
56
  end
41
- end
57
+ end
@@ -17,6 +17,7 @@ describe Stylo::PipelineSteps::Javascript do
17
17
 
18
18
  describe "and the request is for a javascript asset" do
19
19
  let(:response) { Stylo::Response.new('javascripts/test.js') }
20
+ let(:base_path) { File.dirname(response.path) }
20
21
 
21
22
  before(:each) do
22
23
 
@@ -45,8 +46,8 @@ describe Stylo::PipelineSteps::Javascript do
45
46
 
46
47
  before(:each) do
47
48
  Stylo::AssetLoader.stub(:load_content).and_return(javascript_content)
48
- Stylo::Combiner.stub(:new).with('javascripts', /\/\/\/require "(.*)";/).and_return(combiner)
49
- combiner.stub(:process).with(javascript_content).and_return(combined_javascript_content)
49
+ Stylo::Combiner.stub(:new).with(/\/\/\/require "(.*)";/).and_return(combiner)
50
+ combiner.stub(:process).with(base_path, javascript_content).and_return(combined_javascript_content)
50
51
  end
51
52
 
52
53
  describe "and combining is enabled" do
@@ -55,8 +56,8 @@ describe Stylo::PipelineSteps::Javascript do
55
56
  end
56
57
 
57
58
  it "should tell the combiner to process the javascript content" do
58
- Stylo::Combiner.should_receive(:new).with('javascripts', /\/\/\/require "(.*)";/).and_return(combiner)
59
- combiner.should_receive(:process).with(javascript_content).and_return(combined_javascript_content)
59
+ Stylo::Combiner.should_receive(:new).with(/\/\/\/require "(.*)";/).and_return(combiner)
60
+ combiner.should_receive(:process).with(base_path, javascript_content).and_return(combined_javascript_content)
60
61
 
61
62
  step.call(response)
62
63
  end
@@ -99,4 +100,4 @@ describe Stylo::PipelineSteps::Javascript do
99
100
  response.body.should == 'some-content'
100
101
  end
101
102
  end
102
- end
103
+ end
@@ -19,6 +19,7 @@ describe Stylo::PipelineSteps::Sass do
19
19
  let(:requested_path) { 'stylesheets/test.css' }
20
20
  let(:sass_path) { 'stylesheets/test.scss' }
21
21
  let(:response) { Stylo::Response.new(requested_path) }
22
+ let(:base_path) { File.dirname(response.path) }
22
23
 
23
24
  it "should ask the asset loader to load the sass stylesheet content" do
24
25
  Stylo::AssetLoader.should_receive(:load_content).with(sass_path).and_return(nil)
@@ -45,15 +46,15 @@ describe Stylo::PipelineSteps::Sass do
45
46
 
46
47
  before(:each) do
47
48
  Stylo::AssetLoader.stub(:load_content).and_return(stylesheet_content)
48
- Stylo::Combiner.stub(:new).with('stylesheets', /@import "(.*)";/).and_return(combiner)
49
- combiner.stub(:process).with(stylesheet_content).and_return(combined_stylesheet_content)
49
+ Stylo::Combiner.stub(:new).with(/@import "(.*)";/).and_return(combiner)
50
+ combiner.stub(:process).with(base_path, stylesheet_content).and_return(combined_stylesheet_content)
50
51
  ::Sass::Engine.stub(:new).with(combined_stylesheet_content, {:syntax => :scss}).and_return(sass_engine)
51
52
  sass_engine.stub(:render).and_return(processed_content)
52
53
  end
53
54
 
54
55
  it "should tell the combiner to process the stylesheet content" do
55
- Stylo::Combiner.should_receive(:new).with('stylesheets', /@import "(.*)";/).and_return(combiner)
56
- combiner.should_receive(:process).with(stylesheet_content).and_return(combined_stylesheet_content)
56
+ Stylo::Combiner.should_receive(:new).with(/@import "(.*)";/).and_return(combiner)
57
+ combiner.should_receive(:process).with(base_path, stylesheet_content).and_return(combined_stylesheet_content)
57
58
 
58
59
  step.call(response)
59
60
  end
@@ -91,4 +92,4 @@ describe Stylo::PipelineSteps::Sass do
91
92
  end
92
93
  end
93
94
 
94
- end
95
+ end
@@ -17,6 +17,7 @@ describe Stylo::PipelineSteps::Stylesheet do
17
17
 
18
18
  describe "and the request is for a stylesheet" do
19
19
  let(:response) { Stylo::Response.new('stylesheets/test.css') }
20
+ let(:base_path) { File.dirname(response.path) }
20
21
 
21
22
  before(:each) do
22
23
 
@@ -45,8 +46,8 @@ describe Stylo::PipelineSteps::Stylesheet do
45
46
 
46
47
  before(:each) do
47
48
  Stylo::AssetLoader.stub(:load_content).and_return(stylesheet_content)
48
- Stylo::Combiner.stub(:new).with('stylesheets', /@import "(.*)";/).and_return(combiner)
49
- combiner.stub(:process).with(stylesheet_content).and_return(combined_stylesheet_content)
49
+ Stylo::Combiner.stub(:new).with(/@import "(.*)";/).and_return(combiner)
50
+ combiner.stub(:process).with(base_path, stylesheet_content).and_return(combined_stylesheet_content)
50
51
  end
51
52
 
52
53
  describe "and combining is enabled" do
@@ -55,8 +56,8 @@ describe Stylo::PipelineSteps::Stylesheet do
55
56
  end
56
57
 
57
58
  it "should tell the combiner to process the stylesheet content" do
58
- Stylo::Combiner.should_receive(:new).with('stylesheets', /@import "(.*)";/).and_return(combiner)
59
- combiner.should_receive(:process).with(stylesheet_content).and_return(combined_stylesheet_content)
59
+ Stylo::Combiner.should_receive(:new).with(/@import "(.*)";/).and_return(combiner)
60
+ combiner.should_receive(:process).with(base_path, stylesheet_content).and_return(combined_stylesheet_content)
60
61
 
61
62
  step.call(response)
62
63
  end
@@ -100,4 +101,4 @@ describe Stylo::PipelineSteps::Stylesheet do
100
101
  response.body.should == 'some-content'
101
102
  end
102
103
  end
103
- end
104
+ end
data/stylo.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{stylo}
8
- s.version = "0.5.1"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["mwagg"]
12
- s.date = %q{2010-10-18}
12
+ s.date = %q{2010-11-03}
13
13
  s.description = %q{Server side stylesheet combining for readonly hosting environments}
14
14
  s.email = %q{michael@guerillatactics.co.uk}
15
15
  s.extra_rdoc_files = [
@@ -32,6 +32,8 @@ Gem::Specification.new do |s|
32
32
  "features/fixtures/grand_parent.js",
33
33
  "features/fixtures/grand_parent_with_parent_with_child.css",
34
34
  "features/fixtures/grand_parent_with_parent_with_child.js",
35
+ "features/fixtures/nested_folder_grand_parent.css",
36
+ "features/fixtures/nested_folder_grand_parent_with_parent_with_child.css",
35
37
  "features/fixtures/parent.css",
36
38
  "features/fixtures/parent.js",
37
39
  "features/fixtures/parent_with_child.css",
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stylo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 5
9
- - 1
10
- version: 0.5.1
8
+ - 6
9
+ - 0
10
+ version: 0.6.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - mwagg
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-18 00:00:00 +01:00
18
+ date: 2010-11-03 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -131,6 +131,8 @@ files:
131
131
  - features/fixtures/grand_parent.js
132
132
  - features/fixtures/grand_parent_with_parent_with_child.css
133
133
  - features/fixtures/grand_parent_with_parent_with_child.js
134
+ - features/fixtures/nested_folder_grand_parent.css
135
+ - features/fixtures/nested_folder_grand_parent_with_parent_with_child.css
134
136
  - features/fixtures/parent.css
135
137
  - features/fixtures/parent.js
136
138
  - features/fixtures/parent_with_child.css