kenji 0.6.7 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -8
- data/kenji.gemspec +17 -16
- data/lib/kenji/controller.rb +38 -15
- data/lib/kenji/version.rb +1 -1
- data/lib/kenji.rb +6 -0
- data/spec/4/controllers/bar.rb +9 -0
- data/spec/4/controllers/main.rb +11 -0
- data/spec/4/controllers/pass.rb +9 -0
- data/spec/kenji_spec.rb +38 -0
- metadata +57 -3
data/Gemfile
CHANGED
data/kenji.gemspec
CHANGED
@@ -2,22 +2,23 @@ $:.push File.expand_path('../lib', __FILE__)
|
|
2
2
|
require 'kenji/version'
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
'https://github.com/kballenegger/kenji'
|
5
|
+
s.name = 'kenji'
|
6
|
+
s.version = Kenji::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.summary = 'Kenji'
|
9
|
+
s.description = 'A lightweight Ruby web framework.'
|
10
|
+
s.authors = ['Kenneth Ballenegger']
|
11
|
+
s.email = ['kenneth@ballenegger.com']
|
12
|
+
s.homepage = 'https://github.com/kballenegger/kenji'
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
-
s.require_paths = ['lib']
|
14
|
+
s.add_dependency 'json'
|
15
|
+
s.add_dependency 'rack', '~> 1.5.2'
|
16
|
+
s.add_development_dependency 'rake'
|
17
|
+
s.add_development_dependency 'rspec'
|
18
|
+
s.add_development_dependency 'rack-test'
|
22
19
|
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
s.require_paths = ['lib']
|
23
24
|
end
|
data/lib/kenji/controller.rb
CHANGED
@@ -4,14 +4,14 @@ module Kenji
|
|
4
4
|
|
5
5
|
# use the reader freely to grab the kenji object
|
6
6
|
attr_accessor :kenji
|
7
|
-
|
7
|
+
|
8
8
|
# Routes below will accept routes in the format, eg.:
|
9
9
|
# /hello/:id/children
|
10
10
|
# Can contain any number of :id, but must be in their own url segment.
|
11
11
|
# Colon-prefixed segments become variables, passed onto the given block as arguments.
|
12
|
-
# The name given to the variable is irrelevant, and is thrown away: /hello/:/children is equivalent to the example above.
|
12
|
+
# The name given to the variable is irrelevant, and is thrown away: /hello/:/children is equivalent to the example above.
|
13
13
|
# Given block must have correct arity.
|
14
|
-
|
14
|
+
|
15
15
|
# Route GET
|
16
16
|
def self.get(path, &block)
|
17
17
|
route(:get, path, &block)
|
@@ -48,7 +48,7 @@ module Kenji
|
|
48
48
|
#
|
49
49
|
# Note: this works by building a tree for the path,
|
50
50
|
# each node being a path segment or variable segment, and the leaf @action being the block
|
51
|
-
|
51
|
+
|
52
52
|
def self.route(*methods, path, &block)
|
53
53
|
# bind the block to self as an instance method, so its context is correct
|
54
54
|
define_method(:_tmp_route_action, &block)
|
@@ -94,7 +94,7 @@ module Kenji
|
|
94
94
|
# # eg. ensure authentication, you can use kenji.respond in here.
|
95
95
|
# end
|
96
96
|
# end
|
97
|
-
#
|
97
|
+
#
|
98
98
|
def self.before(&block)
|
99
99
|
define_method(:_tmp_before_action, &block)
|
100
100
|
block = instance_method(:_tmp_before_action)
|
@@ -102,7 +102,7 @@ module Kenji
|
|
102
102
|
(@befores ||= []) << block
|
103
103
|
end
|
104
104
|
|
105
|
-
|
105
|
+
|
106
106
|
# Most likely only used by Kenji itself.
|
107
107
|
# Override to implement your own routing, if you'd like.
|
108
108
|
#
|
@@ -116,22 +116,23 @@ module Kenji
|
|
116
116
|
# check for passes
|
117
117
|
node = self.class.passes
|
118
118
|
remaining_segments = segments.dup
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
if node[:@controller]
|
125
|
-
instance = node[:@controller].new
|
119
|
+
|
120
|
+
f = fetch_passes(node, remaining_segments)
|
121
|
+
|
122
|
+
if f[:match] && f[:controller]
|
123
|
+
instance = f[:controller].new
|
126
124
|
instance.kenji = kenji if instance.respond_to?(:kenji=)
|
127
|
-
|
125
|
+
f[:variables].each do |k, v|
|
126
|
+
instance.instance_variable_set(:"@#{k}", v)
|
127
|
+
end
|
128
|
+
return instance.call(method, f[:remaining_segments].join('/'))
|
128
129
|
end
|
129
130
|
|
130
131
|
# regular routing
|
131
132
|
node = self.class.routes[method] || {}
|
132
133
|
variables = []
|
133
134
|
searching = true
|
134
|
-
segments.each do |segment| # traverse tree to find
|
135
|
+
segments.each do |segment| # traverse tree to find
|
135
136
|
if searching && node[segment.to_sym]
|
136
137
|
node = node[segment.to_sym] # attempt to move down to the plain text segment
|
137
138
|
elsif searching && node[:':']
|
@@ -183,6 +184,28 @@ module Kenji
|
|
183
184
|
def self.befores
|
184
185
|
@befores || []
|
185
186
|
end
|
187
|
+
|
188
|
+
def fetch_passes(node, segments)
|
189
|
+
variables = {}
|
190
|
+
match = false
|
191
|
+
|
192
|
+
while e = segments.shift
|
193
|
+
# return false unless node
|
194
|
+
key = node.keys.first
|
195
|
+
if match = key.to_s.match(/^\:(\w+)/)
|
196
|
+
node = node[key.to_sym]
|
197
|
+
variables[match[1].to_sym] = e
|
198
|
+
match = true
|
199
|
+
else
|
200
|
+
match = node.has_key?(e.to_sym)
|
201
|
+
node = node[e.to_sym] if match
|
202
|
+
end
|
203
|
+
|
204
|
+
break if node[:@controller]
|
205
|
+
end
|
206
|
+
|
207
|
+
{ :match => match, :variables => variables, :controller => node[:@controller], :remaining_segments => segments }
|
208
|
+
end
|
186
209
|
end
|
187
210
|
end
|
188
211
|
|
data/lib/kenji/version.rb
CHANGED
data/lib/kenji.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path('../bar.rb', __FILE__)
|
2
|
+
require File.expand_path('../pass.rb', __FILE__)
|
3
|
+
|
4
|
+
class MainController < Kenji::Controller
|
5
|
+
get '/' do
|
6
|
+
{ :foo => 'bar' }
|
7
|
+
end
|
8
|
+
|
9
|
+
pass '/foo/:foo_id/pass', PassController
|
10
|
+
pass '/foo/:foo_id/bar', BarController
|
11
|
+
end
|
data/spec/kenji_spec.rb
CHANGED
@@ -117,7 +117,45 @@ describe Kenji::Kenji, 'expected reponses' do
|
|
117
117
|
last_response.body.should == expected_response
|
118
118
|
last_response.status.should == 302
|
119
119
|
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context '4' do
|
123
|
+
def app; app_for('4'); end
|
124
|
+
|
125
|
+
it "should use main controller" do
|
126
|
+
get '/main'
|
127
|
+
expected_response = { :foo => 'bar' }.to_json
|
128
|
+
last_response.body.should == expected_response
|
129
|
+
last_response.status.should == 200
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should use pass controller and use get endpoint" do
|
133
|
+
get '/main/foo/foo_id/pass'
|
134
|
+
expected_response = { :foo_id => 'foo_id' }.to_json
|
135
|
+
last_response.body.should == expected_response
|
136
|
+
last_response.status.should == 200
|
137
|
+
end
|
120
138
|
|
139
|
+
it "should use pass controller and use put endpoint" do
|
140
|
+
put '/main/foo/foo_id/pass/pass_id'
|
141
|
+
expected_response = { :pass_id => 'pass_id', :foo_id => 'foo_id' }.to_json
|
142
|
+
last_response.body.should == expected_response
|
143
|
+
last_response.status.should == 200
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should use pass controller and use get endpoint" do
|
147
|
+
get '/main/foo/foo_id/bar'
|
148
|
+
expected_response = { :foo_id => 'foo_id' }.to_json
|
149
|
+
last_response.body.should == expected_response
|
150
|
+
last_response.status.should == 200
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should use pass controller and use put endpoint" do
|
154
|
+
put '/main/foo/foo_id/bar/bar_id'
|
155
|
+
expected_response = { :bar_id => 'bar_id', :foo_id => 'foo_id' }.to_json
|
156
|
+
last_response.body.should == expected_response
|
157
|
+
last_response.status.should == 200
|
158
|
+
end
|
121
159
|
end
|
122
160
|
|
123
161
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kenji
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.7'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -29,13 +29,61 @@ dependencies:
|
|
29
29
|
version: '0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rack
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.5.2
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.5.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
33
49
|
none: false
|
34
50
|
requirements:
|
35
51
|
- - ! '>='
|
36
52
|
- !ruby/object:Gem::Version
|
37
53
|
version: '0'
|
38
|
-
type: :
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rack-test
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
39
87
|
prerelease: false
|
40
88
|
version_requirements: !ruby/object:Gem::Requirement
|
41
89
|
none: false
|
@@ -80,6 +128,9 @@ files:
|
|
80
128
|
- spec/2/controllers/_.rb
|
81
129
|
- spec/2/controllers/child.rb
|
82
130
|
- spec/3/controllers/before.rb
|
131
|
+
- spec/4/controllers/bar.rb
|
132
|
+
- spec/4/controllers/main.rb
|
133
|
+
- spec/4/controllers/pass.rb
|
83
134
|
- spec/kenji_spec.rb
|
84
135
|
homepage: https://github.com/kballenegger/kenji
|
85
136
|
licenses: []
|
@@ -110,5 +161,8 @@ test_files:
|
|
110
161
|
- spec/2/controllers/_.rb
|
111
162
|
- spec/2/controllers/child.rb
|
112
163
|
- spec/3/controllers/before.rb
|
164
|
+
- spec/4/controllers/bar.rb
|
165
|
+
- spec/4/controllers/main.rb
|
166
|
+
- spec/4/controllers/pass.rb
|
113
167
|
- spec/kenji_spec.rb
|
114
168
|
has_rdoc:
|