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 +75 -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/cookies.rb +331 -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/multi_route.rb +81 -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 +125 -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/cookies_spec.rb +782 -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/multi_route_spec.rb +45 -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 +256 -0
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'rack/test'
|
3
|
+
require 'rack'
|
4
|
+
require 'forwardable'
|
5
|
+
|
6
|
+
module Sinatra
|
7
|
+
Base.set :environment, :test
|
8
|
+
|
9
|
+
module TestHelpers
|
10
|
+
class Session < Rack::Test::Session
|
11
|
+
def global_env
|
12
|
+
@global_env ||= {}
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def default_env
|
18
|
+
super.merge global_env
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
include Rack::Test::Methods
|
23
|
+
extend Forwardable
|
24
|
+
attr_accessor :settings
|
25
|
+
|
26
|
+
def_delegators :last_response, :body, :headers, :status, :errors
|
27
|
+
def_delegators :app, :configure, :set, :enable, :disable, :use, :helpers, :register
|
28
|
+
def_delegators :current_session, :env_for
|
29
|
+
def_delegators :rack_mock_session, :cookie_jar
|
30
|
+
|
31
|
+
def mock_app(base = Sinatra::Base, &block)
|
32
|
+
inner = nil
|
33
|
+
@app = Sinatra.new(base) do
|
34
|
+
inner = self
|
35
|
+
class_eval(&block)
|
36
|
+
end
|
37
|
+
@settings = inner
|
38
|
+
app
|
39
|
+
end
|
40
|
+
|
41
|
+
def app=(base)
|
42
|
+
@app = base
|
43
|
+
end
|
44
|
+
|
45
|
+
alias set_app app=
|
46
|
+
|
47
|
+
def app
|
48
|
+
@app ||= Class.new Sinatra::Base
|
49
|
+
Rack::Lint.new @app
|
50
|
+
end
|
51
|
+
|
52
|
+
unless method_defined? :options
|
53
|
+
def options(uri, params = {}, env = {}, &block)
|
54
|
+
env = env_for(uri, env.merge(:method => "OPTIONS", :params => params))
|
55
|
+
current_session.send(:process_request, uri, env, &block)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
unless method_defined? :patch
|
60
|
+
def patch(uri, params = {}, env = {}, &block)
|
61
|
+
env = env_for(uri, env.merge(:method => "PATCH", :params => params))
|
62
|
+
current_session.send(:process_request, uri, env, &block)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def last_request?
|
67
|
+
last_request
|
68
|
+
true
|
69
|
+
rescue Rack::Test::Error
|
70
|
+
false
|
71
|
+
end
|
72
|
+
|
73
|
+
def session
|
74
|
+
return {} unless last_request?
|
75
|
+
raise Rack::Test:Error, "session not enabled for app" unless last_env["rack.session"] or app.session?
|
76
|
+
last_request.session
|
77
|
+
end
|
78
|
+
|
79
|
+
def last_env
|
80
|
+
last_request.env
|
81
|
+
end
|
82
|
+
|
83
|
+
def build_rack_test_session(name) # :nodoc:
|
84
|
+
Session.new rack_mock_session(name)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# Run `rake sinatra-contrib.gemspec` to update the gemspec.
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.name = "sinatra-contrib"
|
4
|
+
s.version = "1.3.0"
|
5
|
+
s.description = "Collection of useful Sinatra extensions"
|
6
|
+
s.homepage = "http://github.com/sinatra/sinatra-contrib"
|
7
|
+
s.summary = s.description
|
8
|
+
|
9
|
+
# generated from git shortlog -sn
|
10
|
+
s.authors = [
|
11
|
+
"Konstantin Haase",
|
12
|
+
"Gabriel Andretta",
|
13
|
+
"Nicolas Sanguinetti",
|
14
|
+
"Eliot Shepard",
|
15
|
+
"Andrew Crump",
|
16
|
+
"Matt Lyon",
|
17
|
+
"undr"
|
18
|
+
]
|
19
|
+
|
20
|
+
# generated from git shortlog -sne
|
21
|
+
s.email = [
|
22
|
+
"konstantin.mailinglists@googlemail.com",
|
23
|
+
"ohhgabriel@gmail.com",
|
24
|
+
"contacto@nicolassanguinetti.info",
|
25
|
+
"eshepard@slower.net",
|
26
|
+
"andrew.crump@ieee.org",
|
27
|
+
"matt@flowerpowered.com",
|
28
|
+
"undr@yandex.ru"
|
29
|
+
]
|
30
|
+
|
31
|
+
# generated from git ls-files
|
32
|
+
s.files = [
|
33
|
+
"LICENSE",
|
34
|
+
"README.md",
|
35
|
+
"Rakefile",
|
36
|
+
"ideas.md",
|
37
|
+
"lib/sinatra/capture.rb",
|
38
|
+
"lib/sinatra/config_file.rb",
|
39
|
+
"lib/sinatra/content_for.rb",
|
40
|
+
"lib/sinatra/contrib.rb",
|
41
|
+
"lib/sinatra/contrib/all.rb",
|
42
|
+
"lib/sinatra/contrib/setup.rb",
|
43
|
+
"lib/sinatra/contrib/version.rb",
|
44
|
+
"lib/sinatra/cookies.rb",
|
45
|
+
"lib/sinatra/decompile.rb",
|
46
|
+
"lib/sinatra/engine_tracking.rb",
|
47
|
+
"lib/sinatra/extension.rb",
|
48
|
+
"lib/sinatra/json.rb",
|
49
|
+
"lib/sinatra/link_header.rb",
|
50
|
+
"lib/sinatra/multi_route.rb",
|
51
|
+
"lib/sinatra/namespace.rb",
|
52
|
+
"lib/sinatra/reloader.rb",
|
53
|
+
"lib/sinatra/respond_with.rb",
|
54
|
+
"lib/sinatra/streaming.rb",
|
55
|
+
"lib/sinatra/test_helpers.rb",
|
56
|
+
"sinatra-contrib.gemspec",
|
57
|
+
"spec/capture_spec.rb",
|
58
|
+
"spec/config_file/key_value.yml",
|
59
|
+
"spec/config_file/missing_env.yml",
|
60
|
+
"spec/config_file/with_envs.yml",
|
61
|
+
"spec/config_file/with_nested_envs.yml",
|
62
|
+
"spec/config_file_spec.rb",
|
63
|
+
"spec/content_for/different_key.erb",
|
64
|
+
"spec/content_for/different_key.erubis",
|
65
|
+
"spec/content_for/different_key.haml",
|
66
|
+
"spec/content_for/different_key.slim",
|
67
|
+
"spec/content_for/layout.erb",
|
68
|
+
"spec/content_for/layout.erubis",
|
69
|
+
"spec/content_for/layout.haml",
|
70
|
+
"spec/content_for/layout.slim",
|
71
|
+
"spec/content_for/multiple_blocks.erb",
|
72
|
+
"spec/content_for/multiple_blocks.erubis",
|
73
|
+
"spec/content_for/multiple_blocks.haml",
|
74
|
+
"spec/content_for/multiple_blocks.slim",
|
75
|
+
"spec/content_for/multiple_yields.erb",
|
76
|
+
"spec/content_for/multiple_yields.erubis",
|
77
|
+
"spec/content_for/multiple_yields.haml",
|
78
|
+
"spec/content_for/multiple_yields.slim",
|
79
|
+
"spec/content_for/passes_values.erb",
|
80
|
+
"spec/content_for/passes_values.erubis",
|
81
|
+
"spec/content_for/passes_values.haml",
|
82
|
+
"spec/content_for/passes_values.slim",
|
83
|
+
"spec/content_for/same_key.erb",
|
84
|
+
"spec/content_for/same_key.erubis",
|
85
|
+
"spec/content_for/same_key.haml",
|
86
|
+
"spec/content_for/same_key.slim",
|
87
|
+
"spec/content_for/takes_values.erb",
|
88
|
+
"spec/content_for/takes_values.erubis",
|
89
|
+
"spec/content_for/takes_values.haml",
|
90
|
+
"spec/content_for/takes_values.slim",
|
91
|
+
"spec/content_for_spec.rb",
|
92
|
+
"spec/cookies_spec.rb",
|
93
|
+
"spec/decompile_spec.rb",
|
94
|
+
"spec/extension_spec.rb",
|
95
|
+
"spec/json_spec.rb",
|
96
|
+
"spec/link_header_spec.rb",
|
97
|
+
"spec/multi_route_spec.rb",
|
98
|
+
"spec/namespace/foo.erb",
|
99
|
+
"spec/namespace/nested/foo.erb",
|
100
|
+
"spec/namespace_spec.rb",
|
101
|
+
"spec/okjson.rb",
|
102
|
+
"spec/reloader/app.rb.erb",
|
103
|
+
"spec/reloader_spec.rb",
|
104
|
+
"spec/respond_with/bar.erb",
|
105
|
+
"spec/respond_with/bar.json.erb",
|
106
|
+
"spec/respond_with/foo.html.erb",
|
107
|
+
"spec/respond_with/not_html.sass",
|
108
|
+
"spec/respond_with_spec.rb",
|
109
|
+
"spec/spec_helper.rb",
|
110
|
+
"spec/streaming_spec.rb"
|
111
|
+
]
|
112
|
+
|
113
|
+
s.add_dependency "sinatra", "~> 1.3.0"
|
114
|
+
s.add_dependency "backports", ">= 2.0"
|
115
|
+
s.add_dependency "tilt", "~> 1.3"
|
116
|
+
s.add_dependency "rack-test"
|
117
|
+
s.add_dependency "rack-protection"
|
118
|
+
s.add_dependency "eventmachine"
|
119
|
+
|
120
|
+
s.add_development_dependency "rspec", "~> 2.3"
|
121
|
+
s.add_development_dependency "haml"
|
122
|
+
s.add_development_dependency "erubis"
|
123
|
+
s.add_development_dependency "slim"
|
124
|
+
s.add_development_dependency "rake"
|
125
|
+
end
|
@@ -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
|