joshbuddy-esi-for-rack 0.0.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.
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ require 'lib/esi_for_rack'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |s|
6
+ s.name = "esi-for-rack"
7
+ s.description = s.summary = "ESI for Rack"
8
+ s.email = "joshbuddy@gmail.com"
9
+ s.homepage = "http://github.com/joshbuddy/esi_for_rack"
10
+ s.authors = ["Joshua Hull"]
11
+ s.files = FileList["[A-Z]*", "{lib,spec}/**/*"]
12
+ s.add_dependency 'joshbuddy-esi_attribute_language'
13
+ end
14
+ rescue LoadError
15
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
16
+ end
17
+
18
+ require 'spec'
19
+ require 'spec/rake/spectask'
20
+
21
+ task :spec => 'spec:all'
22
+ namespace(:spec) do
23
+ Spec::Rake::SpecTask.new(:all) do |t|
24
+ t.spec_opts ||= []
25
+ t.spec_opts << "-rubygems"
26
+ t.spec_opts << "--options" << "spec/spec.opts"
27
+ t.spec_files = FileList['spec/**/*.rb']
28
+ end
29
+
30
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,133 @@
1
+ class EsiForRack
2
+
3
+ class Node
4
+
5
+ IncludeFailedError = Class.new(RuntimeError)
6
+
7
+ attr_reader :node, :context
8
+
9
+ def init(node, context)
10
+ @node = node
11
+ @context = context
12
+ self
13
+ end
14
+
15
+ def execute_in_place!
16
+ value = execute.to_s
17
+ node.replace(Nokogiri::XML::CDATA.new(node.document, value))
18
+ end
19
+
20
+ class Include < Node
21
+
22
+ def execute
23
+ @resolved_src = EsiAttributeLanguage::SimpleGrammar.parse(@node['src']).execute(context.resolver)
24
+ @resolved_alt = EsiAttributeLanguage::SimpleGrammar.parse(@node['alt']).execute(context.resolver) if @node['alt']
25
+ @continue_on_error = node['onerror'] == 'continue'
26
+
27
+ context.lookup[@resolved_src] ||
28
+ (@resolved_alt && context.lookup[@resolved_alt]) ||
29
+ (!@continue_on_error && raise(IncludeFailedError.new)) || nil
30
+ end
31
+
32
+ end
33
+
34
+ class Vars < Node
35
+ def execute
36
+ #@content = node.inner_html
37
+ @content = Rack::Utils.unescape(node.inner_html)
38
+ EsiAttributeLanguage::SimpleGrammar.parse(@content).execute(context.resolver)
39
+ end
40
+ end
41
+
42
+ class Try < Node
43
+
44
+ def execute
45
+ unless @esi_attempt = node.css('esi_attempt')[0]
46
+ raise "no attempt within try"
47
+ end
48
+
49
+ unless @esi_except = node.css('esi_except')[0]
50
+ raise "no except within try"
51
+ end
52
+
53
+ val = ''
54
+ begin
55
+ context.process(@esi_attempt)
56
+ @esi_attempt.inner_html
57
+ rescue IncludeFailedError
58
+ context.process(@esi_except)
59
+ @esi_except.inner_html
60
+ end
61
+ end
62
+ end
63
+
64
+ class Choose < Node
65
+ def execute
66
+ whens = node.css('esi_when').to_a
67
+ raise "no when's within choose" if whens.empty?
68
+
69
+ otherwise = node.css('esi_otherwise')[0]
70
+
71
+ whens.each do |esi_when|
72
+ if EsiAttributeLanguage::Grammar.parse(esi_when['test']).execute(context.resolver).equal?(true)
73
+ context.process(esi_when)
74
+ return esi_when.inner_html
75
+ end
76
+ end
77
+ if otherwise
78
+ context.process(otherwise)
79
+ return otherwise.inner_html
80
+ end
81
+ nil
82
+ end
83
+ end
84
+
85
+ class Context
86
+
87
+ attr_reader :resolver, :lookup, :doc
88
+
89
+ def initialize(resolver, lookup)
90
+ @resolver = resolver
91
+ @lookup = lookup
92
+
93
+ @include = Include.new
94
+ @choose = Choose.new
95
+ @vars = Vars.new
96
+ @try = Try.new
97
+
98
+ end
99
+
100
+ def parse(document)
101
+ document.gsub!('esi:', 'esi_')
102
+
103
+ @doc = Nokogiri::HTML(document)
104
+
105
+ @doc.css('esi_comment').each do |esi_comment|
106
+ esi_comment.replace(Nokogiri::XML::CDATA.new(doc, ''))
107
+ end
108
+
109
+ process(@doc)
110
+
111
+ @doc
112
+ end
113
+
114
+ def process(doc_fragment)
115
+ # have to go one at a time because of limitation of .css, its not a live list.
116
+ while esi_node = doc_fragment.css('esi_try,esi_choose,esi_vars,esi_include')[0]
117
+ case esi_node.name.to_sym
118
+ when :esi_include
119
+ @include.init(esi_node, self).execute_in_place!
120
+ when :esi_choose
121
+ @choose.init(esi_node, self).execute_in_place!
122
+ when :esi_vars
123
+ @vars.init(esi_node, self).execute_in_place!
124
+ when :esi_try
125
+ @try.init(esi_node, self).execute_in_place!
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ end
132
+
133
+ end
@@ -0,0 +1,83 @@
1
+ require 'nokogiri'
2
+ require 'set'
3
+
4
+ require 'esi_attribute_language'
5
+ require 'parse_user_agent'
6
+
7
+ require File.join(File.dirname(__FILE__), 'esi_for_rack', 'node')
8
+ require File.join(File.dirname(__FILE__), 'esi_for_rack', 'lookup')
9
+
10
+ class EsiForRack
11
+
12
+ def initialize(app, lookup = nil)
13
+ @app = app
14
+ @lookup = lookup
15
+ end
16
+
17
+ def call(env)
18
+ @lookup ||= Lookup::PassThrough.new(@app, env)
19
+
20
+ request = Rack::Request.new(env)
21
+ result = @app.call(env)
22
+ response = Rack::Response.new(result[2], result[0], result[1])
23
+
24
+ if response['Content-Type'] =~ /text\/html/
25
+ body = ""
26
+ response.body.each do |part|
27
+ body << part
28
+ end
29
+
30
+ user_agent_hash = {}
31
+ begin
32
+ user_agent = ParseUserAgent.new.parse(env['HTTP_USER_AGENT'] || '-')
33
+ user_agent_hash['browser'] = case user_agent.browser
34
+ when 'Firefox' then 'MOZILLA'
35
+ when 'MSIE' then 'MSIE'
36
+ else; 'OTHER'
37
+ end
38
+
39
+ user_agent_hash['version'] = user_agent.browser_version_major
40
+
41
+ user_agent_hash['os'] = case user_agent.ostype
42
+ when 'Windows' then 'WIN'
43
+ when 'Macintosh' then 'MAC'
44
+ else; 'OTHER'
45
+ end
46
+
47
+ rescue
48
+ # error parsing ua
49
+ end
50
+
51
+
52
+
53
+ binding = {
54
+ :HTTP_ACCEPT_LANGUAGE => Set.new((env['HTTP_ACCEPT_LANGUAGE'] || '').split(',').map{|l| l.strip.gsub(/q=[0-9]\.[0-9]{1,3}/, '').gsub(';','')}),
55
+ :HTTP_COOKIE => request.cookies,
56
+ :HTTP_HOST => request.host,
57
+ :HTTP_REFERER => request.referer,
58
+ :HTTP_USER_AGENT => user_agent_hash,
59
+ :QUERY_STRING => request.GET
60
+ }
61
+ context = Node::Context.new(binding, @lookup)
62
+ [response.status, response.headers, [context.parse(body).to_s]]
63
+ else
64
+ result
65
+ end
66
+
67
+ end
68
+
69
+ class IOWrapper
70
+ def initialize(body)
71
+ @body = body.each
72
+ end
73
+
74
+ def read
75
+ @body.end?
76
+ end
77
+
78
+ def close
79
+ #no-op
80
+ end
81
+ end
82
+
83
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi user agent variable lookups" do
4
+
5
+ it "should lookup a cookie variable" do
6
+
7
+ vars = {'type' => 'user'}
8
+ builder = Rack::Builder.new do
9
+ use EsiForRack, {'/file/WIN' => 'os', '/file/1.5' => 'version', '/file/MOZILLA' => 'browser'}
10
+
11
+ run proc { |env|
12
+ data = IO.read('spec/http_integration/fixtures/accept_language/1.html')
13
+ [200, {'Content-type' => 'text/html', 'Content-length' => data.size.to_s}, [data]]
14
+ }
15
+ end
16
+
17
+ request = Rack::MockRequest.env_for("/?#{Rack::Utils.build_query(vars)}")
18
+ request['HTTP_ACCEPT_LANGUAGE'] = 'da, en-gb;q=0.8, en;q=0.7'
19
+ builder.call(request).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\nENDAEN-GB\n</body></html>\n"]
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi cookie variable lookups" do
4
+
5
+ it "should lookup a cookie variable" do
6
+
7
+ vars = {'type' => 'user'}
8
+ builder = Rack::Builder.new do
9
+ use EsiForRack, {'/file/1' => 'resource'}
10
+
11
+ run proc { |env|
12
+ data = IO.read('spec/http_integration/fixtures/cookie/1.html')
13
+ [200, {'Content-type' => 'text/html', 'Content-length' => data.size.to_s}, [data]]
14
+ }
15
+ end
16
+
17
+ request = Rack::MockRequest.env_for("/?#{Rack::Utils.build_query(vars)}")
18
+ request['HTTP_COOKIE'] = 'id=1'
19
+ builder.call(request).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>resource</body></html>\n"]
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,12 @@
1
+ <html><body>
2
+ <esi:choose>
3
+ <esi:when test="$(HTTP_ACCEPT_LANGUAGE{en})">EN</esi:when>
4
+ </esi:choose>
5
+ <esi:choose>
6
+ <esi:when test="$(HTTP_ACCEPT_LANGUAGE{da})">DA</esi:when>
7
+ </esi:choose>
8
+ <esi:choose>
9
+ <esi:when test="$(HTTP_ACCEPT_LANGUAGE{en-gb})">EN-GB</esi:when>
10
+ </esi:choose>
11
+
12
+ </body></html>
@@ -0,0 +1,3 @@
1
+ <html><body>
2
+ <esi:include src="/file/$(HTTP_COOKIE{id})"/>
3
+ </body></html>
@@ -0,0 +1,3 @@
1
+ <html><body>
2
+ <esi:include src="/file/$(QUERY_STRING{id})"/>
3
+ </body></html>
@@ -0,0 +1,5 @@
1
+ <html><body>
2
+ <esi:include src="/file/$(HTTP_USER_AGENT{browser})"/>
3
+ <esi:include src="/file/$(HTTP_USER_AGENT{os})"/>
4
+ <esi:include src="/file/$(HTTP_USER_AGENT{version})"/>
5
+ </body></html>
@@ -0,0 +1,22 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi query string variable lookups" do
4
+
5
+ it "should lookup a query string variable" do
6
+
7
+ vars = {'id' => '1'}
8
+ builder = Rack::Builder.new do
9
+ use EsiForRack, {'/file/1' => 'resource'}
10
+
11
+ run proc { |env|
12
+ data = IO.read('spec/http_integration/fixtures/query_string/1.html')
13
+ [200, {'Content-type' => 'text/html', 'Content-length' => data.size.to_s}, [data]]
14
+ }
15
+ end
16
+
17
+ request = Rack::MockRequest.env_for("/?#{Rack::Utils.build_query(vars)}")
18
+ builder.call(request).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>resource</body></html>\n"]
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi user agent variable lookups" do
4
+
5
+ it "should lookup a cookie variable" do
6
+
7
+ vars = {'type' => 'user'}
8
+ builder = Rack::Builder.new do
9
+ use EsiForRack, {'/file/WIN' => 'os', '/file/1.5' => 'version', '/file/MOZILLA' => 'browser'}
10
+
11
+ run proc { |env|
12
+ data = IO.read('spec/http_integration/fixtures/user_agent/1.html')
13
+ [200, {'Content-type' => 'text/html', 'Content-length' => data.size.to_s}, [data]]
14
+ }
15
+ end
16
+
17
+ request = Rack::MockRequest.env_for("/?#{Rack::Utils.build_query(vars)}")
18
+ request['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2'
19
+ builder.call(request).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\nbrowserosversion\n</body></html>\n"]
20
+
21
+ end
22
+
23
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,7 @@
1
+ --colour
2
+ --format
3
+ specdoc
4
+ --loadby
5
+ mtime
6
+ --reverse
7
+ --backtrace
@@ -0,0 +1,27 @@
1
+ I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2 = true
2
+
3
+ require 'rack'
4
+ require 'lib/esi_for_rack'
5
+
6
+ def build_app(file, lookup)
7
+ builder = Rack::Builder.new do
8
+ use EsiForRack
9
+
10
+ run proc { |env|
11
+ data = if env['PATH_INFO'] == '/'
12
+ IO.read(file)
13
+ else
14
+ lookup[env['PATH_INFO']]
15
+ end
16
+
17
+ if data
18
+ [200, {'Content-type' => 'text/html', 'Content-length' => data.size.to_s}, [data]]
19
+ else
20
+ [404, {}, []]
21
+ end
22
+ }
23
+ end
24
+
25
+ request = Rack::MockRequest.env_for("/?a=b")
26
+ builder.call(request)
27
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi choose" do
4
+
5
+ it "should pick the first available choice" do
6
+ build_app('spec/tags/fixtures/choose/simple1.html', {}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n Hey you\n </body></html>\n"]
7
+ end
8
+
9
+ it "should pick next available choice" do
10
+ build_app('spec/tags/fixtures/choose/simple2.html', {}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n And you\n </body></html>\n"]
11
+ end
12
+
13
+ it "should take the otherwise block if there is no valid choice" do
14
+ build_app('spec/tags/fixtures/choose/simple3.html', {}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body> \n No good\n </body></html>\n"]
15
+ end
16
+
17
+
18
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi comment" do
4
+
5
+ it "should not render a comment" do
6
+ build_app('spec/tags/fixtures/comment/simple.html', {}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>This will show up.</p></body></html>\n"]
7
+ end
8
+
9
+ end
@@ -0,0 +1,8 @@
1
+ <esi:choose>
2
+ <esi:when test="1==1">
3
+ Hey you
4
+ </esi:when>
5
+ <esi:otherwise>
6
+ No good
7
+ </esi:otherwise>
8
+ </esi:chooise>
@@ -0,0 +1,11 @@
1
+ <esi:choose>
2
+ <esi:when test="2==1">
3
+ Hey you
4
+ </esi:when>
5
+ <esi:when test="1==1">
6
+ And you
7
+ </esi:when>
8
+ <esi:otherwise>
9
+ No good
10
+ </esi:otherwise>
11
+ </esi:chooise>
@@ -0,0 +1,8 @@
1
+ <esi:choose>
2
+ <esi:when test="2==1">
3
+ Hey you
4
+ </esi:when>
5
+ <esi:otherwise>
6
+ No good
7
+ </esi:otherwise>
8
+ </esi:chooise>
@@ -0,0 +1 @@
1
+ This will <esi:comment>This will never show up</esi:comment>show up.
@@ -0,0 +1,3 @@
1
+ <html><body>
2
+ <esi:include src="unavilable resource" alt="/alternate" />
3
+ </body></html>
@@ -0,0 +1,3 @@
1
+ <html><body>
2
+ <esi:include src="/great" />
3
+ </body></html>
@@ -0,0 +1,3 @@
1
+ <html><body>
2
+ <esi:include src="/great" onerror="continue"/>
3
+ </body></html>
@@ -0,0 +1,12 @@
1
+ <esi:try>
2
+ <esi:attempt>
3
+ This is my include: <esi:include src="/include" />
4
+ Choice/<esi:choose>
5
+ <esi:when test="1==2">false</esi:when>
6
+ <esi:when test="1==1">true</esi:when>
7
+ </esi:choose>/Choice
8
+ </esi:attempt>
9
+ <esi:except>
10
+ BLAH!
11
+ </esi:except>
12
+ </esi:try>
@@ -0,0 +1,6 @@
1
+ <esi:try>
2
+ <esi:attempt>
3
+ <esi:include src="/great"/>
4
+ </esi:attempt>
5
+ <esi:except>This is bad</esi:except>
6
+ </esi:try>
@@ -0,0 +1,5 @@
1
+ <esi:try>
2
+ <esi:attempt>
3
+ <esi:include src="/great"/>
4
+ </esi:attempt>
5
+ </esi:try>
@@ -0,0 +1,3 @@
1
+ <esi:try>
2
+ <esi:except>This is bad</esi:except>
3
+ </esi:try>
@@ -0,0 +1 @@
1
+ <esi:vars><img src="http://www.example.com/$(QUERY_STRING{a})/hello.gif"/ ></esi:vars>
@@ -0,0 +1,25 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi include" do
4
+
5
+ it "should include a src" do
6
+ build_app('spec/tags/fixtures/include/src.html', {'/great' => "<p>This is great</p>"}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>This is great</p></body></html>\n"]
7
+ end
8
+
9
+ it "should include an alt if src is unavilable" do
10
+ build_app('spec/tags/fixtures/include/alt.html', {'/alternate' => "<p>This is great</p>"}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>This is great</p></body></html>\n"]
11
+ end
12
+
13
+ it "should raise an error if src is unavilable" do
14
+ proc { build_app('spec/tags/fixtures/include/src.html', {}) }.should raise_error
15
+ end
16
+
17
+ it "should raise an error if src and alt is unavilable" do
18
+ proc { build_app('spec/tags/fixtures/include/alt.html', {}) }.should raise_error
19
+ end
20
+
21
+ it "should continue though, if onerror=continue" do
22
+ build_app('spec/tags/fixtures/include/src_continue.html', {}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body></body></html>\n"]
23
+ end
24
+
25
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi nested" do
4
+
5
+ it "nested1" do
6
+ build_app('spec/tags/fixtures/nested/complex.html', {}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n BLAH!\n </body></html>\n"]
7
+ end
8
+
9
+ it "nested2" do
10
+ build_app('spec/tags/fixtures/nested/complex.html', {'/include' => "<p>This is great</p>"}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n This is my include: <p>This is great</p>\n Choice/true/Choice\n </body></html>\n"]
11
+ end
12
+
13
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi try" do
4
+
5
+ it "should raise on try block without except" do
6
+ proc {
7
+ build_app('spec/tags/fixtures/try/malformed_attempt.html', {'/great' => "<p>This is great</p>"})
8
+ }.should raise_error
9
+ end
10
+
11
+ it "should raise on try block without attempt" do
12
+ proc {
13
+ build_app('spec/tags/fixtures/try/malformed_attempt.html', {'/great' => "<p>This is great</p>"})
14
+ }.should raise_error
15
+ end
16
+
17
+ it "should include normally within an attempt block" do
18
+ build_app('spec/tags/fixtures/try/include.html', {'/great' => "<p>This is great</p>"}).last.should ==
19
+ ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>This is great</p></body></html>\n"]
20
+ end
21
+
22
+ it "should render the except block when the include fails within an attempt block" do
23
+ build_app('spec/tags/fixtures/try/include.html', {}).last.should ==
24
+ ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>This is bad</body></html>\n"]
25
+ end
26
+
27
+
28
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "esi vars" do
4
+
5
+ it "should render the content within vars" do
6
+ build_app('spec/tags/fixtures/vars/simple.html', {}).last.should == ["<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><img src=\"http://www.example.com/b/hello.gif\"></body></html>\n"]
7
+ end
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: joshbuddy-esi-for-rack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Joshua Hull
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-07-18 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: joshbuddy-esi_attribute_language
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: ESI for Rack
26
+ email: joshbuddy@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - Rakefile
35
+ - VERSION
36
+ - lib/esi_for_rack.rb
37
+ - lib/esi_for_rack/node.rb
38
+ - spec/http_integration/accept_language_spec.rb
39
+ - spec/http_integration/cookie_spec.rb
40
+ - spec/http_integration/fixtures/accept_language/1.html
41
+ - spec/http_integration/fixtures/cookie/1.html
42
+ - spec/http_integration/fixtures/query_string/1.html
43
+ - spec/http_integration/fixtures/user_agent/1.html
44
+ - spec/http_integration/query_string_spec.rb
45
+ - spec/http_integration/user_agent_spec.rb
46
+ - spec/spec.opts
47
+ - spec/spec_helper.rb
48
+ - spec/tags/choose_spec.rb
49
+ - spec/tags/comment_spec.rb
50
+ - spec/tags/fixtures/choose/simple1.html
51
+ - spec/tags/fixtures/choose/simple2.html
52
+ - spec/tags/fixtures/choose/simple3.html
53
+ - spec/tags/fixtures/comment/simple.html
54
+ - spec/tags/fixtures/include/alt.html
55
+ - spec/tags/fixtures/include/src.html
56
+ - spec/tags/fixtures/include/src_continue.html
57
+ - spec/tags/fixtures/nested/complex.html
58
+ - spec/tags/fixtures/try/include.html
59
+ - spec/tags/fixtures/try/malformed_attempt.html
60
+ - spec/tags/fixtures/try/malformed_except.html
61
+ - spec/tags/fixtures/vars/simple.html
62
+ - spec/tags/include_spec.rb
63
+ - spec/tags/nested_spec.rb
64
+ - spec/tags/try_spec.rb
65
+ - spec/tags/vars_spec.rb
66
+ has_rdoc: false
67
+ homepage: http://github.com/joshbuddy/esi_for_rack
68
+ post_install_message:
69
+ rdoc_options:
70
+ - --charset=UTF-8
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
+ version:
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ version:
85
+ requirements: []
86
+
87
+ rubyforge_project:
88
+ rubygems_version: 1.2.0
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: ESI for Rack
92
+ test_files:
93
+ - spec/http_integration/accept_language_spec.rb
94
+ - spec/http_integration/cookie_spec.rb
95
+ - spec/http_integration/query_string_spec.rb
96
+ - spec/http_integration/user_agent_spec.rb
97
+ - spec/spec_helper.rb
98
+ - spec/tags/choose_spec.rb
99
+ - spec/tags/comment_spec.rb
100
+ - spec/tags/include_spec.rb
101
+ - spec/tags/nested_spec.rb
102
+ - spec/tags/try_spec.rb
103
+ - spec/tags/vars_spec.rb