lotus-controller 0.4.2 → 0.4.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4dd0479963e7ea827bfca6c7b143fa941121a464
4
- data.tar.gz: 44d8132a5de02253879dba5289982e79b5df3438
3
+ metadata.gz: 0b4c85e67bcae87918653c05af57ec2961d41900
4
+ data.tar.gz: e2fb00ab919ee2fbfda7de1785bd9ff38e75df9b
5
5
  SHA512:
6
- metadata.gz: 7e15acf051b1ab28b61a2c9387ab36f56a4259c0f8099db6d0d87c3efcdab4953a91c6089053566c3b85237ed46487e07afe77fff33a76416e37199e731ed83c
7
- data.tar.gz: 7f6ca49dafb869eaefee161ebd24bde30215e43809f8757d9891ec89ceae2351a7868e570e5d230e6758a3500a1af06e921f14733b9c6e5a0ca99d415ed1e8ff
6
+ metadata.gz: 18b96f037a068a7a653579991b853c586eb2b39687bde6236832c03973007adfb8f4c33966cd69511f7b498e52ee0b0f6ce5e7715c0de8ce9d4d30729cec0553
7
+ data.tar.gz: 18753964833666f3cca7a8091bb35425960a18fce40ce0c876c705ac57797a4ae46d360e591b4475e369047aea688a00d93adacdfb616fa2cbf165f6d5c0fe61
@@ -1,6 +1,11 @@
1
1
  # Lotus::Controller
2
2
  Complete, fast and testable actions for Rack
3
3
 
4
+ ## v0.4.3 - 2015-05-22
5
+ ### Added
6
+ - [Alfonso Uceda Pompa & Luca Guidi] Introduced `Lotus::Action#send_file`
7
+ - [Alfonso Uceda Pompa] Set automatically `Expires` option for cookies when it's missing but `Max-Age` is present. Compatibility with old browsers.
8
+
4
9
  ## v0.4.2 - 2015-05-15
5
10
  ### Fixed
6
11
  - [Luca Guidi] Ensure `Lotus::Action::Params#to_h` to return `::Hash` at the top level
@@ -98,13 +98,25 @@ module Lotus
98
98
  # @api private
99
99
  def _merge_default_values(value)
100
100
  cookies_options = if value.is_a? Hash
101
- value
101
+ value.merge! _add_expires_option(value)
102
102
  else
103
103
  { value: value }
104
104
  end
105
105
  @default_options.merge cookies_options
106
106
  end
107
107
 
108
+ # Add expires option to cookies if :max_age presents
109
+ #
110
+ # @since 0.4.3
111
+ # @api private
112
+ def _add_expires_option(value)
113
+ if value.has_key?(:max_age) && !value.has_key?(:expires)
114
+ { expires: (Time.now + value[:max_age]) }
115
+ else
116
+ {}
117
+ end
118
+ end
119
+
108
120
  # Extract the cookies from the raw Rack env.
109
121
  #
110
122
  # This implementation is borrowed from Rack::Request#cookies.
@@ -116,6 +128,8 @@ module Lotus
116
128
  string = env[HTTP_HEADER]
117
129
 
118
130
  return hash if string == env[COOKIE_STRING_KEY]
131
+ # TODO Next Rack 1.6.x version will have ::Rack::Utils.parse_cookies
132
+ # We can then replace the following lines.
119
133
  hash.clear
120
134
 
121
135
  # According to RFC 2109:
@@ -28,8 +28,8 @@ module Lotus
28
28
 
29
29
  # Check if the current HTTP request is renderable.
30
30
  #
31
- # It verifies if the verb isn't HEAD and if the status demands to omit
32
- # the body.
31
+ # It verifies if the verb isn't HEAD, if the status demands to omit
32
+ # the body and if it isn't sending a file.
33
33
  #
34
34
  # @return [TrueClass,FalseClass] the result of the check
35
35
  #
@@ -37,6 +37,7 @@ module Lotus
37
37
  # @since 0.3.2
38
38
  def renderable?
39
39
  !_requires_no_body? &&
40
+ !sending_file? &&
40
41
  !ADDITIONAL_HTTP_STATUSES_WITHOUT_BODY.include?(@_status)
41
42
  end
42
43
 
@@ -51,6 +52,15 @@ module Lotus
51
52
  super
52
53
  @_env[ENV_KEY] = self
53
54
  end
55
+
56
+ # Check if the request's body is a file
57
+ #
58
+ # @return [TrueClass,FalseClass] the result of the check
59
+ #
60
+ # @since 0.4.3
61
+ def sending_file?
62
+ @_body.is_a?(::Rack::File)
63
+ end
54
64
  end
55
65
  end
56
66
  end
@@ -252,7 +252,7 @@ module Lotus
252
252
  # @see Lotus::Action#finish
253
253
  def finish
254
254
  super
255
- headers[CONTENT_TYPE] = content_type_with_charset
255
+ headers[CONTENT_TYPE] ||= content_type_with_charset
256
256
  end
257
257
 
258
258
  # Sets the given format and corresponding content type.
@@ -450,7 +450,7 @@ module Lotus
450
450
 
451
451
  # Patched version of <tt>Rack::Utils.best_q_match</tt>.
452
452
  #
453
- # @since x.x.x
453
+ # @since 0.4.1
454
454
  # @api private
455
455
  #
456
456
  # @see http://www.rubydoc.info/gems/rack/Rack/Utils#best_q_match-class_method
@@ -1,6 +1,7 @@
1
1
  require 'securerandom'
2
2
  require 'lotus/action/request'
3
3
  require 'lotus/action/rack/callable'
4
+ require 'lotus/action/rack/file'
4
5
 
5
6
  module Lotus
6
7
  module Action
@@ -217,6 +218,37 @@ module Lotus
217
218
  @_body = body
218
219
  end
219
220
 
221
+ # Send a file as response.
222
+ #
223
+ # It automatically handle the following cases:
224
+ #
225
+ # * <tt>Content-Type</tt> and <tt>Content-Length</tt>
226
+ # * File Not found (returns a 404)
227
+ # * Conditional GET (via <tt>If-Modified-Since</tt> header)
228
+ # * Range requests (via <tt>Range</tt> header)
229
+ #
230
+ # @param path [String, Pathname] the body of the response
231
+ # @return [void]
232
+ #
233
+ # @since 0.4.3
234
+ #
235
+ # @example
236
+ # require 'lotus/controller'
237
+ #
238
+ # class Show
239
+ # include Lotus::Action
240
+ #
241
+ # def call(params)
242
+ # # ...
243
+ # send_file Pathname.new('path/to/file')
244
+ # end
245
+ # end
246
+ def send_file(path)
247
+ result = File.new(path).call(@_env)
248
+ headers.merge!(result[1])
249
+ halt result[0], result[2]
250
+ end
251
+
220
252
  # Check if the current request is a HEAD
221
253
  #
222
254
  # @return [TrueClass,FalseClass] the result of the check
@@ -0,0 +1,33 @@
1
+ require 'rack/file'
2
+
3
+ module Lotus
4
+ module Action
5
+ module Rack
6
+ # File to be sent
7
+ #
8
+ # @since 0.4.3
9
+ # @api private
10
+ #
11
+ # @see Lotus::Action::Rack#send_file
12
+ class File
13
+ # @param path [String,Pathname] file path
14
+ #
15
+ # @since 0.4.3
16
+ # @api private
17
+ def initialize(path)
18
+ @file = ::Rack::File.new(nil)
19
+ @path = path
20
+ end
21
+
22
+ # @since 0.4.3
23
+ # @api private
24
+ def call(env)
25
+ @file.path = @path.to_s
26
+ @file.serving(env)
27
+ rescue Errno::ENOENT
28
+ [404, {}, nil]
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -3,6 +3,6 @@ module Lotus
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '0.4.2'.freeze
6
+ VERSION = '0.4.3'.freeze
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lotus-controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-05-15 00:00:00.000000000 Z
12
+ date: 2015-05-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -146,6 +146,7 @@ files:
146
146
  - lib/lotus/action/params.rb
147
147
  - lib/lotus/action/rack.rb
148
148
  - lib/lotus/action/rack/callable.rb
149
+ - lib/lotus/action/rack/file.rb
149
150
  - lib/lotus/action/redirect.rb
150
151
  - lib/lotus/action/request.rb
151
152
  - lib/lotus/action/session.rb