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 CHANGED
@@ -1,10 +1,6 @@
1
- gem 'inifile'
2
- gem 'json'
3
- gem 'rack'
1
+ source 'https://rubygems.org'
4
2
 
5
- group :test do
6
- gem 'rspec'
7
- gem 'rack-test'
8
- end
3
+ # Specify your gem's dependencies in factory_baby.gemspec
4
+ gemspec
9
5
 
10
- source :rubygems
6
+ gem 'inifile'
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
- 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 =
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
- s.add_dependency 'json'
16
- s.add_dependency 'rack'
17
-
18
- s.files = `git ls-files`.split("\n")
19
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
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
@@ -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
- while s = remaining_segments.shift
120
- next unless node[s.to_sym]
121
- node = node[s.to_sym]
122
- break
123
- end
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
- return instance.call(method, remaining_segments.join('/'))
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
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Kenji
3
- VERSION = '0.6.7'
3
+ VERSION = '0.7'
4
4
  end
5
5
 
data/lib/kenji.rb CHANGED
@@ -110,6 +110,12 @@ module Kenji
110
110
  end
111
111
  end
112
112
 
113
+ # Returns the response headers
114
+ #
115
+ def response_headers
116
+ @headers
117
+ end
118
+
113
119
  # Fetch (and cache) the json input to the request
114
120
  # Return a Hash
115
121
  #
@@ -0,0 +1,9 @@
1
+ class BarController < Kenji::Controller
2
+ get '/' do
3
+ { :foo_id => @foo_id }
4
+ end
5
+
6
+ put '/:bar_id' do |bar_id|
7
+ { :bar_id => bar_id, :foo_id => @foo_id }
8
+ end
9
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ class PassController < Kenji::Controller
2
+ get '/' do
3
+ { :foo_id => @foo_id }
4
+ end
5
+
6
+ put '/:pass_id' do |pass_id|
7
+ { :pass_id => pass_id, :foo_id => @foo_id }
8
+ end
9
+ 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.6.7
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-02-25 00:00:00.000000000 Z
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: :runtime
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: