jellyfish 0.6.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +0 -1
- data/.travis.yml +1 -0
- data/CHANGES.md +71 -0
- data/README.md +488 -20
- data/jellyfish.gemspec +25 -10
- data/lib/jellyfish.rb +84 -40
- data/lib/jellyfish/chunked_body.rb +20 -0
- data/lib/jellyfish/multi_actions.rb +35 -0
- data/lib/jellyfish/newrelic.rb +0 -1
- data/lib/jellyfish/normalized_params.rb +55 -0
- data/lib/jellyfish/normalized_path.rb +13 -0
- data/lib/jellyfish/sinatra.rb +6 -47
- data/lib/jellyfish/test.rb +7 -2
- data/lib/jellyfish/version.rb +1 -1
- data/task/gemgem.rb +7 -6
- data/test/sinatra/test_base.rb +110 -0
- data/test/sinatra/test_chunked_body.rb +43 -0
- data/test/sinatra/test_error.rb +145 -0
- data/test/sinatra/test_multi_actions.rb +217 -0
- data/test/sinatra/test_routing.rb +425 -0
- data/test/test_from_readme.rb +39 -0
- data/test/test_inheritance.rb +88 -0
- metadata +32 -25
- data/example/config.ru +0 -118
- data/example/rainbows.rb +0 -4
- data/example/server.sh +0 -3
@@ -0,0 +1,88 @@
|
|
1
|
+
|
2
|
+
require 'jellyfish/test'
|
3
|
+
|
4
|
+
describe 'Inheritance' do
|
5
|
+
behaves_like :jellyfish
|
6
|
+
|
7
|
+
should 'inherit routes' do
|
8
|
+
sup = Class.new{
|
9
|
+
include Jellyfish
|
10
|
+
get('/0'){ 'a' }
|
11
|
+
}
|
12
|
+
app = Class.new(sup){
|
13
|
+
get('/1'){ 'b' }
|
14
|
+
}.new
|
15
|
+
|
16
|
+
[['/0', 'a'], ['/1', 'b']].each do |(path, expect)|
|
17
|
+
_, _, body = get(path, app)
|
18
|
+
body.should.eq [expect]
|
19
|
+
end
|
20
|
+
|
21
|
+
_, _, body = get('/0', sup.new)
|
22
|
+
body.should.eq ['a']
|
23
|
+
status, _, _ = get('/1', sup.new)
|
24
|
+
status.should.eq 404
|
25
|
+
|
26
|
+
sup .routes['get'].size.should.eq 1
|
27
|
+
app.class.routes['get'].size.should.eq 2
|
28
|
+
end
|
29
|
+
|
30
|
+
should 'inherit handlers' do
|
31
|
+
sup = Class.new{
|
32
|
+
include Jellyfish
|
33
|
+
handle(TypeError){ 'a' }
|
34
|
+
get('/type') { raise TypeError }
|
35
|
+
get('/argue'){ raise ArgumentError }
|
36
|
+
}
|
37
|
+
app = Class.new(sup){
|
38
|
+
handle(ArgumentError){ 'b' }
|
39
|
+
}.new
|
40
|
+
|
41
|
+
[['/type', 'a'], ['/argue', 'b']].each do |(path, expect)|
|
42
|
+
_, _, body = get(path, app)
|
43
|
+
body.should.eq [expect]
|
44
|
+
end
|
45
|
+
|
46
|
+
sup .handlers.size.should.eq 1
|
47
|
+
app.class.handlers.size.should.eq 2
|
48
|
+
end
|
49
|
+
|
50
|
+
should 'inherit controller' do
|
51
|
+
sup = Class.new{
|
52
|
+
include Jellyfish
|
53
|
+
controller_include Module.new{ def f; 'a'; end }
|
54
|
+
get('/0'){ f }
|
55
|
+
}
|
56
|
+
app = Class.new(sup){
|
57
|
+
get('/1'){ f }
|
58
|
+
}.new
|
59
|
+
|
60
|
+
[['/0', 'a'], ['/1', 'a']].each do |(path, expect)|
|
61
|
+
_, _, body = get(path, app)
|
62
|
+
body.should.eq [expect]
|
63
|
+
end
|
64
|
+
|
65
|
+
sup .controller_include.size.should.eq 1
|
66
|
+
app.class.controller_include.size.should.eq 1
|
67
|
+
end
|
68
|
+
|
69
|
+
should 'inherit handle_exceptions' do
|
70
|
+
sup = Class.new{
|
71
|
+
include Jellyfish
|
72
|
+
handle_exceptions false
|
73
|
+
}
|
74
|
+
app = Class.new(sup)
|
75
|
+
|
76
|
+
sup.handle_exceptions.should.eq false
|
77
|
+
app.handle_exceptions.should.eq false
|
78
|
+
|
79
|
+
sup.handle_exceptions true
|
80
|
+
sup.handle_exceptions.should.eq true
|
81
|
+
app.handle_exceptions.should.eq false
|
82
|
+
|
83
|
+
sup.handle_exceptions false
|
84
|
+
app.handle_exceptions true
|
85
|
+
sup.handle_exceptions.should.eq false
|
86
|
+
app.handle_exceptions.should.eq true
|
87
|
+
end
|
88
|
+
end
|
metadata
CHANGED
@@ -1,51 +1,46 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jellyfish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.8.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Lin Jen-Shin (godfat)
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-06-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rack
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: bacon
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
|
-
description:
|
47
|
-
|
48
|
-
For Rack applications or Rack middlewares.
|
41
|
+
description: |-
|
42
|
+
Pico web framework for building API-centric web applications.
|
43
|
+
For Rack applications or Rack middlewares. Around 200 lines of code.
|
49
44
|
email:
|
50
45
|
- godfat (XD) godfat.org
|
51
46
|
executables: []
|
@@ -61,13 +56,14 @@ files:
|
|
61
56
|
- README.md
|
62
57
|
- Rakefile
|
63
58
|
- TODO.md
|
64
|
-
- example/config.ru
|
65
|
-
- example/rainbows.rb
|
66
|
-
- example/server.sh
|
67
59
|
- jellyfish.gemspec
|
68
60
|
- jellyfish.png
|
69
61
|
- lib/jellyfish.rb
|
62
|
+
- lib/jellyfish/chunked_body.rb
|
63
|
+
- lib/jellyfish/multi_actions.rb
|
70
64
|
- lib/jellyfish/newrelic.rb
|
65
|
+
- lib/jellyfish/normalized_params.rb
|
66
|
+
- lib/jellyfish/normalized_path.rb
|
71
67
|
- lib/jellyfish/public/302.html
|
72
68
|
- lib/jellyfish/public/404.html
|
73
69
|
- lib/jellyfish/public/500.html
|
@@ -77,30 +73,41 @@ files:
|
|
77
73
|
- task/.gitignore
|
78
74
|
- task/gemgem.rb
|
79
75
|
- test/sinatra/test_base.rb
|
76
|
+
- test/sinatra/test_chunked_body.rb
|
77
|
+
- test/sinatra/test_error.rb
|
78
|
+
- test/sinatra/test_multi_actions.rb
|
79
|
+
- test/sinatra/test_routing.rb
|
80
|
+
- test/test_from_readme.rb
|
81
|
+
- test/test_inheritance.rb
|
80
82
|
homepage: https://github.com/godfat/jellyfish
|
81
|
-
licenses:
|
83
|
+
licenses:
|
84
|
+
- Apache License 2.0
|
85
|
+
metadata: {}
|
82
86
|
post_install_message:
|
83
87
|
rdoc_options: []
|
84
88
|
require_paths:
|
85
89
|
- lib
|
86
90
|
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
-
none: false
|
88
91
|
requirements:
|
89
|
-
- -
|
92
|
+
- - '>='
|
90
93
|
- !ruby/object:Gem::Version
|
91
94
|
version: '0'
|
92
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
-
none: false
|
94
96
|
requirements:
|
95
|
-
- -
|
97
|
+
- - '>='
|
96
98
|
- !ruby/object:Gem::Version
|
97
99
|
version: '0'
|
98
100
|
requirements: []
|
99
101
|
rubyforge_project:
|
100
|
-
rubygems_version:
|
102
|
+
rubygems_version: 2.0.3
|
101
103
|
signing_key:
|
102
|
-
specification_version:
|
104
|
+
specification_version: 4
|
103
105
|
summary: Pico web framework for building API-centric web applications.
|
104
106
|
test_files:
|
105
107
|
- test/sinatra/test_base.rb
|
106
|
-
|
108
|
+
- test/sinatra/test_chunked_body.rb
|
109
|
+
- test/sinatra/test_error.rb
|
110
|
+
- test/sinatra/test_multi_actions.rb
|
111
|
+
- test/sinatra/test_routing.rb
|
112
|
+
- test/test_from_readme.rb
|
113
|
+
- test/test_inheritance.rb
|
data/example/config.ru
DELETED
@@ -1,118 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'jellyfish'
|
3
|
-
|
4
|
-
Overheat = Class.new(RuntimeError)
|
5
|
-
|
6
|
-
class Tank
|
7
|
-
include Jellyfish
|
8
|
-
handle_exceptions false
|
9
|
-
|
10
|
-
get '/' do
|
11
|
-
"Jelly Kelly\n"
|
12
|
-
end
|
13
|
-
|
14
|
-
get %r{^/(?<id>\d+)$} do |match|
|
15
|
-
"Jelly ##{match[:id]}\n"
|
16
|
-
end
|
17
|
-
|
18
|
-
post '/' do
|
19
|
-
headers 'X-Jellyfish-Life' => '100'
|
20
|
-
headers_merge 'X-Jellyfish-Mana' => '200'
|
21
|
-
body "Jellyfish 100/200\n"
|
22
|
-
status 201
|
23
|
-
'return is ignored if body has already been set'
|
24
|
-
end
|
25
|
-
|
26
|
-
get '/env' do
|
27
|
-
"#{env.inspect}\n"
|
28
|
-
end
|
29
|
-
|
30
|
-
get '/lookup' do
|
31
|
-
found "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/"
|
32
|
-
end
|
33
|
-
|
34
|
-
get '/crash' do
|
35
|
-
raise 'crash'
|
36
|
-
end
|
37
|
-
|
38
|
-
handle NameError do |e|
|
39
|
-
status 403
|
40
|
-
"No one hears you: #{e.backtrace.first}\n"
|
41
|
-
end
|
42
|
-
|
43
|
-
get '/yell' do
|
44
|
-
yell
|
45
|
-
end
|
46
|
-
|
47
|
-
class Matcher
|
48
|
-
def match path
|
49
|
-
path.reverse == 'match/'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
get Matcher.new do |match|
|
53
|
-
"#{match}\n"
|
54
|
-
end
|
55
|
-
|
56
|
-
class Body
|
57
|
-
def each
|
58
|
-
if Object.const_defined?(:Rainbows)
|
59
|
-
(0..4).each{ |i| yield "#{i}\n"; Rainbows.sleep(0.1) }
|
60
|
-
else
|
61
|
-
yield "You need Rainbows + FiberSpawn (or so) for this\n"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
get '/chunked' do
|
66
|
-
Body.new
|
67
|
-
end
|
68
|
-
|
69
|
-
get '/overheat' do
|
70
|
-
raise Overheat
|
71
|
-
end
|
72
|
-
|
73
|
-
# get a hint that use `next' instead;
|
74
|
-
get '/return' do; return; end
|
75
|
-
get '/break' do; break ; end
|
76
|
-
get '/next' do; next ; end # this works
|
77
|
-
end
|
78
|
-
|
79
|
-
class Heater
|
80
|
-
include Jellyfish
|
81
|
-
handle Overheat do
|
82
|
-
status 500
|
83
|
-
"It's overheated\n"
|
84
|
-
end
|
85
|
-
|
86
|
-
get '/status' do
|
87
|
-
temperature
|
88
|
-
end
|
89
|
-
|
90
|
-
get %r{^/sinatra/(?<id>\d+)$} do
|
91
|
-
"#{params[:id]}\n"
|
92
|
-
end
|
93
|
-
|
94
|
-
def controller; Controller; end
|
95
|
-
class Controller < Jellyfish::Controller
|
96
|
-
include Jellyfish::Sinatra
|
97
|
-
include Jellyfish::NewRelic
|
98
|
-
def temperature
|
99
|
-
"30\u{2103}\n"
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
HugeTank = Rack::Builder.new do
|
105
|
-
use Rack::Chunked # order does matter, need to check Content-Length first
|
106
|
-
use Rack::ContentLength
|
107
|
-
use Rack::ContentType, 'text/plain'
|
108
|
-
use Heater
|
109
|
-
run Tank.new
|
110
|
-
end
|
111
|
-
|
112
|
-
require 'cgi' # newrelic needs this
|
113
|
-
require 'new_relic/rack/developer_mode'
|
114
|
-
use NewRelic::Rack::DeveloperMode
|
115
|
-
|
116
|
-
run HugeTank
|
117
|
-
|
118
|
-
NewRelic::Agent.manual_start(:developer_mode => true)
|
data/example/rainbows.rb
DELETED
data/example/server.sh
DELETED