roadie 2.4.3 → 3.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.travis.yml +9 -14
- data/.yardopts +1 -1
- data/Changelog.md +22 -10
- data/Gemfile +3 -0
- data/Guardfile +11 -1
- data/README.md +165 -163
- data/Rakefile +2 -19
- data/lib/roadie.rb +14 -69
- data/lib/roadie/asset_provider.rb +7 -58
- data/lib/roadie/asset_scanner.rb +92 -0
- data/lib/roadie/document.rb +103 -0
- data/lib/roadie/errors.rb +57 -0
- data/lib/roadie/filesystem_provider.rb +21 -62
- data/lib/roadie/inliner.rb +71 -218
- data/lib/roadie/markup_improver.rb +88 -0
- data/lib/roadie/null_provider.rb +13 -0
- data/lib/roadie/null_url_rewriter.rb +12 -0
- data/lib/roadie/provider_list.rb +67 -0
- data/lib/roadie/rspec.rb +1 -0
- data/lib/roadie/rspec/asset_provider.rb +49 -0
- data/lib/roadie/selector.rb +42 -18
- data/lib/roadie/style_block.rb +33 -0
- data/lib/roadie/style_properties.rb +29 -0
- data/lib/roadie/style_property.rb +93 -0
- data/lib/roadie/stylesheet.rb +65 -0
- data/lib/roadie/url_generator.rb +126 -0
- data/lib/roadie/url_rewriter.rb +84 -0
- data/lib/roadie/version.rb +1 -1
- data/roadie.gemspec +6 -10
- data/spec/fixtures/big_em.css +1 -0
- data/spec/fixtures/stylesheets/green.css +1 -0
- data/spec/integration_spec.rb +125 -95
- data/spec/lib/roadie/asset_scanner_spec.rb +153 -0
- data/spec/lib/roadie/css_not_found_spec.rb +16 -0
- data/spec/lib/roadie/document_spec.rb +123 -0
- data/spec/lib/roadie/filesystem_provider_spec.rb +25 -72
- data/spec/lib/roadie/inliner_spec.rb +105 -537
- data/spec/lib/roadie/markup_improver_spec.rb +78 -0
- data/spec/lib/roadie/null_provider_spec.rb +21 -0
- data/spec/lib/roadie/null_url_rewriter_spec.rb +19 -0
- data/spec/lib/roadie/provider_list_spec.rb +81 -0
- data/spec/lib/roadie/selector_spec.rb +7 -5
- data/spec/lib/roadie/style_block_spec.rb +35 -0
- data/spec/lib/roadie/style_properties_spec.rb +61 -0
- data/spec/lib/roadie/style_property_spec.rb +82 -0
- data/spec/lib/roadie/stylesheet_spec.rb +41 -0
- data/spec/lib/roadie/test_provider_spec.rb +29 -0
- data/spec/lib/roadie/url_generator_spec.rb +120 -0
- data/spec/lib/roadie/url_rewriter_spec.rb +79 -0
- data/spec/shared_examples/asset_provider.rb +11 -0
- data/spec/shared_examples/url_rewriter.rb +23 -0
- data/spec/spec_helper.rb +5 -60
- data/spec/support/have_node_matcher.rb +2 -2
- data/spec/support/have_selector_matcher.rb +1 -1
- data/spec/support/have_styling_matcher.rb +48 -14
- data/spec/support/test_provider.rb +13 -0
- metadata +73 -177
- data/Appraisals +0 -15
- data/gemfiles/rails_3.0.gemfile +0 -7
- data/gemfiles/rails_3.0.gemfile.lock +0 -123
- data/gemfiles/rails_3.1.gemfile +0 -7
- data/gemfiles/rails_3.1.gemfile.lock +0 -126
- data/gemfiles/rails_3.2.gemfile +0 -7
- data/gemfiles/rails_3.2.gemfile.lock +0 -124
- data/gemfiles/rails_4.0.gemfile +0 -7
- data/gemfiles/rails_4.0.gemfile.lock +0 -119
- data/lib/roadie/action_mailer_extensions.rb +0 -95
- data/lib/roadie/asset_pipeline_provider.rb +0 -28
- data/lib/roadie/css_file_not_found.rb +0 -22
- data/lib/roadie/railtie.rb +0 -39
- data/lib/roadie/style_declaration.rb +0 -42
- data/spec/fixtures/app/assets/stylesheets/integration.css +0 -10
- data/spec/fixtures/public/stylesheets/integration.css +0 -10
- data/spec/fixtures/views/integration_mailer/marketing.html.erb +0 -2
- data/spec/fixtures/views/integration_mailer/notification.html.erb +0 -8
- data/spec/fixtures/views/integration_mailer/notification.text.erb +0 -6
- data/spec/lib/roadie/action_mailer_extensions_spec.rb +0 -227
- data/spec/lib/roadie/asset_pipeline_provider_spec.rb +0 -65
- data/spec/lib/roadie/css_file_not_found_spec.rb +0 -29
- data/spec/lib/roadie/style_declaration_spec.rb +0 -49
- data/spec/lib/roadie_spec.rb +0 -101
- data/spec/shared_examples/asset_provider_examples.rb +0 -11
- data/spec/support/anonymous_mailer.rb +0 -21
- data/spec/support/change_url_options.rb +0 -5
- data/spec/support/parse_styling.rb +0 -25
@@ -0,0 +1,78 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Roadie
|
5
|
+
describe MarkupImprover do
|
6
|
+
def improve(html)
|
7
|
+
dom = Nokogiri::HTML.parse html
|
8
|
+
MarkupImprover.new(dom, html).improve
|
9
|
+
dom
|
10
|
+
end
|
11
|
+
|
12
|
+
# JRuby up to at least 1.6.0 has a bug where the doctype of a document cannot be changed.
|
13
|
+
# See https://github.com/sparklemotion/nokogiri/issues/984
|
14
|
+
def pending_for_buggy_jruby
|
15
|
+
# No reason to check for version yet since no existing version has a fix.
|
16
|
+
pending "Pending until Nokogiri issue #984 is fixed and released" if defined?(JRuby)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "automatic doctype" do
|
20
|
+
it "inserts a HTML5 doctype if no doctype is present" do
|
21
|
+
pending_for_buggy_jruby
|
22
|
+
improve("<html></html>").internal_subset.to_xml.should == "<!DOCTYPE html>"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "does not insert duplicate doctypes" do
|
26
|
+
html = improve('<!DOCTYPE html><html><body></body></html>').to_html
|
27
|
+
html.scan('DOCTYPE').size.should == 1
|
28
|
+
end
|
29
|
+
|
30
|
+
it "leaves other doctypes alone" do
|
31
|
+
dtd = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">"
|
32
|
+
html = "#{dtd}<html></html>"
|
33
|
+
improve(html).internal_subset.to_xml.strip.should == dtd
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "basic HTML structure" do
|
38
|
+
it "inserts a <html> element as the root" do
|
39
|
+
improve("<h1>Hey!</h1>").should have_selector("html h1")
|
40
|
+
improve("<html></html>").css('html').size.should == 1
|
41
|
+
end
|
42
|
+
|
43
|
+
it "inserts <head> if not present" do
|
44
|
+
improve('<html><body></body></html>').should have_selector('html > head + body')
|
45
|
+
improve('<html></html>').should have_selector('html > head')
|
46
|
+
improve('Foo').should have_selector('html > head')
|
47
|
+
improve('<html><head></head></html>').css('head').size.should == 1
|
48
|
+
end
|
49
|
+
|
50
|
+
it "inserts <body> if not present" do
|
51
|
+
improve('<h1>Hey!</h1>').should have_selector('html > body > h1')
|
52
|
+
improve('<html><h1>Hey!</h1></html>').should have_selector('html > body > h1')
|
53
|
+
improve('<html><body><h1>Hey!</h1></body></html>').css('body').size.should == 1
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "charset declaration" do
|
58
|
+
it "is inserted if missing" do
|
59
|
+
dom = improve('<html><head></head><body></body></html>')
|
60
|
+
|
61
|
+
dom.should have_selector('head meta')
|
62
|
+
meta = dom.at_css('head meta')
|
63
|
+
meta['http-equiv'].should == 'Content-Type'
|
64
|
+
meta['content'].should == 'text/html; charset=UTF-8'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "is left alone when predefined" do
|
68
|
+
improve(<<-HTML).xpath('//meta').should have(1).item
|
69
|
+
<html>
|
70
|
+
<head>
|
71
|
+
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
72
|
+
</head>
|
73
|
+
</html>
|
74
|
+
HTML
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'shared_examples/asset_provider'
|
4
|
+
|
5
|
+
module Roadie
|
6
|
+
describe NullProvider do
|
7
|
+
it_behaves_like "asset provider role"
|
8
|
+
|
9
|
+
def expect_empty_stylesheet(stylesheet)
|
10
|
+
stylesheet.should_not be_nil
|
11
|
+
stylesheet.name.should == "(null)"
|
12
|
+
stylesheet.should have(0).blocks
|
13
|
+
stylesheet.to_s.should be_empty
|
14
|
+
end
|
15
|
+
|
16
|
+
it "finds an empty stylesheet for every name" do
|
17
|
+
expect_empty_stylesheet NullProvider.new.find_stylesheet("omg wtf bbq")
|
18
|
+
expect_empty_stylesheet NullProvider.new.find_stylesheet!("omg wtf bbq")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'shared_examples/url_rewriter'
|
4
|
+
|
5
|
+
module Roadie
|
6
|
+
describe NullUrlRewriter do
|
7
|
+
let(:generator) { double "URL generator" }
|
8
|
+
subject(:rewriter) { NullUrlRewriter.new(generator) }
|
9
|
+
|
10
|
+
it_behaves_like "url rewriter"
|
11
|
+
|
12
|
+
it "does nothing when transforming DOM" do
|
13
|
+
dom = double "DOM tree"
|
14
|
+
expect {
|
15
|
+
NullUrlRewriter.new(generator).transform_dom dom
|
16
|
+
}.to_not raise_error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'roadie/rspec'
|
4
|
+
|
5
|
+
module Roadie
|
6
|
+
describe ProviderList do
|
7
|
+
let(:test_provider) { TestProvider.new }
|
8
|
+
subject(:provider) { ProviderList.new([test_provider]) }
|
9
|
+
|
10
|
+
it_behaves_like "roadie asset provider", valid_name: "valid", invalid_name: "invalid" do
|
11
|
+
let(:test_provider) { TestProvider.new "valid" => "" }
|
12
|
+
end
|
13
|
+
|
14
|
+
it "finds using all given providers" do
|
15
|
+
first = TestProvider.new "foo.css" => "foo { color: green; }"
|
16
|
+
second = TestProvider.new "bar.css" => "bar { color: green; }"
|
17
|
+
provider = ProviderList.new [first, second]
|
18
|
+
|
19
|
+
provider.find_stylesheet("foo.css").to_s.should include "foo"
|
20
|
+
provider.find_stylesheet("bar.css").to_s.should include "bar"
|
21
|
+
provider.find_stylesheet("baz.css").should be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
it "is enumerable" do
|
25
|
+
provider.should be_kind_of(Enumerable)
|
26
|
+
provider.should respond_to(:each)
|
27
|
+
provider.each.to_a.should == [test_provider]
|
28
|
+
end
|
29
|
+
|
30
|
+
it "has a size" do
|
31
|
+
provider.size.should == 1
|
32
|
+
end
|
33
|
+
|
34
|
+
it "can have providers pushed and popped" do
|
35
|
+
other = double "Some other provider"
|
36
|
+
|
37
|
+
expect {
|
38
|
+
provider.push other
|
39
|
+
provider << other
|
40
|
+
}.to change(provider, :size).by(2)
|
41
|
+
|
42
|
+
expect {
|
43
|
+
provider.pop.should == other
|
44
|
+
}.to change(provider, :size).by(-1)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "can have providers shifted and unshifted" do
|
48
|
+
other = double "Some other provider"
|
49
|
+
|
50
|
+
expect {
|
51
|
+
provider.unshift other
|
52
|
+
}.to change(provider, :size).by(1)
|
53
|
+
|
54
|
+
expect {
|
55
|
+
provider.shift.should == other
|
56
|
+
}.to change(provider, :size).by(-1)
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "wrapping" do
|
60
|
+
it "creates provider lists with the arguments" do
|
61
|
+
ProviderList.wrap(test_provider).should be_instance_of(ProviderList)
|
62
|
+
ProviderList.wrap(test_provider, test_provider).size.should == 2
|
63
|
+
end
|
64
|
+
|
65
|
+
it "flattens arrays" do
|
66
|
+
ProviderList.wrap([test_provider, test_provider], test_provider).size.should == 3
|
67
|
+
ProviderList.wrap([test_provider, test_provider]).size.should == 2
|
68
|
+
end
|
69
|
+
|
70
|
+
it "combines with providers from other lists" do
|
71
|
+
other_list = ProviderList.new([test_provider, test_provider])
|
72
|
+
ProviderList.wrap(test_provider, other_list).size.should == 3
|
73
|
+
end
|
74
|
+
|
75
|
+
it "returns the passed list if only a single ProviderList is passed" do
|
76
|
+
other_list = ProviderList.new([test_provider])
|
77
|
+
ProviderList.wrap(other_list).should eql other_list
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -19,13 +19,10 @@ module Roadie
|
|
19
19
|
p:link
|
20
20
|
p:target
|
21
21
|
p:visited
|
22
|
-
p:-ms-input-placeholder
|
23
|
-
p:-moz-placeholder
|
24
22
|
p:before
|
25
23
|
p:after
|
26
|
-
p
|
27
|
-
p
|
28
|
-
p:checked
|
24
|
+
p:-ms-input-placeholder
|
25
|
+
p:-moz-placeholder
|
29
26
|
].each do |bad_selector|
|
30
27
|
Selector.new(bad_selector).should_not be_inlinable
|
31
28
|
end
|
@@ -46,6 +43,11 @@ module Roadie
|
|
46
43
|
Selector.new(selector).specificity.should == CssParser.calculate_specificity(selector)
|
47
44
|
end
|
48
45
|
|
46
|
+
it "can be told about the specificity at initialization" do
|
47
|
+
selector = "html p.active.nice #main.deep-selector"
|
48
|
+
Selector.new(selector, 1337).specificity.should == 1337
|
49
|
+
end
|
50
|
+
|
49
51
|
it "is equal to other selectors when they match the same things" do
|
50
52
|
Selector.new("foo").should == Selector.new("foo ")
|
51
53
|
Selector.new("foo").should_not == "foo"
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Roadie
|
5
|
+
describe StyleBlock do
|
6
|
+
it "has a selector and a list of properties" do
|
7
|
+
properties = []
|
8
|
+
selector = double "Selector"
|
9
|
+
|
10
|
+
block = StyleBlock.new(selector, properties)
|
11
|
+
block.selector.should == selector
|
12
|
+
block.properties.should == properties
|
13
|
+
end
|
14
|
+
|
15
|
+
it "delegates #specificity to the selector" do
|
16
|
+
selector = double "Selector", specificity: 45
|
17
|
+
StyleBlock.new(selector, []).specificity.should == 45
|
18
|
+
end
|
19
|
+
|
20
|
+
it "delegates #inlinable? to the selector" do
|
21
|
+
selector = double "Selector", inlinable?: "maybe"
|
22
|
+
StyleBlock.new(selector, []).inlinable?.should == "maybe"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "delegates #selector_string to selector#to_s" do
|
26
|
+
selector = double "Selector", to_s: "yey"
|
27
|
+
StyleBlock.new(selector, []).selector_string.should == "yey"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "has a string representation" do
|
31
|
+
properties = [double(to_s: "bar"), double(to_s: "baz")]
|
32
|
+
StyleBlock.new(double(to_s: "foo"), properties).to_s.should == "foo{bar;baz}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Roadie
|
5
|
+
describe StyleProperties do
|
6
|
+
it "has a list of properties" do
|
7
|
+
property = StyleProperty.new("color", "green", false, 1)
|
8
|
+
StyleProperties.new([property]).properties.should == [property]
|
9
|
+
end
|
10
|
+
|
11
|
+
it "can be merged with other properties" do
|
12
|
+
old = StyleProperty.new("color", "red", false, 1)
|
13
|
+
new = StyleProperty.new("color", "green", false, 5)
|
14
|
+
instance = StyleProperties.new([old])
|
15
|
+
|
16
|
+
instance.merge(StyleProperties.new([new])).properties.should == [old, new]
|
17
|
+
instance.merge([new]).properties.should == [old, new]
|
18
|
+
|
19
|
+
# Original is not mutated
|
20
|
+
instance.properties.should == [old]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can be destructively merged with other properties" do
|
24
|
+
old = StyleProperty.new("color", "red", false, 1)
|
25
|
+
new = StyleProperty.new("color", "green", false, 5)
|
26
|
+
instance = StyleProperties.new([old])
|
27
|
+
|
28
|
+
instance.merge!([new])
|
29
|
+
instance.properties.should == [old, new]
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "string representation" do
|
33
|
+
class MockProperty
|
34
|
+
attr_reader :sort_value
|
35
|
+
include Comparable
|
36
|
+
|
37
|
+
def initialize(name, sort_value = 0)
|
38
|
+
@name, @sort_value = name, sort_value
|
39
|
+
end
|
40
|
+
|
41
|
+
def <=>(other) @sort_value <=> other.sort_value end
|
42
|
+
def to_s() @name.to_s end
|
43
|
+
end
|
44
|
+
|
45
|
+
it "joins properties together with semicolons" do
|
46
|
+
property = MockProperty.new("foo:bar")
|
47
|
+
StyleProperties.new([property, property]).to_s.should == "foo:bar;foo:bar"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sorts properties" do
|
51
|
+
important = MockProperty.new("super important", 100)
|
52
|
+
insignificant = MockProperty.new("insignificant", 2)
|
53
|
+
common = MockProperty.new("common", 20)
|
54
|
+
|
55
|
+
StyleProperties.new(
|
56
|
+
[important, insignificant, common]
|
57
|
+
).to_s.should == "insignificant;common;super important"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Roadie
|
4
|
+
describe StyleProperty do
|
5
|
+
it "is initialized with a property, value, if it is marked as important, and the specificity" do
|
6
|
+
StyleProperty.new('color', 'green', true, 45).tap do |declaration|
|
7
|
+
declaration.property.should == 'color'
|
8
|
+
declaration.value.should == 'green'
|
9
|
+
declaration.should be_important
|
10
|
+
declaration.specificity.should == 45
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "string representation" do
|
15
|
+
it "is the property and the value joined with a colon" do
|
16
|
+
StyleProperty.new('color', 'green', false, 1).to_s.should == 'color:green'
|
17
|
+
StyleProperty.new('font-size', '1.1em', false, 1).to_s.should == 'font-size:1.1em'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "contains the !important flag when set" do
|
21
|
+
StyleProperty.new('color', 'green', true, 1).to_s.should == 'color:green !important'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "comparing" do
|
26
|
+
def declaration(specificity, important = false)
|
27
|
+
StyleProperty.new('color', 'green', important, specificity)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "compares on specificity" do
|
31
|
+
declaration(5).should be == declaration(5)
|
32
|
+
declaration(4).should be < declaration(5)
|
33
|
+
declaration(6).should be > declaration(5)
|
34
|
+
end
|
35
|
+
|
36
|
+
context "with an important declaration" do
|
37
|
+
it "is less than the important declaration regardless of the specificity" do
|
38
|
+
declaration(99, false).should be < declaration(1, true)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "compares like normal when both declarations are important" do
|
42
|
+
declaration(5, true).should be == declaration(5, true)
|
43
|
+
declaration(4, true).should be < declaration(5, true)
|
44
|
+
declaration(6, true).should be > declaration(5, true)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "parsing" do
|
50
|
+
def parsing(declaration, specificity)
|
51
|
+
property = StyleProperty.parse(declaration, specificity)
|
52
|
+
[property.property, property.value, property.important?, property.specificity]
|
53
|
+
end
|
54
|
+
|
55
|
+
it "understands simple declarations" do
|
56
|
+
parsing("color: green", 1).should == ["color", "green", false, 1]
|
57
|
+
parsing(" color:green; ", 1).should == ["color", "green", false, 1]
|
58
|
+
parsing("color: green ", 1).should == ["color", "green", false, 1]
|
59
|
+
parsing("color: green ; ", 1).should == ["color", "green", false, 1]
|
60
|
+
end
|
61
|
+
|
62
|
+
it "understands more complex values" do
|
63
|
+
parsing("padding:0 1px 5rem 9%;", 89).should == ["padding", "0 1px 5rem 9%", false, 89]
|
64
|
+
end
|
65
|
+
|
66
|
+
it "understands more complex names" do
|
67
|
+
parsing("font-size: 50%", 10).should == ["font-size", "50%", false, 10]
|
68
|
+
end
|
69
|
+
|
70
|
+
it "correctly reads !important declarations" do
|
71
|
+
parsing("color: green !important", 1).should == ["color", "green", true, 1]
|
72
|
+
parsing("color: green !important;", 1).should == ["color", "green", true, 1]
|
73
|
+
end
|
74
|
+
|
75
|
+
it "raises an error on unparseable declarations" do
|
76
|
+
expect {
|
77
|
+
parsing("I want a red apple!", 1)
|
78
|
+
}.to raise_error(Roadie::UnparseableDeclaration, /red apple/)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Roadie
|
5
|
+
describe Stylesheet do
|
6
|
+
it "is initialized with a name and CSS" do
|
7
|
+
stylesheet = Stylesheet.new("foo.css", "body { color: green; }")
|
8
|
+
stylesheet.name.should == "foo.css"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has a list of blocks" do
|
12
|
+
stylesheet = Stylesheet.new("foo.css", <<-CSS)
|
13
|
+
body { color: green !important; font-size: 200%; }
|
14
|
+
a, i { color: red; }
|
15
|
+
CSS
|
16
|
+
stylesheet.should have(3).blocks
|
17
|
+
stylesheet.blocks.map(&:to_s).should == [
|
18
|
+
"body{color:green !important;font-size:200%}",
|
19
|
+
"a{color:red}",
|
20
|
+
"i{color:red}",
|
21
|
+
]
|
22
|
+
end
|
23
|
+
|
24
|
+
it "can iterate all inlinable blocks" do
|
25
|
+
inlinable = double(inlinable?: true, selector: "good", properties: "props")
|
26
|
+
bad = double(inlinable?: false, selector: "bad", properties: "props")
|
27
|
+
|
28
|
+
stylesheet = Stylesheet.new("example.css", "")
|
29
|
+
stylesheet.stub blocks: [bad, inlinable, bad]
|
30
|
+
|
31
|
+
stylesheet.each_inlinable_block.to_a.should == [
|
32
|
+
["good", "props"],
|
33
|
+
]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "has a string representation of the contents" do
|
37
|
+
stylesheet = Stylesheet.new("example.css", "body { color: green;}a{ color: red; font-size: small }")
|
38
|
+
stylesheet.to_s.should == "body{color:green}\na{color:red;font-size:small}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|