nyara 0.1.pre.0 → 0.1.pre.1
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/bin/nyara +2 -14
- data/changes +3 -0
- data/example/factorial.rb +19 -0
- data/example/hello.rb +5 -0
- data/example/project.rb +11 -0
- data/example/stream.rb +14 -0
- data/ext/extconf.rb +19 -0
- data/ext/hashes.c +160 -57
- data/ext/inc/ary_intern.h +36 -0
- data/ext/route.cc +2 -1
- data/ext/url_encoded.c +1 -0
- data/lib/nyara.rb +1 -0
- data/lib/nyara/command.rb +60 -79
- data/lib/nyara/config.rb +19 -1
- data/lib/nyara/controller.rb +64 -7
- data/lib/nyara/hashes/config_hash.rb +3 -20
- data/lib/nyara/hashes/header_hash.rb +2 -2
- data/lib/nyara/hashes/param_hash.rb +1 -0
- data/lib/nyara/nyara.rb +45 -37
- data/lib/nyara/part.rb +2 -2
- data/lib/nyara/reload.rb +63 -64
- data/lib/nyara/route.rb +7 -6
- data/lib/nyara/session.rb +4 -0
- data/lib/nyara/templates/{Gemfile → Gemfile.tt} +4 -0
- data/lib/nyara/templates/Linnerfile +28 -0
- data/lib/nyara/templates/Rakefile +16 -2
- data/lib/nyara/templates/app/assets/files/favicon.ico +1 -0
- data/lib/nyara/templates/app/assets/files/robots.txt +5 -0
- data/lib/nyara/templates/app/assets/scripts/app.coffee +4 -0
- data/lib/nyara/templates/app/assets/scripts/module-example.coffee +4 -0
- data/lib/nyara/templates/app/assets/styles/app.scss +2 -0
- data/lib/nyara/templates/app/controllers/application_controller.rb +8 -0
- data/lib/nyara/templates/app/views/layouts/application.erb.tt +12 -0
- data/lib/nyara/templates/config/application.rb +4 -0
- data/lib/nyara/templates/config/{database.yml → database.yml.tt} +3 -3
- data/lib/nyara/templates/config/production.rb +2 -0
- data/lib/nyara/view.rb +6 -2
- data/nyara.gemspec +3 -1
- data/rakefile +7 -26
- data/spec/apps/reload.rb +35 -0
- data/spec/command_spec.rb +24 -10
- data/spec/config_spec.rb +19 -8
- data/spec/controller_spec.rb +14 -0
- data/spec/evented_io_spec.rb +3 -1
- data/spec/ext_route_spec.rb +25 -3
- data/spec/hashes_spec.rb +45 -21
- data/spec/integration_spec.rb +28 -2
- data/spec/path_helper_spec.rb +7 -0
- data/spec/performance_spec.rb +1 -1
- data/spec/public/test.css +1 -0
- data/{lib/nyara/templates/public/robot.txt → spec/public/test.jpg} +0 -0
- data/spec/public/test.js +1 -0
- data/spec/reload_spec.rb +50 -0
- data/spec/route_spec.rb +4 -4
- data/spec/spec_helper.rb +15 -9
- data/spec/url_encoded_spec.rb +5 -0
- data/spec/view_spec.rb +7 -0
- data/spec/views/_partial.slim +1 -1
- data/tools/bug.rb +53 -0
- data/tools/hello.rb +49 -0
- data/tools/memcheck.rb +33 -0
- metadata +73 -41
- data/ext/inc/status_codes.inc +0 -64
- data/lib/nyara/templates/app/views/layouts/application.erb +0 -12
- data/lib/nyara/templates/public/css/app.css +0 -1
- data/lib/nyara/templates/public/js/app.js +0 -1
data/spec/hashes_spec.rb
CHANGED
@@ -21,14 +21,14 @@ module Nyara
|
|
21
21
|
end
|
22
22
|
|
23
23
|
%w( a[ [ a] a[b]c a[[b] a[[b]] ).each do |k|
|
24
|
-
it "
|
24
|
+
it "does not accept bad key: #{k}" do
|
25
25
|
assert_raise ArgumentError do
|
26
26
|
ParamHash.split_name k
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
it "
|
31
|
+
it "does not accept empty key" do
|
32
32
|
assert_raise ArgumentError do
|
33
33
|
ParamHash.split_name ''
|
34
34
|
end
|
@@ -37,7 +37,7 @@ module Nyara
|
|
37
37
|
|
38
38
|
it "#nested_aset" do
|
39
39
|
h = ParamHash.new
|
40
|
-
h.nested_aset ['a', '', 'b'], 'c'
|
40
|
+
h.send :nested_aset, ['a', '', 'b'], 'c'
|
41
41
|
assert_equal({'a' => [{'b' => 'c'}]}, h)
|
42
42
|
end
|
43
43
|
|
@@ -73,17 +73,15 @@ module Nyara
|
|
73
73
|
h = ParamHash.parse_cookie ParamHash.new, 'a ;'
|
74
74
|
assert_equal 1, h.size
|
75
75
|
assert_equal '', h['a']
|
76
|
+
end
|
76
77
|
|
78
|
+
it "parses cookie with space around =" do
|
77
79
|
h = ParamHash.parse_cookie ParamHash.new, 'b = 1; a ;'
|
78
80
|
assert_equal 2, h.size
|
79
81
|
assert_equal '', h['a']
|
80
82
|
assert_equal '1', h['b']
|
81
83
|
end
|
82
84
|
|
83
|
-
it "parses cookie with space around =" do
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
85
|
it "refuses to parse cookie into HeaderHash" do
|
88
86
|
assert_raise ArgumentError do
|
89
87
|
ParamHash.parse_cookie HeaderHash.new, 'session=3'
|
@@ -113,29 +111,55 @@ module Nyara
|
|
113
111
|
assert_equal "", h["\xE2"]
|
114
112
|
end
|
115
113
|
|
116
|
-
it "parses nested kv and preserves hash class" do
|
117
|
-
h = ParamHash.parse_param ParamHash.new, "a[b][]=c"
|
118
|
-
assert_equal({'a' => {'b' => ['c']}}, h)
|
119
|
-
assert_equal ParamHash, h['a'].class
|
120
|
-
end
|
121
|
-
|
122
|
-
it "parses k without v and preserves hash class" do
|
123
|
-
h = ParamHash.parse_param ConfigHash.new, "a%5B%5d[b]"
|
124
|
-
assert_equal({'a' => [{'b' => ''}]}, h)
|
125
|
-
assert_equal Array, h[:a].class
|
126
|
-
assert_equal ConfigHash, h[:a].first.class
|
127
|
-
end
|
128
|
-
|
129
114
|
it "parses blank string" do
|
130
115
|
h = ParamHash.parse_param({}, '')
|
131
116
|
assert h.empty?
|
132
117
|
end
|
133
118
|
|
134
|
-
it "
|
119
|
+
it "does not accept HeaderHash" do
|
135
120
|
assert_raise ArgumentError do
|
136
121
|
ParamHash.parse_param(HeaderHash.new, '')
|
137
122
|
end
|
138
123
|
end
|
124
|
+
|
125
|
+
context "nested" do
|
126
|
+
it "parses nested kv and output with ParamHash" do
|
127
|
+
h = ParamHash.parse_param ParamHash.new, "a[b][]=c"
|
128
|
+
assert_equal({'a' => {'b' => ['c']}}, h)
|
129
|
+
assert_equal ParamHash, h['a'].class
|
130
|
+
end
|
131
|
+
|
132
|
+
it "parses k without v and output preserves hash class" do
|
133
|
+
h = ParamHash.parse_param ConfigHash.new, "a%5B%5d[b+]"
|
134
|
+
assert_equal({'a' => [{'b ' => ''}]}, h)
|
135
|
+
assert_equal Array, h[:a].class
|
136
|
+
assert_equal ConfigHash, h[:a].first.class
|
137
|
+
end
|
138
|
+
|
139
|
+
it "increases array index when there's existing key" do
|
140
|
+
h = ParamHash.parse_param({}, %w'
|
141
|
+
a[][foo]=0
|
142
|
+
a[][foo]=1
|
143
|
+
a[][bar]=1
|
144
|
+
a[][foo]=2
|
145
|
+
'.join('&'))
|
146
|
+
assert_equal({"a"=>[{"foo"=>"0"}, {"foo"=>"1", "bar"=>"1"}, {"foo"=>"2"}]}, h)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "raises error for conflict key" do
|
150
|
+
assert_raise TypeError do
|
151
|
+
ParamHash.parse_param({}, 'a[a]=1&a[]=1')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
it "raises error for conflict key in 2 parses" do
|
156
|
+
h = {}
|
157
|
+
ParamHash.parse_param(h, 'a[a]=1')
|
158
|
+
assert_raise TypeError do
|
159
|
+
ParamHash.parse_param(h, 'a[]=1')
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
139
163
|
end
|
140
164
|
end
|
141
165
|
|
data/spec/integration_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative "spec_helper"
|
2
|
+
require 'logger'
|
2
3
|
|
3
4
|
class TestController < Nyara::Controller
|
4
5
|
attr_reader :before_invoked
|
@@ -15,7 +16,7 @@ class TestController < Nyara::Controller
|
|
15
16
|
|
16
17
|
meta '#create'
|
17
18
|
post '/create' do
|
18
|
-
set_header 'partial', partial('_partial').strip
|
19
|
+
set_header 'partial', partial('_partial', locals: { a: '1' }).strip
|
19
20
|
redirect_to '#index'
|
20
21
|
end
|
21
22
|
|
@@ -86,13 +87,21 @@ module Nyara
|
|
86
87
|
|
87
88
|
it "redirect" do
|
88
89
|
@test.post @test.path_to('test#create')
|
89
|
-
assert_equal 'This is a partial', @test.response.header['Partial']
|
90
|
+
assert_equal 'This is a partial 1', @test.response.header['Partial']
|
90
91
|
assert @test.response.success?
|
91
92
|
assert_equal 'http://localhost:3000/', @test.redirect_location
|
92
93
|
@test.follow_redirect
|
93
94
|
assert_equal '/', @test.request.path
|
94
95
|
end
|
95
96
|
|
97
|
+
it "post params log output" do
|
98
|
+
data = { name: 1, sex: 0 }
|
99
|
+
Nyara.config.stub(:logger).and_return(Logger.new($stdout))
|
100
|
+
out = capture(:stdout) { @test.post @test.path_to('test#create'), {}, data }
|
101
|
+
# puts out
|
102
|
+
assert_include out, 'params: {"name"=>"1", "sex"=>"0"}'
|
103
|
+
end
|
104
|
+
|
96
105
|
it "session continuation" do
|
97
106
|
@test.session['a'] = '3'
|
98
107
|
@test.get "/"
|
@@ -162,6 +171,23 @@ module Nyara
|
|
162
171
|
@test.get "/empty"
|
163
172
|
assert_equal 404, @test.response.status
|
164
173
|
end
|
174
|
+
|
175
|
+
it "found test.css and text/css content_type" do
|
176
|
+
@test.get "/test.css"
|
177
|
+
assert_equal "test css", @test.response.body
|
178
|
+
assert_include @test.response.header['Content-Type'],"text/css"
|
179
|
+
end
|
180
|
+
|
181
|
+
it "found test.js" do
|
182
|
+
@test.get "/test.js"
|
183
|
+
assert_equal "test js", @test.response.body
|
184
|
+
assert_include @test.response.header['Content-Type'],"application/javascript"
|
185
|
+
end
|
186
|
+
|
187
|
+
it "found test.jpg" do
|
188
|
+
@test.get "/test.jpg"
|
189
|
+
assert_include @test.response.header['Content-Type'],"image/jpeg"
|
190
|
+
end
|
165
191
|
end
|
166
192
|
|
167
193
|
context "before / after" do
|
data/spec/path_helper_spec.rb
CHANGED
@@ -79,6 +79,13 @@ module Nyara
|
|
79
79
|
generated = c.path_to '#index', 1, format: 'js', 'utm_source' => 'a spam'
|
80
80
|
assert_equal "/00001.js?utm_source=a+spam", generated
|
81
81
|
end
|
82
|
+
|
83
|
+
it "raise info with wrong route" do
|
84
|
+
c = FooController.new :stub_request
|
85
|
+
assert_raise ArgumentError do
|
86
|
+
c.path_to('#aksdgjajksdg')
|
87
|
+
end
|
88
|
+
end
|
82
89
|
end
|
83
90
|
|
84
91
|
context '#url_to' do
|
data/spec/performance_spec.rb
CHANGED
@@ -25,7 +25,7 @@ describe 'performance' do
|
|
25
25
|
|
26
26
|
it "[parse_param] faster than parse in pure ruby" do
|
27
27
|
res = bm 'parse_param'
|
28
|
-
assert res[:nyara] *
|
28
|
+
assert res[:nyara] * 5 < res[:ruby], res.inspect
|
29
29
|
end
|
30
30
|
|
31
31
|
it "[layout_render] nearly as fast as using tilt..." do
|
@@ -0,0 +1 @@
|
|
1
|
+
test css
|
File without changes
|
data/spec/public/test.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
test js
|
data/spec/reload_spec.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
require_relative "../lib/nyara/reload"
|
3
|
+
|
4
|
+
module Nyara
|
5
|
+
describe Reload do
|
6
|
+
before :all do
|
7
|
+
GC.stress = false
|
8
|
+
@reload_root = ENV['RELOAD_ROOT'] = Dir.mktmpdir 'root'
|
9
|
+
Dir.mkdir @reload_root + '/views'
|
10
|
+
touch_files 'app before', 'views before'
|
11
|
+
@server = fork do
|
12
|
+
Dir.chdir __dir__ + '/apps' do
|
13
|
+
exec "ruby reload.rb"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
sleep 2
|
17
|
+
end
|
18
|
+
|
19
|
+
def touch_files app_content, views_content
|
20
|
+
File.open @reload_root + '/reloadee.rb', 'w' do |f|
|
21
|
+
f << 'RELOADEE = ' << app_content.inspect
|
22
|
+
end
|
23
|
+
File.open @reload_root + '/views/index.slim', 'w' do |f|
|
24
|
+
f << '== ' << views_content.inspect
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
after :all do
|
29
|
+
Process.kill :TERM, @server
|
30
|
+
sleep 0.2
|
31
|
+
Process.kill :KILL, @server
|
32
|
+
end
|
33
|
+
|
34
|
+
it "reloads" do
|
35
|
+
GC.stress = false
|
36
|
+
data = open 'http://localhost:3004/app', &:read
|
37
|
+
assert_equal 'app before', data
|
38
|
+
data = open 'http://localhost:3004/views', &:read
|
39
|
+
assert_equal 'views before', data
|
40
|
+
|
41
|
+
touch_files 'app after', 'views after'
|
42
|
+
sleep 1.2
|
43
|
+
|
44
|
+
data = open 'http://localhost:3004/views', &:read
|
45
|
+
assert_equal 'views after', data
|
46
|
+
data = open 'http://localhost:3004/app', &:read
|
47
|
+
assert_equal 'app after', data
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/route_spec.rb
CHANGED
@@ -15,7 +15,7 @@ module Nyara
|
|
15
15
|
|
16
16
|
@r.path = '/'
|
17
17
|
@r.compile :controller_stub, '/scope'
|
18
|
-
assert_equal '/scope', @r.prefix
|
18
|
+
assert_equal '/scope/', @r.prefix
|
19
19
|
assert_equal '', @r.suffix
|
20
20
|
assert_equal [], @r.conv
|
21
21
|
|
@@ -59,7 +59,7 @@ module Nyara
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it "#analyse_path" do
|
62
|
-
r = @r.analyse_path '/hello/%d-world%u/%s
|
62
|
+
r = @r.analyse_path '/hello/%d-world%u/%s'
|
63
63
|
assert_equal ['/hello/', '%d-world%u/%s'], r
|
64
64
|
|
65
65
|
prefix, suffix = @r.analyse_path '/hello'
|
@@ -127,8 +127,8 @@ module Nyara
|
|
127
127
|
end
|
128
128
|
|
129
129
|
it ".print_routes" do
|
130
|
-
out = stdout { Route.print_routes }
|
131
|
-
assert_include(out, "
|
130
|
+
out = capture(:stdout) { Route.print_routes }
|
131
|
+
assert_include(out, "All routes:")
|
132
132
|
end
|
133
133
|
end
|
134
134
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -20,16 +20,22 @@ if ENV['COVERAGE']
|
|
20
20
|
end
|
21
21
|
require_relative "../lib/nyara/nyara"
|
22
22
|
require_relative "../lib/nyara/test"
|
23
|
+
require_relative "../lib/nyara/command"
|
23
24
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
def capture(stream)
|
26
|
+
stream = stream.to_s
|
27
|
+
captured_stream = Tempfile.new(stream)
|
28
|
+
stream_io = eval("$#{stream}")
|
29
|
+
origin_stream = stream_io.dup
|
30
|
+
stream_io.reopen(captured_stream)
|
31
|
+
|
32
|
+
yield
|
33
|
+
|
34
|
+
stream_io.rewind
|
35
|
+
return captured_stream.read
|
36
|
+
ensure
|
37
|
+
captured_stream.unlink
|
38
|
+
stream_io.reopen(origin_stream)
|
33
39
|
end
|
34
40
|
|
35
41
|
RSpec.configure do |config|
|
data/spec/url_encoded_spec.rb
CHANGED
data/spec/view_spec.rb
CHANGED
@@ -47,11 +47,18 @@ module Nyara
|
|
47
47
|
assert_raise ArgumentError do
|
48
48
|
render 'edit', nil, nil, {}
|
49
49
|
end
|
50
|
+
|
50
51
|
render 'edit.slim', nil, nil, {}
|
51
52
|
assert_equal "<div>slim:edit</div>", @instance.result.gsub(/\s/, '')
|
52
53
|
render 'edit.haml', nil, nil, {}
|
53
54
|
assert_equal "<div>haml:edit</div>", @instance.result.gsub(/\s/, '')
|
54
55
|
end
|
56
|
+
|
57
|
+
it "raises error with template not found" do
|
58
|
+
assert_raise ArgumentError do
|
59
|
+
render 'asdgasdgasdg'
|
60
|
+
end
|
61
|
+
end
|
55
62
|
|
56
63
|
context "fallback to tilt" do
|
57
64
|
it "inline render" do
|
data/spec/views/_partial.slim
CHANGED
@@ -1 +1 @@
|
|
1
|
-
| This is a partial
|
1
|
+
| This is a partial #{a}
|
data/tools/bug.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative "../lib/nyara/nyara"
|
2
|
+
|
3
|
+
configure do
|
4
|
+
map '/posts', 'posts'
|
5
|
+
end
|
6
|
+
|
7
|
+
class ApplicationController < Nyara::Controller
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
class PostsController < ApplicationController
|
12
|
+
meta '#index'
|
13
|
+
get '/' do
|
14
|
+
send_string 'index'
|
15
|
+
end
|
16
|
+
|
17
|
+
meta '#show'
|
18
|
+
get '/%u' do |id|
|
19
|
+
@post = Post.find(id)
|
20
|
+
render "posts/show"
|
21
|
+
end
|
22
|
+
|
23
|
+
meta '#new'
|
24
|
+
get '/new' do
|
25
|
+
@post = Post.new
|
26
|
+
render "posts/new"
|
27
|
+
end
|
28
|
+
|
29
|
+
meta '#create'
|
30
|
+
post '/' do
|
31
|
+
@post = Post.new(params[:post])
|
32
|
+
if @post.save
|
33
|
+
success "Post created."
|
34
|
+
redirect_to 'posts#show', @post.id
|
35
|
+
else
|
36
|
+
render "posts/new"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
meta '#edit'
|
41
|
+
get '/%u/edit' do
|
42
|
+
@post = Post.find(id)
|
43
|
+
render 'posts/edit'
|
44
|
+
end
|
45
|
+
|
46
|
+
meta '#update'
|
47
|
+
post '/%u' do |id|
|
48
|
+
@post = Post.find(id)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
Nyara.setup
|
53
|
+
Nyara.start_server
|
data/tools/hello.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative "../lib/nyara/nyara"
|
2
|
+
# require "open-uri"
|
3
|
+
require "pry"
|
4
|
+
|
5
|
+
configure do
|
6
|
+
# set :env, 'production'
|
7
|
+
# set :workers, 3
|
8
|
+
map '/', 'my'
|
9
|
+
set :root, __dir__
|
10
|
+
set :public, '/'
|
11
|
+
# set :logger, false
|
12
|
+
end
|
13
|
+
|
14
|
+
class MyController < Nyara::Controller
|
15
|
+
get '/' do
|
16
|
+
# p param
|
17
|
+
raise 'a'
|
18
|
+
send_string 'hello world'
|
19
|
+
end
|
20
|
+
|
21
|
+
get '/exit' do
|
22
|
+
exit
|
23
|
+
end
|
24
|
+
|
25
|
+
get '/form' do
|
26
|
+
send_string <<-HTML
|
27
|
+
<form action="/form" enctype="multipart/form-data" method="post" accept-charset="utf-8">
|
28
|
+
bar
|
29
|
+
<input type="file" name="bar">
|
30
|
+
<br>
|
31
|
+
baz
|
32
|
+
<input type="file" name="baz[你好]">
|
33
|
+
<br>
|
34
|
+
foo<input name="foo">
|
35
|
+
<br>
|
36
|
+
</form>
|
37
|
+
HTML
|
38
|
+
end
|
39
|
+
|
40
|
+
post '/form' do
|
41
|
+
b = request.body
|
42
|
+
binding.pry
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Nyara.setup
|
47
|
+
Nyara.start_server
|
48
|
+
|
49
|
+
# GC.stress = true
|