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.
@@ -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
- @client, @server = Socket.pair :UNIX, :STREAM
10
- Ext.set_nonblock @server.fileno
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
- it "set response header and send" do
44
- pending
45
- @c.set_header
46
- @c.add_header_line
47
- @c.send_header
48
- @client
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
- it "set / delete / clear cookie" do
52
- pending
53
- end
48
+ def receive_header
49
+ @c.send_header
50
+ @server.close_write
51
+ @client.read
52
+ end
54
53
 
55
- it "#session" do
56
- pending
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
- @server, @client = Socket.pair :UNIX, :STREAM, 0
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
- set_request_attrs
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 set_request_attrs
45
- Ext.set_request_attrs @request, @request_attrs
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.before :each do
48
- GC.stress = true
49
- end
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.2
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-20 00:00:00.000000000 Z
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/header_hash.rb
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/param_hash.rb
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