nyara 0.0.1.pre.2 → 0.0.1.pre.3
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.
- checksums.yaml +4 -4
- data/ext/accept.c +29 -33
- data/ext/event.c +218 -22
- data/ext/extconf.rb +3 -3
- data/ext/hashes.c +2 -1
- data/ext/http_parser.c +6 -0
- data/ext/inc/epoll.h +11 -9
- data/ext/inc/kqueue.h +14 -17
- data/ext/inc/str_intern.h +2 -2
- data/ext/mime.c +2 -0
- data/ext/multipart_parser.c +2 -0
- data/ext/nyara.c +2 -0
- data/ext/nyara.h +15 -9
- data/ext/request.c +88 -266
- data/ext/request.h +43 -0
- data/ext/request_parse.c +123 -0
- data/ext/route.cc +2 -0
- data/ext/url_encoded.c +66 -6
- data/hello.rb +8 -2
- data/lib/nyara/controller.rb +29 -10
- data/lib/nyara/cookie.rb +3 -2
- data/lib/nyara/nyara.rb +41 -27
- data/lib/nyara/patch_tcp_socket.rb +22 -0
- data/lib/nyara/request.rb +1 -3
- data/lib/nyara/view.rb +1 -0
- data/nyara.gemspec +1 -1
- data/rakefile +63 -42
- data/readme.md +34 -5
- data/spec/apps/connect.rb +14 -0
- data/spec/evented_io_spec.rb +23 -0
- data/spec/ext_parse_spec.rb +26 -7
- data/spec/performance/layout_render.rb +52 -0
- data/spec/performance/parse_accept_value.rb +13 -0
- data/spec/performance/parse_param.rb +18 -0
- data/spec/performance/performance_helper.rb +25 -0
- data/spec/performance_spec.rb +33 -0
- data/spec/request_delegate_spec.rb +41 -16
- data/spec/request_spec.rb +4 -7
- data/spec/spec_helper.rb +20 -10
- metadata +15 -6
- /data/lib/nyara/{config_hash.rb → hashes/config_hash.rb} +0 -0
- /data/lib/nyara/{header_hash.rb → hashes/header_hash.rb} +0 -0
- /data/lib/nyara/{param_hash.rb → hashes/param_hash.rb} +0 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative "performance_helper"
|
2
|
+
require "slim"
|
3
|
+
|
4
|
+
configure do
|
5
|
+
set :views, __dir__
|
6
|
+
end
|
7
|
+
Nyara::View.init
|
8
|
+
$page_tilt = Tilt.new __dir__ + '/page.slim'
|
9
|
+
$layout_tilt = Tilt.new __dir__ + '/layout.slim'
|
10
|
+
|
11
|
+
class MyRenderable
|
12
|
+
def initialize items
|
13
|
+
@title = "layout_render"
|
14
|
+
@items = items
|
15
|
+
end
|
16
|
+
include Nyara::Renderable
|
17
|
+
|
18
|
+
def send_chunk s
|
19
|
+
@res ||= []
|
20
|
+
@res << s
|
21
|
+
end
|
22
|
+
|
23
|
+
def nyara_render
|
24
|
+
view = Nyara::View.new self, 'page.slim', ['layout.slim', 'layout.slim'], {items: @items}, {}
|
25
|
+
Fiber.new{ view.render }.resume
|
26
|
+
end
|
27
|
+
|
28
|
+
def tilt_render
|
29
|
+
Fiber.new{}.resume # XXX simulate the overhead of every request
|
30
|
+
$layout_tilt.render self do
|
31
|
+
$layout_tilt.render self do
|
32
|
+
$page_tilt.render self, items: @items
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# prepare data
|
39
|
+
Item = Struct.new :name, :price
|
40
|
+
items = 10.times.map do |i|
|
41
|
+
Item.new "name#{i}", i
|
42
|
+
end
|
43
|
+
|
44
|
+
# precompile
|
45
|
+
MyRenderable.new(items).nyara_render
|
46
|
+
MyRenderable.new(items).tilt_render
|
47
|
+
|
48
|
+
GC.disable
|
49
|
+
|
50
|
+
nyara = bench(1000){ MyRenderable.new(items).nyara_render }
|
51
|
+
tilt = bench(1000){ MyRenderable.new(items).tilt_render }
|
52
|
+
dump nyara: nyara, tilt: tilt
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative "performance_helper"
|
2
|
+
$0 = '' # don't let sinatra boot the server
|
3
|
+
require "sinatra"
|
4
|
+
|
5
|
+
v = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
|
6
|
+
env = {'HTTP_ACCEPT' => env}
|
7
|
+
|
8
|
+
GC.disable
|
9
|
+
|
10
|
+
nyara = bench(1000){ Nyara::Ext.parse_accept_value v }
|
11
|
+
sinatra = bench_raw(1000){ Sinatra::Request.new(env.dup).accept }
|
12
|
+
sinatra_baseline = bench_raw(1000){ Sinatra::Request.new(env.dup) }
|
13
|
+
dump nyara: nyara, sinatra: (sinatra - sinatra_baseline)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative "performance_helper"
|
2
|
+
require "cgi"
|
3
|
+
|
4
|
+
param = "utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+haishin%2Frss%2Findex+%28#{CGI.escape 'マイコミジャーナル'}%29&utm_content=livedoor"
|
5
|
+
|
6
|
+
def ruby_parse param
|
7
|
+
h = {}
|
8
|
+
param.split('&').each do |s|
|
9
|
+
k, v = s.split '='
|
10
|
+
h[CGI.unescape(k)] = CGI.unescape(v)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
GC.disable
|
15
|
+
|
16
|
+
nyara = bench(1000){ Nyara::Ext.parse_param({}, param) }
|
17
|
+
ruby = bench(1000){ ruby_parse param }
|
18
|
+
dump nyara: nyara, ruby: ruby
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative "../../lib/nyara/nyara"
|
2
|
+
|
3
|
+
# baseline is the raw loop
|
4
|
+
def bench n
|
5
|
+
t = Time.now
|
6
|
+
n.times{ yield }
|
7
|
+
cost = Time.now - t
|
8
|
+
|
9
|
+
t = Time.now
|
10
|
+
n.times{}
|
11
|
+
baseline = Time.now - t
|
12
|
+
|
13
|
+
cost - baseline
|
14
|
+
end
|
15
|
+
|
16
|
+
# custom baseline
|
17
|
+
def bench_raw n
|
18
|
+
t = Time.now
|
19
|
+
n.times{ yield }
|
20
|
+
Time.now - t
|
21
|
+
end
|
22
|
+
|
23
|
+
def dump data
|
24
|
+
print Marshal.dump data
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
|
3
|
+
# run benchmarks in performance/, each output is a hash dumped with Marshal
|
4
|
+
#
|
5
|
+
# { subject: used_time }
|
6
|
+
#
|
7
|
+
describe 'performance' do
|
8
|
+
def bm name
|
9
|
+
bm = __dir__ + '/performance/' + name + '.rb'
|
10
|
+
assert File.exist?(bm), "file not found: #{bm}"
|
11
|
+
res = IO.popen ['ruby', bm] do |io|
|
12
|
+
data = io.read
|
13
|
+
Marshal.load data
|
14
|
+
end
|
15
|
+
assert_nil $!, "an error stops script #{bm}"
|
16
|
+
res
|
17
|
+
end
|
18
|
+
|
19
|
+
it "[parse_accept_value] faster than sinatra" do
|
20
|
+
res = bm 'parse_accept_value'
|
21
|
+
assert res[:nyara] * 1.8 < res[:sinatra], res.inspect
|
22
|
+
end
|
23
|
+
|
24
|
+
it "[parse_param] faster than parse in pure ruby" do
|
25
|
+
res = bm 'parse_param'
|
26
|
+
assert res[:nyara] * 8 < res[:ruby], res.inspect
|
27
|
+
end
|
28
|
+
|
29
|
+
it "[layout_render] faster than using tilt" do
|
30
|
+
res = bm 'layout_render'
|
31
|
+
assert res[:nyara] * 1.1 < res[:tilt], res.inspect
|
32
|
+
end
|
33
|
+
end
|
@@ -6,10 +6,8 @@ module Nyara
|
|
6
6
|
end
|
7
7
|
|
8
8
|
before :each do
|
9
|
-
@
|
10
|
-
Ext.
|
11
|
-
@request = Ext.handle_request @server.fileno
|
12
|
-
Ext.set_request_attrs @request, {
|
9
|
+
@request = Ext.request_new
|
10
|
+
Ext.request_set_attrs @request, {
|
13
11
|
method_num: HTTP_METHODS['GET'],
|
14
12
|
path: '/search',
|
15
13
|
query: ParamHash.new.tap{|h| h['q'] = 'nyara' },
|
@@ -40,20 +38,47 @@ module Nyara
|
|
40
38
|
assert_equal 'en-US', @c.header['accept']
|
41
39
|
end
|
42
40
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
41
|
+
context "Simulate IO" do
|
42
|
+
before :each do
|
43
|
+
@client, @server = Socket.pair :UNIX, :STREAM
|
44
|
+
Ext.set_nonblock @server.fileno
|
45
|
+
Ext.request_set_fd @request, @server.fileno
|
46
|
+
end
|
50
47
|
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
def receive_header
|
49
|
+
@c.send_header
|
50
|
+
@server.close_write
|
51
|
+
@client.read
|
52
|
+
end
|
54
53
|
|
55
|
-
|
56
|
-
|
54
|
+
it "set response header and send" do
|
55
|
+
@c.set_header 'X-Test', true
|
56
|
+
@c.add_header_line "X-Test: also-true\r\n"
|
57
|
+
res = receive_header.lines
|
58
|
+
assert_includes res, "X-Test: true\r\n"
|
59
|
+
assert_includes res, "X-Test: also-true\r\n"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "set cookie" do
|
63
|
+
@c.set_cookie 'set', 'set'
|
64
|
+
cookie = receive_header.lines.grep(/Set-Cookie:/).last
|
65
|
+
assert_includes cookie, "set=set; HttpOnly"
|
66
|
+
end
|
67
|
+
|
68
|
+
it "delete cookie" do
|
69
|
+
@c.delete_cookie 'del'
|
70
|
+
cookie = receive_header.lines.grep(/Set-Cookie:/).last
|
71
|
+
assert_includes cookie, "Expires"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "clear cookie" do
|
75
|
+
@c.clear_cookie
|
76
|
+
pending 'incomplete implementation'
|
77
|
+
end
|
78
|
+
|
79
|
+
it "#session" do
|
80
|
+
pending
|
81
|
+
end
|
57
82
|
end
|
58
83
|
end
|
59
84
|
end
|
data/spec/request_spec.rb
CHANGED
@@ -3,10 +3,7 @@ require_relative "spec_helper"
|
|
3
3
|
module Nyara
|
4
4
|
describe Request do
|
5
5
|
before :each do
|
6
|
-
@
|
7
|
-
Ext.set_nonblock @server.fileno
|
8
|
-
Ext.set_nonblock @client.fileno
|
9
|
-
@request = Ext.handle_request @server.fileno
|
6
|
+
@request = Ext.request_new
|
10
7
|
@request_attrs = {
|
11
8
|
method_num: HTTP_METHODS['GET'],
|
12
9
|
path: '/',
|
@@ -15,7 +12,7 @@ module Nyara
|
|
15
12
|
scope: '/',
|
16
13
|
format: 'html'
|
17
14
|
}
|
18
|
-
|
15
|
+
request_set_attrs
|
19
16
|
end
|
20
17
|
|
21
18
|
context "#scheme detect by forwarded.." do
|
@@ -41,8 +38,8 @@ module Nyara
|
|
41
38
|
assert_equal 3000, @request.port
|
42
39
|
end
|
43
40
|
|
44
|
-
def
|
45
|
-
Ext.
|
41
|
+
def request_set_attrs
|
42
|
+
Ext.request_set_attrs @request, @request_attrs
|
46
43
|
end
|
47
44
|
end
|
48
45
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require_relative "../lib/nyara/nyara"
|
2
1
|
require 'rspec/core'
|
3
2
|
require 'rspec/mocks'
|
4
3
|
require 'rspec/autorun'
|
@@ -7,6 +6,16 @@ require "slim"
|
|
7
6
|
require "erb"
|
8
7
|
require "haml"
|
9
8
|
require "liquid"
|
9
|
+
require "open-uri"
|
10
|
+
require 'pp'
|
11
|
+
|
12
|
+
if ENV['COVERAGE']
|
13
|
+
require "simplecov"
|
14
|
+
SimpleCov.start do
|
15
|
+
add_group 'lib', 'lib'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
require_relative "../lib/nyara/nyara"
|
10
19
|
|
11
20
|
RSpec.configure do |config|
|
12
21
|
config.expect_with :stdlib
|
@@ -34,7 +43,6 @@ RSpec.configure do |config|
|
|
34
43
|
xs
|
35
44
|
end
|
36
45
|
|
37
|
-
require 'pp'
|
38
46
|
module Kernel
|
39
47
|
def pp obj
|
40
48
|
s = CGI.escape_html(PP.pp obj, '')
|
@@ -42,19 +50,21 @@ RSpec.configure do |config|
|
|
42
50
|
obj
|
43
51
|
end
|
44
52
|
end
|
45
|
-
end
|
46
53
|
|
47
|
-
config.
|
48
|
-
GC.stress
|
49
|
-
|
54
|
+
elsif config.formatters.any?{|f|f.class.to_s =~ /Document/}
|
55
|
+
puts "Enabling GC.stress with documentation formatter"
|
56
|
+
|
57
|
+
config.before :each do
|
58
|
+
GC.stress = true
|
59
|
+
end
|
60
|
+
|
61
|
+
config.after :each do
|
62
|
+
GC.stress = false
|
63
|
+
end
|
50
64
|
|
51
|
-
config.after :each do
|
52
|
-
GC.stress = false
|
53
65
|
end
|
54
66
|
end
|
55
67
|
|
56
68
|
configure do
|
57
69
|
set :env, 'test'
|
58
70
|
end
|
59
|
-
|
60
|
-
# todo a test helper to compile routes after app loaded
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nyara
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1.pre.
|
4
|
+
version: 0.0.1.pre.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zete Lui
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Fast, slim and fuzzy ruby web framework + server, based on preforked
|
14
14
|
event queue and Fiber. NO rack NOR eventmachine are used.
|
@@ -28,26 +28,34 @@ files:
|
|
28
28
|
- ext/extconf.rb
|
29
29
|
- hello.rb
|
30
30
|
- lib/nyara/config.rb
|
31
|
-
- lib/nyara/config_hash.rb
|
32
31
|
- lib/nyara/controller.rb
|
33
32
|
- lib/nyara/cookie.rb
|
34
33
|
- lib/nyara/cpu_counter.rb
|
35
|
-
- lib/nyara/
|
34
|
+
- lib/nyara/hashes/config_hash.rb
|
35
|
+
- lib/nyara/hashes/header_hash.rb
|
36
|
+
- lib/nyara/hashes/param_hash.rb
|
36
37
|
- lib/nyara/mime_types.rb
|
37
38
|
- lib/nyara/nyara.rb
|
38
|
-
- lib/nyara/
|
39
|
+
- lib/nyara/patch_tcp_socket.rb
|
39
40
|
- lib/nyara/request.rb
|
40
41
|
- lib/nyara/route.rb
|
41
42
|
- lib/nyara/route_entry.rb
|
42
43
|
- lib/nyara/session.rb
|
43
44
|
- lib/nyara/view.rb
|
44
45
|
- lib/nyara.rb
|
46
|
+
- spec/apps/connect.rb
|
47
|
+
- spec/evented_io_spec.rb
|
45
48
|
- spec/ext_mime_match_spec.rb
|
46
49
|
- spec/ext_parse_accept_value_spec.rb
|
47
50
|
- spec/ext_parse_spec.rb
|
48
51
|
- spec/ext_route_spec.rb
|
49
52
|
- spec/hashes_spec.rb
|
50
53
|
- spec/path_helper_spec.rb
|
54
|
+
- spec/performance/layout_render.rb
|
55
|
+
- spec/performance/parse_accept_value.rb
|
56
|
+
- spec/performance/parse_param.rb
|
57
|
+
- spec/performance/performance_helper.rb
|
58
|
+
- spec/performance_spec.rb
|
51
59
|
- spec/request_delegate_spec.rb
|
52
60
|
- spec/request_spec.rb
|
53
61
|
- spec/route_entry_spec.rb
|
@@ -62,6 +70,7 @@ files:
|
|
62
70
|
- ext/inc/str_intern.h
|
63
71
|
- ext/multipart-parser-c/multipart_parser.h
|
64
72
|
- ext/nyara.h
|
73
|
+
- ext/request.h
|
65
74
|
- ext/accept.c
|
66
75
|
- ext/event.c
|
67
76
|
- ext/hashes.c
|
@@ -75,6 +84,7 @@ files:
|
|
75
84
|
- ext/multipart_parser.c
|
76
85
|
- ext/nyara.c
|
77
86
|
- ext/request.c
|
87
|
+
- ext/request_parse.c
|
78
88
|
- ext/url_encoded.c
|
79
89
|
- ext/route.cc
|
80
90
|
- ext/inc/status_codes.inc
|
@@ -108,4 +118,3 @@ signing_key:
|
|
108
118
|
specification_version: 4
|
109
119
|
summary: Fast, slim and fuzzy ruby web framework + server
|
110
120
|
test_files: []
|
111
|
-
has_rdoc: false
|
File without changes
|
File without changes
|
File without changes
|