kenji 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cf14e401da97852b1581ed7c36fecb4ca5730150
4
+ data.tar.gz: 640b48b7bd7caaedd92c7a7071c74b09917c8cb2
5
+ SHA512:
6
+ metadata.gz: ec8185bb579998a5108aa4059d7c229500fb0340ef098c5888897d76a3e66166939d1e99052f0071b9fae161c12d5675c9f44747a5753a053bfed08b8b8dbe4f
7
+ data.tar.gz: 8074e6d539c044abbb5bc031cb6f9a3c5978ed81440ea3482574f26663ff08e785b591f9458c60835379b4cc49a86ac814ef4971da4e9885b3f216189f78faef
data/.gitignore CHANGED
@@ -1,2 +1 @@
1
1
  pkg
2
- Gemfile.lock
data/Gemfile.lock ADDED
@@ -0,0 +1,39 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ kenji (1.1.1)
5
+ json
6
+ rack (~> 1.5.2)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ diff-lcs (1.2.5)
12
+ inifile (2.0.2)
13
+ json (1.8.1)
14
+ rack (1.5.2)
15
+ rack-test (0.6.2)
16
+ rack (>= 1.0)
17
+ rake (10.3.2)
18
+ rspec (3.0.0)
19
+ rspec-core (~> 3.0.0)
20
+ rspec-expectations (~> 3.0.0)
21
+ rspec-mocks (~> 3.0.0)
22
+ rspec-core (3.0.3)
23
+ rspec-support (~> 3.0.0)
24
+ rspec-expectations (3.0.3)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.0.0)
27
+ rspec-mocks (3.0.3)
28
+ rspec-support (~> 3.0.0)
29
+ rspec-support (3.0.3)
30
+
31
+ PLATFORMS
32
+ ruby
33
+
34
+ DEPENDENCIES
35
+ inifile
36
+ kenji!
37
+ rack-test
38
+ rake
39
+ rspec
data/README.md CHANGED
@@ -100,12 +100,23 @@ And already, your app is ready to go:
100
100
 
101
101
  ## Changelog
102
102
 
103
+ #### 1.1.2
104
+
105
+ - The `respond_raw` method allows responding with raw data, instead of the
106
+ default which serializes the response as a JSON object.
107
+ - Supports PATCH requests natively.
108
+ - Remove support for `auto_cors`. Instead of having Kenji implement it
109
+ automatically, use a middleware like [Rack::Cors][rack-cors] which does
110
+ a better job than the barebones implementation in Kenji does.
111
+
112
+ [rack-cors]: https://github.com/cyu/rack-cors
113
+
103
114
  #### 1.1.1
104
115
 
105
- - No longer catching ArgumentErrors when calling the block for a route. This
116
+ - No longer catching ArgumentErrors when calling the block for a route. This
106
117
  fixes a bug where Kenji incorrectly responds with a 404 when the block is
107
118
  passed the wrong number of arguments.
108
- - Fixed logic for matching a pass. the path now must match the pass exactly
119
+ - Fixed logic for matching a pass. the path now must match the pass exactly
109
120
  whereas before the pass would match if any subset of the path matched the
110
121
  pass.
111
122
 
data/bin/kenji CHANGED
File without changes
@@ -35,7 +35,10 @@ module Kenji
35
35
  route(:delete, path, &block)
36
36
  end
37
37
 
38
- # TODO: figure out whether I want PATCH, OPTIONS, HEAD
38
+ # Route PATCH
39
+ def self.patch(path, &block)
40
+ route(:patch, path, &block)
41
+ end
39
42
 
40
43
  # Route all methods for given path
41
44
  def self.all(path, &block)
data/lib/kenji/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Kenji
2
- VERSION = '1.1.1'
2
+ VERSION = '1.1.2'
3
3
  end
4
4
 
data/lib/kenji.rb CHANGED
@@ -27,10 +27,6 @@ module Kenji
27
27
  #
28
28
  # `options` is an options hash that accepts the following keys:
29
29
  #
30
- # :auto_cors => true | false
31
- #
32
- # automatically deal with CORS / Access-Control
33
- #
34
30
  # :directory => String (path)
35
31
  #
36
32
  # this is the preferred way of setting the root directory, when
@@ -71,7 +67,6 @@ module Kenji
71
67
  options[:directory] = File.expand_path(root) if root
72
68
 
73
69
  @options = {
74
- auto_cors: true,
75
70
  catch_exceptions: true,
76
71
  root_controller: nil,
77
72
  directory: File.expand_path(Dir.getwd),
@@ -86,8 +81,6 @@ module Kenji
86
81
  #
87
82
  def call
88
83
 
89
- auto_cors if @options[:auto_cors]
90
-
91
84
  catch(:KenjiRespondControlFlowInterrupt) do
92
85
  path = @env['PATH_INFO']
93
86
 
@@ -100,7 +93,8 @@ module Kenji
100
93
  method = @env['REQUEST_METHOD'].downcase.to_sym
101
94
 
102
95
  segments = path.split('/')
103
- segments = segments.unshift('') unless segments.first == '' # ensure existence of leading /'s empty segment
96
+ # ensure existence of leading /'s empty segment
97
+ segments = segments.unshift('') unless segments.first == ''
104
98
 
105
99
  if @options[:root_controller]
106
100
  controller = controller_instance(@options[:root_controller])
@@ -111,7 +105,8 @@ module Kenji
111
105
  acc = ''; out = '', success = false
112
106
  while head = segments.shift
113
107
  acc = "#{acc}/#{head}"
114
- if controller = controller_for(acc) # if we have a valid controller
108
+ # if we have a valid controller
109
+ if controller = controller_for(acc)
115
110
  subpath = '/'+segments.join('/')
116
111
  out = controller.call(method, subpath).to_json
117
112
  success = true
@@ -126,21 +121,12 @@ module Kenji
126
121
  end
127
122
  rescue Exception => e
128
123
  raise e unless @options[:catch_exceptions]
129
- @stderr.puts e.inspect # log exceptions
124
+ # log exceptions
125
+ @stderr.puts e.inspect
130
126
  e.backtrace.each {|b| @stderr.puts " #{b}" }
131
127
  response_500
132
128
  end
133
129
 
134
- # 500 error
135
- def response_500
136
- [500, @headers, [{status: 500, message: 'Something went wrong...'}.to_json]]
137
- end
138
-
139
- # 404 error
140
- def response_404
141
- [404, @headers, [{status: 404, message: 'Not found!'}.to_json]]
142
- end
143
-
144
130
 
145
131
 
146
132
  # Methods for users!
@@ -180,33 +166,35 @@ module Kenji
180
166
  #
181
167
  def respond(code, message, hash={})
182
168
  @status = code
183
- response = { # default structure. TODO: figure out if i really want to keep this
184
- :status => code,
185
- :message => message
169
+ response = { # default structure.
170
+ status: code,
171
+ message: message,
186
172
  }.merge(hash)
187
173
  throw(:KenjiRespondControlFlowInterrupt, [@status, @headers, [response.to_json]])
188
174
  end
189
175
 
176
+ # Respond with raw bytes
177
+ #
178
+ # `data` can either be a string or an IO object.
179
+ #
180
+ def respond_raw(status = 200, data)
181
+ @status = status
182
+ body = data.is_a?(IO) ? data : [data]
183
+ throw(:KenjiRespondControlFlowInterrupt, [@status, @headers, data])
184
+ end
190
185
 
191
186
 
192
187
  # Private methods
193
188
  private
194
189
 
195
- # Deals with silly HTTP CORS Access-Control restrictions by automatically
196
- # allowing all requests.
197
- #
198
- def auto_cors
199
- origin = env['HTTP_ORIGIN']
200
- header 'Access-Control-Allow-Origin' => origin if origin
201
-
202
- if env['REQUEST_METHOD'] == 'OPTIONS'
203
- header 'Access-Control-Allow-Methods' => 'OPTIONS, GET, POST, PUT, DELETE'
190
+ # 500 error
191
+ def response_500
192
+ [500, @headers, [{status: 500, message: 'Something went wrong...'}.to_json]]
193
+ end
204
194
 
205
- if requested_headers = env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']
206
- header 'Access-Control-Allow-Headers' => requested_headers
207
- end
208
- respond(200, 'CORS is allowed.')
209
- end
195
+ # 404 error
196
+ def response_404
197
+ [404, @headers, [{status: 404, message: 'Not found!'}.to_json]]
210
198
  end
211
199
 
212
200
  # Will attempt to fetch the controller, and verify that it is a implements
@@ -227,7 +215,10 @@ module Kenji
227
215
  #
228
216
  def controller_instance(controller_class)
229
217
  # ensure protocol compliance
230
- return unless controller_class.method_defined?(:call) && controller_class.instance_method(:call).arity == 2
218
+ unless (controller_class.method_defined?(:call) &&
219
+ controller_class.instance_method(:call).arity == 2)
220
+ return
221
+ end
231
222
  controller = controller_class.new
232
223
  controller.kenji = self if controller.respond_to?(:kenji=)
233
224
  return controller if controller
@@ -21,8 +21,22 @@ class MainController < Kenji::Controller
21
21
  {status:1337}
22
22
  end
23
23
 
24
+ patch '/' do
25
+ {status:1337}
26
+ end
27
+
24
28
  get '/respond' do
25
29
  kenji.respond(123, 'hello')
26
30
  raise # never called
27
31
  end
32
+
33
+ get '/respond-raw' do
34
+ kenji.respond_raw('hello raw')
35
+ raise # never called
36
+ end
37
+
38
+ get '/respond-io' do
39
+ kenji.respond_raw(123, StringIO.new('hello io'))
40
+ raise # never called
41
+ end
28
42
  end
data/spec/kenji_spec.rb CHANGED
@@ -51,7 +51,7 @@ describe Kenji::Kenji, 'expected responses' do
51
51
  last_response.body.should == expected_response
52
52
  end
53
53
 
54
- [:post, :put, :delete].each do |method|
54
+ [:post, :put, :delete, :patch].each do |method|
55
55
 
56
56
  it "should route a #{method.to_s.upcase} to a defined #{method.to_s} call" do
57
57
  send(method, '/main')
@@ -74,19 +74,18 @@ describe Kenji::Kenji, 'expected responses' do
74
74
  last_response.status.should == 123
75
75
  end
76
76
 
77
- it 'should automatically allow CORS for simple requests' do
78
- header 'Origin', 'foo'
79
- get '/main/hello'
80
- last_response.header['Access-Control-Allow-Origin'].should == 'foo'
77
+ it 'should use respond immediately with kenji.respond_raw' do
78
+ get '/main/respond-raw'
79
+ expected_response = 'hello raw'
80
+ last_response.body.should == expected_response
81
+ last_response.status.should == 200
81
82
  end
82
83
 
83
- it 'should automatically allow CORS for complex requests' do
84
- header 'Origin', 'foo'
85
- header 'Access-Control-Request-Headers', 'Bar'
86
- options '/main/hello'
87
- last_response.header['Access-Control-Allow-Origin'].should == 'foo'
88
- last_response.header['Access-Control-Allow-Methods'].should == 'OPTIONS, GET, POST, PUT, DELETE'
89
- last_response.header['Access-Control-Allow-Headers'].should == 'Bar'
84
+ it 'should use respond immediately with kenji.respond_raw is passed an IO' do
85
+ get '/main/respond-io'
86
+ expected_response = 'hello io'
87
+ last_response.body.should == expected_response
88
+ last_response.status.should == 123
90
89
  end
91
90
 
92
91
  end
metadata CHANGED
@@ -1,94 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kenji
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
5
- prerelease:
4
+ version: 1.1.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kenneth Ballenegger
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-08-27 00:00:00.000000000 Z
11
+ date: 2014-08-09 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: json
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rack
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: 1.5.2
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: 1.5.2
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rack-test
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  description: A lightweight Ruby web framework.
@@ -99,8 +88,9 @@ executables:
99
88
  extensions: []
100
89
  extra_rdoc_files: []
101
90
  files:
102
- - .gitignore
91
+ - ".gitignore"
103
92
  - Gemfile
93
+ - Gemfile.lock
104
94
  - LICENSE
105
95
  - README.md
106
96
  - Rakefile
@@ -132,27 +122,26 @@ files:
132
122
  - spec/kenji_spec.rb
133
123
  homepage: https://github.com/kballenegger/kenji
134
124
  licenses: []
125
+ metadata: {}
135
126
  post_install_message:
136
127
  rdoc_options: []
137
128
  require_paths:
138
129
  - lib
139
130
  required_ruby_version: !ruby/object:Gem::Requirement
140
- none: false
141
131
  requirements:
142
- - - ! '>='
132
+ - - ">="
143
133
  - !ruby/object:Gem::Version
144
134
  version: '0'
145
135
  required_rubygems_version: !ruby/object:Gem::Requirement
146
- none: false
147
136
  requirements:
148
- - - ! '>='
137
+ - - ">="
149
138
  - !ruby/object:Gem::Version
150
139
  version: '0'
151
140
  requirements: []
152
141
  rubyforge_project:
153
- rubygems_version: 1.8.24
142
+ rubygems_version: 2.2.2
154
143
  signing_key:
155
- specification_version: 3
144
+ specification_version: 4
156
145
  summary: Kenji
157
146
  test_files:
158
147
  - spec/1/controllers/main.rb