pirj-sinatra-contrib 1.3.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.
- data/LICENSE +20 -0
- data/README.md +135 -0
- data/Rakefile +61 -0
- data/ideas.md +29 -0
- data/lib/sinatra/capture.rb +42 -0
- data/lib/sinatra/config_file.rb +151 -0
- data/lib/sinatra/content_for.rb +111 -0
- data/lib/sinatra/contrib.rb +39 -0
- data/lib/sinatra/contrib/all.rb +2 -0
- data/lib/sinatra/contrib/setup.rb +53 -0
- data/lib/sinatra/contrib/version.rb +45 -0
- data/lib/sinatra/decompile.rb +113 -0
- data/lib/sinatra/engine_tracking.rb +96 -0
- data/lib/sinatra/extension.rb +95 -0
- data/lib/sinatra/json.rb +134 -0
- data/lib/sinatra/link_header.rb +132 -0
- data/lib/sinatra/namespace.rb +282 -0
- data/lib/sinatra/reloader.rb +384 -0
- data/lib/sinatra/respond_with.rb +245 -0
- data/lib/sinatra/streaming.rb +267 -0
- data/lib/sinatra/test_helpers.rb +87 -0
- data/sinatra-contrib.gemspec +121 -0
- data/spec/capture_spec.rb +80 -0
- data/spec/config_file/key_value.yml +6 -0
- data/spec/config_file/missing_env.yml +4 -0
- data/spec/config_file/with_envs.yml +7 -0
- data/spec/config_file/with_nested_envs.yml +11 -0
- data/spec/config_file_spec.rb +44 -0
- data/spec/content_for/different_key.erb +1 -0
- data/spec/content_for/different_key.erubis +1 -0
- data/spec/content_for/different_key.haml +2 -0
- data/spec/content_for/different_key.slim +2 -0
- data/spec/content_for/layout.erb +1 -0
- data/spec/content_for/layout.erubis +1 -0
- data/spec/content_for/layout.haml +1 -0
- data/spec/content_for/layout.slim +1 -0
- data/spec/content_for/multiple_blocks.erb +4 -0
- data/spec/content_for/multiple_blocks.erubis +4 -0
- data/spec/content_for/multiple_blocks.haml +8 -0
- data/spec/content_for/multiple_blocks.slim +8 -0
- data/spec/content_for/multiple_yields.erb +3 -0
- data/spec/content_for/multiple_yields.erubis +3 -0
- data/spec/content_for/multiple_yields.haml +3 -0
- data/spec/content_for/multiple_yields.slim +3 -0
- data/spec/content_for/passes_values.erb +1 -0
- data/spec/content_for/passes_values.erubis +1 -0
- data/spec/content_for/passes_values.haml +1 -0
- data/spec/content_for/passes_values.slim +1 -0
- data/spec/content_for/same_key.erb +1 -0
- data/spec/content_for/same_key.erubis +1 -0
- data/spec/content_for/same_key.haml +2 -0
- data/spec/content_for/same_key.slim +2 -0
- data/spec/content_for/takes_values.erb +1 -0
- data/spec/content_for/takes_values.erubis +1 -0
- data/spec/content_for/takes_values.haml +3 -0
- data/spec/content_for/takes_values.slim +3 -0
- data/spec/content_for_spec.rb +201 -0
- data/spec/decompile_spec.rb +44 -0
- data/spec/extension_spec.rb +33 -0
- data/spec/json_spec.rb +115 -0
- data/spec/link_header_spec.rb +100 -0
- data/spec/namespace/foo.erb +1 -0
- data/spec/namespace/nested/foo.erb +1 -0
- data/spec/namespace_spec.rb +623 -0
- data/spec/okjson.rb +581 -0
- data/spec/reloader/app.rb.erb +40 -0
- data/spec/reloader_spec.rb +441 -0
- data/spec/respond_with/bar.erb +1 -0
- data/spec/respond_with/bar.json.erb +1 -0
- data/spec/respond_with/foo.html.erb +1 -0
- data/spec/respond_with/not_html.sass +2 -0
- data/spec/respond_with_spec.rb +289 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/streaming_spec.rb +436 -0
- metadata +252 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'backports'
|
2
|
+
require 'slim'
|
3
|
+
require_relative 'spec_helper'
|
4
|
+
|
5
|
+
describe Sinatra::Capture do
|
6
|
+
subject do
|
7
|
+
Sinatra.new do
|
8
|
+
enable :inline_templates
|
9
|
+
helpers Sinatra::Capture
|
10
|
+
end.new!
|
11
|
+
end
|
12
|
+
Tilt.prefer Tilt::ERBTemplate
|
13
|
+
|
14
|
+
extend Forwardable
|
15
|
+
def_delegators :subject, :capture, :capture_later
|
16
|
+
|
17
|
+
def render(engine, template)
|
18
|
+
subject.send(:render, engine, template.to_sym).strip.gsub(/\s+/, ' ')
|
19
|
+
end
|
20
|
+
|
21
|
+
shared_examples_for "a template language" do |engine|
|
22
|
+
lang = engine == :erubis ? :erb : engine
|
23
|
+
|
24
|
+
it "captures content" do
|
25
|
+
render(engine, "simple_#{lang}").should == "Say Hello World!"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "allows nested captures" do
|
29
|
+
render(engine, "nested_#{lang}").should == "Say Hello World!"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe('haml') { it_behaves_like "a template language", :haml }
|
34
|
+
describe('slim') { it_behaves_like "a template language", :slim }
|
35
|
+
describe('erb') { it_behaves_like "a template language", :erb }
|
36
|
+
describe('erubis') { it_behaves_like "a template language", :erubis }
|
37
|
+
end
|
38
|
+
|
39
|
+
__END__
|
40
|
+
|
41
|
+
@@ simple_erb
|
42
|
+
Say
|
43
|
+
<% a = capture do %>World<% end %>
|
44
|
+
Hello <%= a %>!
|
45
|
+
|
46
|
+
@@ nested_erb
|
47
|
+
Say
|
48
|
+
<% a = capture do %>
|
49
|
+
<% b = capture do %>World<% end %>
|
50
|
+
<%= b %>!
|
51
|
+
<% end %>
|
52
|
+
Hello <%= a.strip %>
|
53
|
+
|
54
|
+
@@ simple_slim
|
55
|
+
| Say
|
56
|
+
- a = capture do
|
57
|
+
| World
|
58
|
+
| Hello #{a.strip}!
|
59
|
+
|
60
|
+
@@ nested_slim
|
61
|
+
| Say
|
62
|
+
- a = capture do
|
63
|
+
- b = capture do
|
64
|
+
| World
|
65
|
+
| #{b.strip}!
|
66
|
+
| Hello #{a.strip}
|
67
|
+
|
68
|
+
@@ simple_haml
|
69
|
+
Say
|
70
|
+
- a = capture do
|
71
|
+
World
|
72
|
+
Hello #{a.strip}!
|
73
|
+
|
74
|
+
@@ nested_haml
|
75
|
+
Say
|
76
|
+
- a = capture do
|
77
|
+
- b = capture do
|
78
|
+
World
|
79
|
+
#{b.strip}!
|
80
|
+
Hello #{a.strip}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'backports'
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
|
4
|
+
describe Sinatra::ConfigFile do
|
5
|
+
def config_file(*args, &block)
|
6
|
+
mock_app do
|
7
|
+
register Sinatra::ConfigFile
|
8
|
+
set :root, File.expand_path('../config_file', __FILE__)
|
9
|
+
instance_eval(&block) if block
|
10
|
+
config_file(*args)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should set options from a simple config_file' do
|
15
|
+
config_file 'key_value.yml'
|
16
|
+
settings.foo.should == 'bar'
|
17
|
+
settings.something.should == 42
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should create indifferent hashes' do
|
21
|
+
config_file 'key_value.yml'
|
22
|
+
settings.nested['a'].should == 1
|
23
|
+
settings.nested[:a].should == 1
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should recognize env specific settings per file' do
|
27
|
+
config_file 'with_envs.yml'
|
28
|
+
settings.foo.should == 'test'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should recognize env specific settings per setting' do
|
32
|
+
config_file 'with_nested_envs.yml'
|
33
|
+
settings.database[:adapter].should == 'sqlite'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should not set present values to nil if the current env is missing' do
|
37
|
+
# first let's check the test is actually working properly
|
38
|
+
config_file('missing_env.yml') { set :foo => 42, :environment => :production }
|
39
|
+
settings.foo.should == 10
|
40
|
+
# now test it
|
41
|
+
config_file('missing_env.yml') { set :foo => 42, :environment => :test }
|
42
|
+
settings.foo.should == 42
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<% content_for :bar do %>bar<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<% content_for :bar do %>bar<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield_content :foo %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield_content :foo %>
|
@@ -0,0 +1 @@
|
|
1
|
+
= yield_content :foo
|
@@ -0,0 +1 @@
|
|
1
|
+
= yield_content :foo
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield_content :foo, 1, 2 %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield_content :foo, 1, 2 %>
|
@@ -0,0 +1 @@
|
|
1
|
+
= yield_content :foo, 1, 2
|
@@ -0,0 +1 @@
|
|
1
|
+
== yield_content :foo, 1, 2
|
@@ -0,0 +1 @@
|
|
1
|
+
<% content_for :foo do %>foo<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<% content_for :foo do %>foo<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<% content_for :foo do |a, b| %><i><%= a %></i> <%= b %><% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<% content_for :foo do |a, b| %><i><%= a %></i> <%= b %><% end %>
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require 'backports'
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
|
4
|
+
describe Sinatra::ContentFor do
|
5
|
+
subject do
|
6
|
+
Sinatra.new do
|
7
|
+
helpers Sinatra::ContentFor
|
8
|
+
set :views, File.expand_path("../content_for", __FILE__)
|
9
|
+
end.new!
|
10
|
+
end
|
11
|
+
|
12
|
+
Tilt.prefer Tilt::ERBTemplate
|
13
|
+
|
14
|
+
extend Forwardable
|
15
|
+
def_delegators :subject, :content_for, :yield_content
|
16
|
+
def render(engine, template)
|
17
|
+
subject.send(:render, engine, template, :layout => false).gsub(/\s/, '')
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "without templates" do
|
21
|
+
it 'renders blocks declared with the same key you use when rendering' do
|
22
|
+
content_for(:foo) { "foo" }
|
23
|
+
yield_content(:foo).should == "foo"
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'renders blocks more than once' do
|
27
|
+
content_for(:foo) { "foo" }
|
28
|
+
3.times { yield_content(:foo).should == "foo" }
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'does not render a block with a different key' do
|
32
|
+
content_for(:bar) { "bar" }
|
33
|
+
yield_content(:foo).should be_empty
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'renders multiple blocks with the same key' do
|
37
|
+
content_for(:foo) { "foo" }
|
38
|
+
content_for(:foo) { "bar" }
|
39
|
+
content_for(:bar) { "WON'T RENDER ME" }
|
40
|
+
content_for(:foo) { "baz" }
|
41
|
+
yield_content(:foo).should == "foobarbaz"
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'renders multiple blocks more than once' do
|
45
|
+
content_for(:foo) { "foo" }
|
46
|
+
content_for(:foo) { "bar" }
|
47
|
+
content_for(:bar) { "WON'T RENDER ME" }
|
48
|
+
content_for(:foo) { "baz" }
|
49
|
+
3.times { yield_content(:foo).should == "foobarbaz" }
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'passes values to the blocks' do
|
53
|
+
content_for(:foo) { |a| a.upcase }
|
54
|
+
yield_content(:foo, 'a').should == "A"
|
55
|
+
yield_content(:foo, 'b').should == "B"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# TODO: liquid radius markaby builder nokogiri
|
60
|
+
engines = %w[erb erubis haml slim]
|
61
|
+
|
62
|
+
engines.each do |inner|
|
63
|
+
describe inner.capitalize do
|
64
|
+
before :all do
|
65
|
+
begin
|
66
|
+
require inner
|
67
|
+
rescue LoadError => e
|
68
|
+
pending "Skipping: " << e.message
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "with yield_content in Ruby" do
|
73
|
+
it 'renders blocks declared with the same key you use when rendering' do
|
74
|
+
render inner, :same_key
|
75
|
+
yield_content(:foo).strip.should == "foo"
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'renders blocks more than once' do
|
79
|
+
render inner, :same_key
|
80
|
+
3.times { yield_content(:foo).strip.should == "foo" }
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'does not render a block with a different key' do
|
84
|
+
render inner, :different_key
|
85
|
+
yield_content(:foo).should be_empty
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'renders multiple blocks with the same key' do
|
89
|
+
render inner, :multiple_blocks
|
90
|
+
yield_content(:foo).gsub(/\s/, '').should == "foobarbaz"
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'renders multiple blocks more than once' do
|
94
|
+
render inner, :multiple_blocks
|
95
|
+
3.times { yield_content(:foo).gsub(/\s/, '').should == "foobarbaz" }
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'passes values to the blocks' do
|
99
|
+
render inner, :takes_values
|
100
|
+
yield_content(:foo, 1, 2).gsub(/\s/, '').should == "<i>1</i>2"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "with content_for in Ruby" do
|
105
|
+
it 'renders blocks declared with the same key you use when rendering' do
|
106
|
+
content_for(:foo) { "foo" }
|
107
|
+
render(inner, :layout).should == "foo"
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'renders blocks more than once' do
|
111
|
+
content_for(:foo) { "foo" }
|
112
|
+
render(inner, :multiple_yields).should == "foofoofoo"
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'does not render a block with a different key' do
|
116
|
+
content_for(:bar) { "foo" }
|
117
|
+
render(inner, :layout).should be_empty
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'renders multiple blocks with the same key' do
|
121
|
+
content_for(:foo) { "foo" }
|
122
|
+
content_for(:foo) { "bar" }
|
123
|
+
content_for(:bar) { "WON'T RENDER ME" }
|
124
|
+
content_for(:foo) { "baz" }
|
125
|
+
render(inner, :layout).should == "foobarbaz"
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'renders multiple blocks more than once' do
|
129
|
+
content_for(:foo) { "foo" }
|
130
|
+
content_for(:foo) { "bar" }
|
131
|
+
content_for(:bar) { "WON'T RENDER ME" }
|
132
|
+
content_for(:foo) { "baz" }
|
133
|
+
render(inner, :multiple_yields).should == "foobarbazfoobarbazfoobarbaz"
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'passes values to the blocks' do
|
137
|
+
content_for(:foo) { |a,b| "<i>#{a}</i>#{b}" }
|
138
|
+
render(inner, :passes_values).should == "<i>1</i>2"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
engines.each do |outer|
|
143
|
+
describe "with yield_content in #{outer.capitalize}" do
|
144
|
+
def body
|
145
|
+
last_response.body.gsub(/\s/, '')
|
146
|
+
end
|
147
|
+
|
148
|
+
before :all do
|
149
|
+
begin
|
150
|
+
require outer
|
151
|
+
rescue LoadError => e
|
152
|
+
pending "Skipping: " << e.message
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
before do
|
157
|
+
mock_app do
|
158
|
+
helpers Sinatra::ContentFor
|
159
|
+
set inner, :layout_engine => outer
|
160
|
+
set :views, File.expand_path("../content_for", __FILE__)
|
161
|
+
get('/:view') { render(inner, params[:view].to_sym) }
|
162
|
+
get('/:layout/:view') do
|
163
|
+
render inner, params[:view].to_sym, :layout => params[:layout].to_sym
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'renders blocks declared with the same key you use when rendering' do
|
169
|
+
get('/same_key').should be_ok
|
170
|
+
body.should == "foo"
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'renders blocks more than once' do
|
174
|
+
get('/multiple_yields/same_key').should be_ok
|
175
|
+
body.should == "foofoofoo"
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'does not render a block with a different key' do
|
179
|
+
get('/different_key').should be_ok
|
180
|
+
body.should be_empty
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'renders multiple blocks with the same key' do
|
184
|
+
get('/multiple_blocks').should be_ok
|
185
|
+
body.should == "foobarbaz"
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'renders multiple blocks more than once' do
|
189
|
+
get('/multiple_yields/multiple_blocks').should be_ok
|
190
|
+
body.should == "foobarbazfoobarbazfoobarbaz"
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'passes values to the blocks' do
|
194
|
+
get('/passes_values/takes_values').should be_ok
|
195
|
+
body.should == "<i>1</i>2"
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|