kenji 0.6.7 → 0.7
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.
- 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:
|