lotus-controller 0.3.1 → 0.3.2

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: 394aa431f6edb629284fc999c3a317ce46a34b91
4
- data.tar.gz: 97020ea1106fa6b4abe1a878143c9a2494603933
3
+ metadata.gz: 6ca9d4aeba96621f489499f6dc67a58b62b5dd66
4
+ data.tar.gz: f86c1e2d695ac2fb3bc595a6fb6b587edd4f6bc1
5
5
  SHA512:
6
- metadata.gz: 02f845f2f20d2f91c4a5cf3247a70e231f9f776bea1b550b85e971d4abdb06027951c75096b7b9dd246421a00fd14bd6b8063cca5fd097ba51ce6fbfef38ae98
7
- data.tar.gz: df96a33e1899c417311907ea6313c190000355076dcac07502096768369ef1ddc824dfd9e5214551b0e07ba89c0312c6dc21b635b66a797d4f9fb3c63ed184d9
6
+ metadata.gz: 5597d8bc2fe5a15577a6698577adb1f9895c5c37353faed252b045974010b351994cfadcadf3d49215a76b5477aab5d95487d84e570b8913a8a0669ae0dee473
7
+ data.tar.gz: a8e9f5b71b887a6db599e93e7eb555bb1fa556d33ac0ae5f9c095c18f2b55b29bdf53822b9fa459615c03cedf965d564ef4ee52e347d56bc412aaa1e3ff98133
data/CHANGELOG.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # Lotus::Controller
2
2
  Complete, fast and testable actions for Rack
3
3
 
4
+ ## v0.3.2 - 2015-01-30
5
+ ### Added
6
+ - [Alfonso Uceda Pompa] Callbacks: introduced `append_before` (alias of `before`), `append_after` (alias of `after`), `prepend_before` and `prepend_after`.
7
+ - [Alfonso Uceda Pompa] Introduced `Lotus::Action::Params#raw` which returns unfiltered data as it comes from an HTTP request.
8
+ - [Alfonso Uceda Pompa] `Lotus::Action::Rack.use` now fully supports Rack middleware, by mounting an internal `Rack::Builder` instance.
9
+ - [Simone Carletti] `Lotus::Action::Throwable#halt` now accepts an optional message. If missing it falls back to the corresponding HTTP status message.
10
+ - [Steve Hodgkiss] Nested params validation
11
+
12
+ ### Fixed
13
+ - [Luca Guidi] Ensure HEAD requests will return empty body
14
+ - [Stefano Verna] Ensure HTTP status codes with empty body won't send body and non-entity headers.
15
+ - [Luca Guidi] Only dump exceptions in `rack.errors` if handling is turned off, or the raised exception is not managed.
16
+ - [Luca Guidi] Ensure params will return coerced values
17
+
4
18
  ## v0.3.1 - 2015-01-08
5
19
  ### Added
6
20
  - [Lasse Skindstad Ebert] Introduced `Action#request` which returns an instance a `Rack::Request` compliant object: `Lotus::Action::Request`.
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Luca Guidi
1
+ Copyright © 2014-2015 Luca Guidi
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -446,6 +446,26 @@ action = Show.new
446
446
  action.call({}) # => [401, {}, ["Unauthorized"]]
447
447
  ```
448
448
 
449
+ Alternatively, you can specify a custom message.
450
+
451
+ ```ruby
452
+ class Show
453
+ include Lotus::Action
454
+
455
+ def call(params)
456
+ DroidRepository.find(params[:id]) or not_found
457
+ end
458
+
459
+ private
460
+ def not_found
461
+ halt 404, "This is not the droid you're looking for"
462
+ end
463
+ end
464
+
465
+ action = Show.new
466
+ action.call({}) # => [404, {}, ["This is not the droid you're looking for"]]
467
+ ```
468
+
449
469
  ### Cookies
450
470
 
451
471
  Lotus::Controller offers convenient access to cookies.
@@ -1064,4 +1084,4 @@ __Lotus::Controller__ uses [Semantic Versioning 2.0.0](http://semver.org)
1064
1084
 
1065
1085
  ## Copyright
1066
1086
 
1067
- Copyright 2014 Luca Guidi – Released under MIT License
1087
+ Copyright © 2014-2015 Luca Guidi – Released under MIT License
data/lib/lotus/action.rb CHANGED
@@ -6,6 +6,7 @@ require 'lotus/action/exposable'
6
6
  require 'lotus/action/throwable'
7
7
  require 'lotus/action/callbacks'
8
8
  require 'lotus/action/validatable'
9
+ require 'lotus/action/head'
9
10
  require 'lotus/action/callable'
10
11
 
11
12
  module Lotus
@@ -36,6 +37,7 @@ module Lotus
36
37
  #
37
38
  # @see Lotus::Action::Rack
38
39
  # @see Lotus::Action::Mime
40
+ # @see Lotus::Action::Http
39
41
  # @see Lotus::Action::Redirect
40
42
  # @see Lotus::Action::Exposable
41
43
  # @see Lotus::Action::Throwable
@@ -53,6 +55,7 @@ module Lotus
53
55
  include Callbacks
54
56
  include Validatable
55
57
  include Configurable
58
+ include Head
56
59
  prepend Callable
57
60
  end
58
61
  end
@@ -75,6 +78,7 @@ module Lotus
75
78
  # @see Lotus::Action::Session#finish
76
79
  # @see Lotus::Action::Cookies#finish
77
80
  # @see Lotus::Action::Cache#finish
81
+ # @see Lotus::Action::Head#finish
78
82
  def finish
79
83
  end
80
84
  end
@@ -17,7 +17,7 @@ module Lotus
17
17
  # @since 0.1.0
18
18
  # @api private
19
19
  #
20
- # @see http://www.ruby-doc.org/core-2.1.2/Module.html#method-i-included
20
+ # @see http://www.ruby-doc.org/core/Module.html#method-i-included
21
21
  def self.included(base)
22
22
  base.class_eval do
23
23
  extend ClassMethods
@@ -38,7 +38,7 @@ module Lotus
38
38
  # @since 0.1.0
39
39
  # @api private
40
40
  #
41
- # @see http://www.ruby-doc.org/core-2.1.2/Module.html#method-i-extended
41
+ # @see http://www.ruby-doc.org/core/Module.html#method-i-extended
42
42
  def self.extended(base)
43
43
  base.class_eval do
44
44
  include Utils::ClassAttribute
@@ -63,7 +63,9 @@ module Lotus
63
63
  #
64
64
  # @return [void]
65
65
  #
66
- # @since 0.1.0
66
+ # @since 0.3.2
67
+ #
68
+ # @see Lotus::Action::Callbacks::ClassMethods#append_after
67
69
  #
68
70
  # @example Method names (symbols)
69
71
  # require 'lotus/controller'
@@ -111,10 +113,13 @@ module Lotus
111
113
  # # 1. authentication
112
114
  # # 2. set the article
113
115
  # # 3. #call
114
- def before(*callbacks, &blk)
115
- before_callbacks.add(*callbacks, &blk)
116
+ def append_before(*callbacks, &blk)
117
+ before_callbacks.append(*callbacks, &blk)
116
118
  end
117
119
 
120
+ # @since 0.1.0
121
+ alias_method :before, :append_before
122
+
118
123
  # Define a callback for an Action.
119
124
  # The callback will be executed **after** the action is called, in the
120
125
  # order they are added.
@@ -127,11 +132,52 @@ module Lotus
127
132
  #
128
133
  # @return [void]
129
134
  #
135
+ # @since 0.3.2
136
+ #
137
+ # @see Lotus::Action::Callbacks::ClassMethods#append_before
138
+ def append_after(*callbacks, &blk)
139
+ after_callbacks.append(*callbacks, &blk)
140
+ end
141
+
130
142
  # @since 0.1.0
143
+ alias_method :after, :append_after
144
+
145
+ # Define a callback for an Action.
146
+ # The callback will be executed **before** the action is called.
147
+ # It will add the callback at the beginning of the callbacks' chain.
148
+ #
149
+ # @param callbacks [Symbol, Array<Symbol>] a single or multiple symbol(s)
150
+ # each of them is representing a name of a method available in the
151
+ # context of the Action.
152
+ #
153
+ # @param blk [Proc] an anonymous function to be executed
154
+ #
155
+ # @return [void]
156
+ #
157
+ # @since 0.3.2
158
+ #
159
+ # @see Lotus::Action::Callbacks::ClassMethods#prepend_after
160
+ def prepend_before(*callbacks, &blk)
161
+ before_callbacks.prepend(*callbacks, &blk)
162
+ end
163
+
164
+ # Define a callback for an Action.
165
+ # The callback will be executed **after** the action is called.
166
+ # It will add the callback at the beginning of the callbacks' chain.
167
+ #
168
+ # @param callbacks [Symbol, Array<Symbol>] a single or multiple symbol(s)
169
+ # each of them is representing a name of a method available in the
170
+ # context of the Action.
171
+ #
172
+ # @param blk [Proc] an anonymous function to be executed
173
+ #
174
+ # @return [void]
175
+ #
176
+ # @since 0.3.2
131
177
  #
132
- # @see Lotus::Action::Callbacks::ClassMethods#before
133
- def after(*callbacks, &blk)
134
- after_callbacks.add(*callbacks, &blk)
178
+ # @see Lotus::Action::Callbacks::ClassMethods#prepend_before
179
+ def prepend_after(*callbacks, &blk)
180
+ after_callbacks.prepend(*callbacks, &blk)
135
181
  end
136
182
  end
137
183
 
@@ -2,6 +2,9 @@ module Lotus
2
2
  module Action
3
3
  # Glue code for full stack Lotus applications
4
4
  #
5
+ # This includes missing rendering logic that it makes sense to include
6
+ # only for web applications.
7
+ #
5
8
  # @api private
6
9
  # @since 0.3.0
7
10
  module Glue
@@ -11,12 +14,30 @@ module Lotus
11
14
  # @since 0.3.0
12
15
  ENV_KEY = 'lotus.action'.freeze
13
16
 
17
+ # @api private
18
+ # @since 0.3.2
19
+ ADDITIONAL_HTTP_STATUSES_WITHOUT_BODY = Set.new([301, 302]).freeze
20
+
14
21
  # Override Ruby's Module#included
15
22
  #
16
23
  # @api private
17
24
  # @since 0.3.0
18
25
  def self.included(base)
19
- base.class_eval { expose :format }
26
+ base.class_eval { expose(:format) if respond_to?(:expose) }
27
+ end
28
+
29
+ # Check if the current HTTP request is renderable.
30
+ #
31
+ # It verifies if the verb isn't HEAD and if the status demands to omit
32
+ # the body.
33
+ #
34
+ # @return [TrueClass,FalseClass] the result of the check
35
+ #
36
+ # @api private
37
+ # @since 0.3.2
38
+ def renderable?
39
+ !_requires_no_body? &&
40
+ !ADDITIONAL_HTTP_STATUSES_WITHOUT_BODY.include?(@_status)
20
41
  end
21
42
 
22
43
  protected
@@ -0,0 +1,40 @@
1
+ module Lotus
2
+ module Action
3
+ # Ensures to not send body or headers for HEAD requests and/or for status
4
+ # codes that doesn't allow them.
5
+ #
6
+ # @since 0.3.2
7
+ #
8
+ # @see http://www.ietf.org/rfc/rfc2616.txt
9
+ module Head
10
+
11
+ # Status codes that by RFC must not include a message body
12
+ #
13
+ # @since 0.3.2
14
+ # @api private
15
+ HTTP_STATUSES_WITHOUT_BODY = Set.new((100..199).to_a << 204 << 205 << 304).freeze
16
+
17
+ # Ensures to not send body or headers for HEAD requests and/or for status
18
+ # codes that doesn't allow them.
19
+ #
20
+ # @since 0.3.2
21
+ # @api private
22
+ #
23
+ # @see Lotus::Action#finish
24
+ def finish
25
+ super
26
+
27
+ if _requires_no_body?
28
+ @_body = nil
29
+ end
30
+ end
31
+
32
+ protected
33
+ # @since 0.3.2
34
+ # @api private
35
+ def _requires_no_body?
36
+ HTTP_STATUSES_WITHOUT_BODY.include?(@_status) || head?
37
+ end
38
+ end
39
+ end
40
+ end
@@ -80,8 +80,8 @@ module Lotus
80
80
  #
81
81
  # params = SignupParams.new({})
82
82
  # params.valid? # => raise ArgumentError
83
- def self.param(name, options = {})
84
- attribute name, options
83
+ def self.param(name, options = {}, &block)
84
+ attribute name, options, &block
85
85
  nil
86
86
  end
87
87
 
@@ -91,12 +91,28 @@ module Lotus
91
91
  defined_attributes.any?
92
92
  end
93
93
 
94
+ # Overrides the method in Lotus::Validation to build a class that
95
+ # inherits from Params rather than only Lotus::Validations.
96
+ #
97
+ # @since 0.3.2
98
+ # @api private
99
+ def self.build_validation_class(&block)
100
+ kls = Class.new(Params)
101
+ kls.class_eval(&block)
102
+ kls
103
+ end
104
+
94
105
  # @attr_reader env [Hash] the Rack env
95
106
  #
96
107
  # @since 0.2.0
97
108
  # @api private
98
109
  attr_reader :env
99
110
 
111
+ # @attr_reader raw [Lotus::Utils::Attributes] all request's attributes
112
+ #
113
+ # @since 0.3.2
114
+ attr_reader :raw
115
+
100
116
  # Initialize the params and freeze them.
101
117
  #
102
118
  # @param env [Hash] a Rack env or an hash of params.
@@ -138,10 +154,16 @@ module Lotus
138
154
  if self.class.whitelisting?
139
155
  _whitelisted_params
140
156
  else
141
- @attributes = Utils::Attributes.new(_params)
157
+ @attributes = _raw
142
158
  end
143
159
  end
144
160
 
161
+ # @since 0.3.2
162
+ # @api private
163
+ def _raw
164
+ @raw ||= Utils::Attributes.new(_params)
165
+ end
166
+
145
167
  # @since 0.3.1
146
168
  # @api private
147
169
  def _params
@@ -159,7 +181,7 @@ module Lotus
159
181
  # @api private
160
182
  def _whitelisted_params
161
183
  {}.tap do |result|
162
- _params.each do |k, v|
184
+ _raw.to_h.each do |k, v|
163
185
  next unless self.class.defined_attributes.include?(k.to_s)
164
186
 
165
187
  result[k] = v
@@ -1,5 +1,6 @@
1
1
  require 'securerandom'
2
2
  require 'lotus/action/request'
3
+ require 'lotus/action/rack/callable'
3
4
 
4
5
  module Lotus
5
6
  module Action
@@ -27,6 +28,18 @@ module Lotus
27
28
  # @see Lotus::Action::Rack#request_id
28
29
  DEFAULT_REQUEST_ID_LENGTH = 16
29
30
 
31
+ # The request method
32
+ #
33
+ # @since 0.3.2
34
+ # @api private
35
+ REQUEST_METHOD = 'REQUEST_METHOD'.freeze
36
+
37
+ # HEAD request
38
+ #
39
+ # @since 0.3.2
40
+ # @api private
41
+ HEAD = 'HEAD'.freeze
42
+
30
43
  # Override Ruby's hook for modules.
31
44
  # It includes basic Lotus::Action modules to the given class.
32
45
  #
@@ -41,11 +54,20 @@ module Lotus
41
54
  end
42
55
 
43
56
  module ClassMethods
44
- # Use a Rack middleware as a before callback.
57
+ # Build rack builder
45
58
  #
46
- # The middleware will be used as it is, no matter if it's a class or an
47
- # instance. If it needs to be initialized, please do it before to pass
48
- # it as the argument of this method.
59
+ # @return [Rack::Builder]
60
+ def rack_builder
61
+ @rack_builder ||= begin
62
+ extend Lotus::Action::Rack::Callable
63
+ rack_builder = ::Rack::Builder.new
64
+ rack_builder.run ->(env) { self.new.call(env) }
65
+ rack_builder
66
+ end
67
+ end
68
+ # Use a Rack middleware
69
+ #
70
+ # The middleware will be used as it is.
49
71
  #
50
72
  # At the runtime, the middleware be invoked with the raw Rack env.
51
73
  #
@@ -53,12 +75,13 @@ module Lotus
53
75
  # this method.
54
76
  #
55
77
  # @param middleware [#call] A Rack middleware
78
+ # @param args [Array] Array arguments for middleware
56
79
  #
57
80
  # @since 0.2.0
58
81
  #
59
82
  # @see Lotus::Action::Callbacks::ClassMethods#before
60
83
  #
61
- # @example Class Middleware
84
+ # @example Middleware
62
85
  # require 'lotus/controller'
63
86
  #
64
87
  # module Sessions
@@ -71,29 +94,12 @@ module Lotus
71
94
  # end
72
95
  # end
73
96
  # end
74
- #
75
- # @example Instance Middleware
76
- # require 'lotus/controller'
77
- #
78
- # module Sessions
79
- # class Create
80
- # include Lotus::Controller
81
- # use XMiddleware.new('x', 123)
82
- #
83
- # def call(params)
84
- # # ...
85
- # end
86
- # end
87
- # end
88
- def use(middleware)
89
- before do |params|
90
- middleware.call(params.env)
91
- end
97
+ def use(middleware, *args)
98
+ rack_builder.use middleware, *args
92
99
  end
93
100
  end
94
101
 
95
102
  protected
96
-
97
103
  # Gets the headers from the response
98
104
  #
99
105
  # @return [Hash] the HTTP headers from the response
@@ -210,6 +216,15 @@ module Lotus
210
216
  body = Array(body) unless body.respond_to?(:each)
211
217
  @_body = body
212
218
  end
219
+
220
+ # Check if the current request is a HEAD
221
+ #
222
+ # @return [TrueClass,FalseClass] the result of the check
223
+ #
224
+ # @since 0.3.2
225
+ def head?
226
+ @_env[REQUEST_METHOD] == HEAD
227
+ end
213
228
  end
214
229
  end
215
230
  end
@@ -0,0 +1,47 @@
1
+
2
+ module Lotus
3
+ module Action
4
+ module Rack
5
+ module Callable
6
+ # Callable module for actions. With this module, actions with middlewares
7
+ # will be able to work with rack builder.
8
+ #
9
+ # @param env [Hash] the full Rack env or the params. This value may vary,
10
+ # see the examples below.
11
+ #
12
+ # @since x.x.x
13
+ #
14
+ # @see Lotus::Action::Rack::ClassMethods#rack_builder
15
+ # @see Lotus::Action::Rack::ClassMethods#use
16
+ #
17
+ # @example
18
+ # require 'lotus/controller'
19
+ #
20
+ # class MyMiddleware
21
+ # def initialize(app)
22
+ # @app = app
23
+ # end
24
+ #
25
+ # def call(env)
26
+ # #...
27
+ # end
28
+ # end
29
+ #
30
+ # class Show
31
+ # include Lotus::Action
32
+ # use MyMiddleware
33
+ #
34
+ # def call(params)
35
+ # # ...
36
+ # puts params # => { id: 23 } extracted from Rack env
37
+ # end
38
+ # end
39
+ #
40
+ # Show.respond_to?(:call) # => true
41
+ def call(env)
42
+ rack_builder.call(env)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -62,24 +62,50 @@ module Lotus
62
62
 
63
63
  protected
64
64
 
65
- # Halt the action execution with the given HTTP status code.
65
+ # Halt the action execution with the given HTTP status code and message.
66
66
  #
67
67
  # When used, the execution of a callback or of an action is interrupted
68
68
  # and the control returns to the framework, that decides how to handle
69
69
  # the event.
70
70
  #
71
- # It also sets the response body with the message associated to the code
72
- # (eg 404 will set `"Not Found"`).
71
+ # If a message is provided, it sets the response body with the message.
72
+ # Otherwise, it sets the response body with the default message associated
73
+ # to the code (eg 404 will set `"Not Found"`).
73
74
  #
74
75
  # @param code [Fixnum] a valid HTTP status code
76
+ # @param message [String] the response body
75
77
  #
76
78
  # @since 0.2.0
77
79
  #
78
80
  # @see Lotus::Controller#handled_exceptions
79
81
  # @see Lotus::Action::Throwable#handle_exception
80
82
  # @see Lotus::Http::Status:ALL
81
- def halt(code = nil)
82
- status(*Http::Status.for_code(code)) if code
83
+ #
84
+ # @example Basic usage
85
+ # require 'lotus/controller'
86
+ #
87
+ # class Show
88
+ # def call(params)
89
+ # halt 404
90
+ # end
91
+ # end
92
+ #
93
+ # # => [404, {}, ["Not Found"]]
94
+ #
95
+ # @example Custom message
96
+ # require 'lotus/controller'
97
+ #
98
+ # class Show
99
+ # def call(params)
100
+ # halt 404, "This is not the droid you're looking for."
101
+ # end
102
+ # end
103
+ #
104
+ # # => [404, {}, ["This is not the droid you're looking for."]]
105
+ def halt(code, message = nil)
106
+ message ||= Http::Status.message_for(code)
107
+ status(code, message)
108
+
83
109
  throw :halt
84
110
  end
85
111
 
@@ -112,6 +138,8 @@ module Lotus
112
138
  # @since 0.2.0
113
139
  # @api private
114
140
  def _reference_in_rack_errors(exception)
141
+ return if configuration.handled_exception?(exception)
142
+
115
143
  if errors = @_env[RACK_ERRORS]
116
144
  errors.write(_dump_exception(exception))
117
145
  errors.flush
@@ -194,6 +194,19 @@ module Lotus
194
194
  @handled_exceptions.fetch(exception.class) { DEFAULT_ERROR_CODE }
195
195
  end
196
196
 
197
+ # Check if the given exception is handled.
198
+ #
199
+ # @param exception [Exception] an exception
200
+ #
201
+ # @since 0.3.2
202
+ # @api private
203
+ #
204
+ # @see Lotus::Controller::Configuration#handle_exception
205
+ def handled_exception?(exception)
206
+ handled_exceptions &&
207
+ !!@handled_exceptions.fetch(exception.class) { false }
208
+ end
209
+
197
210
  # Specify which is the default action module to be included when we use
198
211
  # the `Lotus::Controller.action` method.
199
212
  #
@@ -3,6 +3,6 @@ module Lotus
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '0.3.1'.freeze
6
+ VERSION = '0.3.2'.freeze
7
7
  end
8
8
  end
@@ -45,6 +45,18 @@ module Lotus
45
45
  def self.for_code(code)
46
46
  ALL.assoc(code)
47
47
  end
48
+
49
+ # Return a message for the given status code
50
+ #
51
+ # @param code [Fixnum] a valid HTTP code
52
+ #
53
+ # @return [String] a message for the given status code
54
+ #
55
+ # @since 0.3.2
56
+ # @api private
57
+ def self.message_for(code)
58
+ for_code(code)[1]
59
+ end
48
60
  end
49
61
  end
50
62
  end
@@ -20,8 +20,8 @@ Gem::Specification.new do |spec|
20
20
  spec.required_ruby_version = '>= 2.0.0'
21
21
 
22
22
  spec.add_dependency 'rack', '~> 1.5'
23
- spec.add_dependency 'lotus-utils', '~> 0.3', '>= 0.3.2'
24
- spec.add_dependency 'lotus-validations', '~> 0.2', '>= 0.2.2'
23
+ spec.add_dependency 'lotus-utils', '~> 0.3', '>= 0.3.4'
24
+ spec.add_dependency 'lotus-validations', '~> 0.2', '>= 0.2.4'
25
25
 
26
26
  spec.add_development_dependency 'bundler', '~> 1.6'
27
27
  spec.add_development_dependency 'minitest', '~> 5'
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.3.1
4
+ version: 0.3.2
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-01-08 00:00:00.000000000 Z
12
+ date: 2015-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -34,7 +34,7 @@ dependencies:
34
34
  version: '0.3'
35
35
  - - ">="
36
36
  - !ruby/object:Gem::Version
37
- version: 0.3.2
37
+ version: 0.3.4
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -44,7 +44,7 @@ dependencies:
44
44
  version: '0.3'
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.3.2
47
+ version: 0.3.4
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: lotus-validations
50
50
  requirement: !ruby/object:Gem::Requirement
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0.2'
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: 0.2.2
57
+ version: 0.2.4
58
58
  type: :runtime
59
59
  prerelease: false
60
60
  version_requirements: !ruby/object:Gem::Requirement
@@ -64,7 +64,7 @@ dependencies:
64
64
  version: '0.2'
65
65
  - - ">="
66
66
  - !ruby/object:Gem::Version
67
- version: 0.2.2
67
+ version: 0.2.4
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: bundler
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -147,9 +147,11 @@ files:
147
147
  - lib/lotus/action/exposable.rb
148
148
  - lib/lotus/action/flash.rb
149
149
  - lib/lotus/action/glue.rb
150
+ - lib/lotus/action/head.rb
150
151
  - lib/lotus/action/mime.rb
151
152
  - lib/lotus/action/params.rb
152
153
  - lib/lotus/action/rack.rb
154
+ - lib/lotus/action/rack/callable.rb
153
155
  - lib/lotus/action/redirect.rb
154
156
  - lib/lotus/action/request.rb
155
157
  - lib/lotus/action/session.rb
@@ -181,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
183
  version: '0'
182
184
  requirements: []
183
185
  rubyforge_project:
184
- rubygems_version: 2.4.5
186
+ rubygems_version: 2.2.2
185
187
  signing_key:
186
188
  specification_version: 4
187
189
  summary: Complete, fast and testable actions for Rack and Lotus