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 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: