lotus-controller 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +0 -27
- data/lib/lotus/action/flash.rb +2 -2
- data/lib/lotus/action/params.rb +28 -11
- data/lib/lotus/action/rack.rb +22 -0
- data/lib/lotus/action/request.rb +86 -0
- data/lib/lotus/controller/version.rb +1 -1
- data/lotus-controller.gemspec +3 -3
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 394aa431f6edb629284fc999c3a317ce46a34b91
|
4
|
+
data.tar.gz: 97020ea1106fa6b4abe1a878143c9a2494603933
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02f845f2f20d2f91c4a5cf3247a70e231f9f776bea1b550b85e971d4abdb06027951c75096b7b9dd246421a00fd14bd6b8063cca5fd097ba51ce6fbfef38ae98
|
7
|
+
data.tar.gz: df96a33e1899c417311907ea6313c190000355076dcac07502096768369ef1ddc824dfd9e5214551b0e07ba89c0312c6dc21b635b66a797d4f9fb3c63ed184d9
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# Lotus::Controller
|
2
2
|
Complete, fast and testable actions for Rack
|
3
3
|
|
4
|
+
## v0.3.1 - 2015-01-08
|
5
|
+
### Added
|
6
|
+
- [Lasse Skindstad Ebert] Introduced `Action#request` which returns an instance a `Rack::Request` compliant object: `Lotus::Action::Request`.
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
- [Steve Hodgkiss] Ensure params to return coerced values
|
10
|
+
|
4
11
|
## v0.3.0 - 2014-12-23
|
5
12
|
### Added
|
6
13
|
- [Luca Guidi] Introduced `Action#request_id` as unique identifier for an incoming HTTP request
|
data/README.md
CHANGED
@@ -1023,33 +1023,6 @@ Articles::Create.new.call({})
|
|
1023
1023
|
# => raises ArgumentError because we set handle_exceptions to false
|
1024
1024
|
```
|
1025
1025
|
|
1026
|
-
### Reusability
|
1027
|
-
|
1028
|
-
Lotus::Controller can be used as a singleton framework as seen in this README.
|
1029
|
-
The application code includes `Lotus::Controller` or `Lotus::Action` directly
|
1030
|
-
and the configuration is unique per Ruby process.
|
1031
|
-
|
1032
|
-
While this is convenient for tiny applications, it doesn't fit well for more
|
1033
|
-
complex scenarios, where we want micro applications to coexist together.
|
1034
|
-
|
1035
|
-
```ruby
|
1036
|
-
require 'lotus/controller'
|
1037
|
-
|
1038
|
-
module WebApp
|
1039
|
-
Controller = Lotus::Controller.duplicate
|
1040
|
-
end
|
1041
|
-
|
1042
|
-
module ApiApp
|
1043
|
-
Controller = Lotus::Controller.duplicate(self) do
|
1044
|
-
handle_exception ArgumentError => 400
|
1045
|
-
end
|
1046
|
-
end
|
1047
|
-
```
|
1048
|
-
|
1049
|
-
The code above defines `WebApp::Controller` and `WebApp::Action`, to be used for
|
1050
|
-
the `WebApp` endpoints, while `ApiApp::Controller` and `ApiApp::Action` have
|
1051
|
-
a different configuration.
|
1052
|
-
|
1053
1026
|
### Thread safety
|
1054
1027
|
|
1055
1028
|
An Action is **mutable**. When used without Lotus::Router, be sure to instantiate an
|
data/lib/lotus/action/flash.rb
CHANGED
@@ -90,7 +90,7 @@ module Lotus
|
|
90
90
|
# @since 0.3.0
|
91
91
|
# @api private
|
92
92
|
def flash
|
93
|
-
@session[SESSION_KEY]
|
93
|
+
@session[SESSION_KEY] || {}
|
94
94
|
end
|
95
95
|
|
96
96
|
# The flash registry that holds the data **only for** the current request
|
@@ -100,7 +100,7 @@ module Lotus
|
|
100
100
|
# @since 0.3.0
|
101
101
|
# @api private
|
102
102
|
def data
|
103
|
-
flash[@request_id]
|
103
|
+
flash[@request_id] || {}
|
104
104
|
end
|
105
105
|
|
106
106
|
# Expire the stale data from the previous request.
|
data/lib/lotus/action/params.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'lotus/utils/hash'
|
2
1
|
require 'lotus/validations'
|
2
|
+
require 'lotus/utils/attributes'
|
3
3
|
require 'set'
|
4
4
|
|
5
5
|
module Lotus
|
@@ -87,6 +87,10 @@ module Lotus
|
|
87
87
|
|
88
88
|
include Lotus::Validations
|
89
89
|
|
90
|
+
def self.whitelisting?
|
91
|
+
defined_attributes.any?
|
92
|
+
end
|
93
|
+
|
90
94
|
# @attr_reader env [Hash] the Rack env
|
91
95
|
#
|
92
96
|
# @since 0.2.0
|
@@ -103,12 +107,7 @@ module Lotus
|
|
103
107
|
def initialize(env)
|
104
108
|
@env = env
|
105
109
|
super(_compute_params)
|
106
|
-
freeze
|
107
|
-
end
|
108
|
-
|
109
|
-
def self.defined_attributes
|
110
|
-
result = super
|
111
|
-
return result if result.to_ary.any?
|
110
|
+
# freeze
|
112
111
|
end
|
113
112
|
|
114
113
|
# Returns the object associated with the given key
|
@@ -133,13 +132,19 @@ module Lotus
|
|
133
132
|
alias_method :to_hash, :to_h
|
134
133
|
|
135
134
|
private
|
135
|
+
# @since 0.3.1
|
136
|
+
# @api private
|
136
137
|
def _compute_params
|
137
|
-
|
138
|
-
|
139
|
-
|
138
|
+
if self.class.whitelisting?
|
139
|
+
_whitelisted_params
|
140
|
+
else
|
141
|
+
@attributes = Utils::Attributes.new(_params)
|
142
|
+
end
|
140
143
|
end
|
141
144
|
|
142
|
-
|
145
|
+
# @since 0.3.1
|
146
|
+
# @api private
|
147
|
+
def _params
|
143
148
|
{}.tap do |result|
|
144
149
|
if env.has_key?(RACK_INPUT)
|
145
150
|
result.merge! ::Rack::Request.new(env).params
|
@@ -149,6 +154,18 @@ module Lotus
|
|
149
154
|
end
|
150
155
|
end
|
151
156
|
end
|
157
|
+
|
158
|
+
# @since 0.3.1
|
159
|
+
# @api private
|
160
|
+
def _whitelisted_params
|
161
|
+
{}.tap do |result|
|
162
|
+
_params.each do |k, v|
|
163
|
+
next unless self.class.defined_attributes.include?(k.to_s)
|
164
|
+
|
165
|
+
result[k] = v
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
152
169
|
end
|
153
170
|
end
|
154
171
|
end
|
data/lib/lotus/action/rack.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'securerandom'
|
2
|
+
require 'lotus/action/request'
|
2
3
|
|
3
4
|
module Lotus
|
4
5
|
module Action
|
@@ -142,6 +143,27 @@ module Lotus
|
|
142
143
|
@request_id ||= SecureRandom.hex(DEFAULT_REQUEST_ID_LENGTH)
|
143
144
|
end
|
144
145
|
|
146
|
+
# Returns a Lotus specialized rack request
|
147
|
+
#
|
148
|
+
# @return [Lotus::Action::Request] The request
|
149
|
+
#
|
150
|
+
# @since 0.3.1
|
151
|
+
#
|
152
|
+
# @example
|
153
|
+
# require 'lotus/controller'
|
154
|
+
#
|
155
|
+
# class Create
|
156
|
+
# include Lotus::Action
|
157
|
+
#
|
158
|
+
# def call(params)
|
159
|
+
# ip = request.ip
|
160
|
+
# secure = request.ssl?
|
161
|
+
# end
|
162
|
+
# end
|
163
|
+
def request
|
164
|
+
@request ||= ::Lotus::Action::Request.new(@_env)
|
165
|
+
end
|
166
|
+
|
145
167
|
private
|
146
168
|
|
147
169
|
# Sets the HTTP status code for the response
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'rack/request'
|
2
|
+
|
3
|
+
module Lotus
|
4
|
+
module Action
|
5
|
+
# An HTTP request based on top of Rack::Request.
|
6
|
+
# This guarantees backwards compatibility with with Rack.
|
7
|
+
#
|
8
|
+
# @since 0.3.1
|
9
|
+
#
|
10
|
+
# @see http://www.rubydoc.info/gems/rack/Rack/Request
|
11
|
+
class Request < ::Rack::Request
|
12
|
+
|
13
|
+
# @raise [NotImplementedError]
|
14
|
+
#
|
15
|
+
# @since 0.3.1
|
16
|
+
# @api private
|
17
|
+
def content_type
|
18
|
+
raise NotImplementedError, 'Please use Action#content_type'
|
19
|
+
end
|
20
|
+
|
21
|
+
# @raise [NotImplementedError]
|
22
|
+
#
|
23
|
+
# @since 0.3.1
|
24
|
+
# @api private
|
25
|
+
def session
|
26
|
+
raise NotImplementedError, 'Please include Action::Session and use Action#session'
|
27
|
+
end
|
28
|
+
|
29
|
+
# @raise [NotImplementedError]
|
30
|
+
#
|
31
|
+
# @since 0.3.1
|
32
|
+
# @api private
|
33
|
+
def cookies
|
34
|
+
raise NotImplementedError, 'Please include Action::Cookies and use Action#cookies'
|
35
|
+
end
|
36
|
+
|
37
|
+
# @raise [NotImplementedError]
|
38
|
+
#
|
39
|
+
# @since 0.3.1
|
40
|
+
# @api private
|
41
|
+
def params
|
42
|
+
raise NotImplementedError, 'Please use params passed to Action#call'
|
43
|
+
end
|
44
|
+
|
45
|
+
# @raise [NotImplementedError]
|
46
|
+
#
|
47
|
+
# @since 0.3.1
|
48
|
+
# @api private
|
49
|
+
def update_param(*)
|
50
|
+
raise NotImplementedError, 'Please use params passed to Action#call'
|
51
|
+
end
|
52
|
+
|
53
|
+
# @raise [NotImplementedError]
|
54
|
+
#
|
55
|
+
# @since 0.3.1
|
56
|
+
# @api private
|
57
|
+
def delete_param(*)
|
58
|
+
raise NotImplementedError, 'Please use params passed to Action#call'
|
59
|
+
end
|
60
|
+
|
61
|
+
# @raise [NotImplementedError]
|
62
|
+
#
|
63
|
+
# @since 0.3.1
|
64
|
+
# @api private
|
65
|
+
def [](*)
|
66
|
+
raise NotImplementedError, 'Please use params passed to Action#call'
|
67
|
+
end
|
68
|
+
|
69
|
+
# @raise [NotImplementedError]
|
70
|
+
#
|
71
|
+
# @since 0.3.1
|
72
|
+
# @api private
|
73
|
+
def []=(*)
|
74
|
+
raise NotImplementedError, 'Please use params passed to Action#call'
|
75
|
+
end
|
76
|
+
|
77
|
+
# @raise [NotImplementedError]
|
78
|
+
#
|
79
|
+
# @since 0.3.1
|
80
|
+
# @api private
|
81
|
+
def values_at(*)
|
82
|
+
raise NotImplementedError, 'Please use params passed to Action#call'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lotus-controller.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'lotus/controller/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'lotus-controller'
|
8
8
|
spec.version = Lotus::Controller::VERSION
|
9
|
-
spec.authors = ['Luca Guidi']
|
10
|
-
spec.email = ['me@lucaguidi.com']
|
9
|
+
spec.authors = ['Luca Guidi', 'Trung Lê']
|
10
|
+
spec.email = ['me@lucaguidi.com', 'trung.le@ruby-journal.com']
|
11
11
|
spec.description = %q{Complete, fast and testable actions for Rack}
|
12
12
|
spec.summary = %q{Complete, fast and testable actions for Rack and Lotus}
|
13
13
|
spec.homepage = 'http://lotusrb.org'
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_dependency 'rack', '~> 1.5'
|
23
23
|
spec.add_dependency 'lotus-utils', '~> 0.3', '>= 0.3.2'
|
24
|
-
spec.add_dependency 'lotus-validations', '~> 0.2', '>= 0.2.
|
24
|
+
spec.add_dependency 'lotus-validations', '~> 0.2', '>= 0.2.2'
|
25
25
|
|
26
26
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
27
27
|
spec.add_development_dependency 'minitest', '~> 5'
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lotus-controller
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
|
+
- Trung Lê
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2015-01-08 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rack
|
@@ -53,7 +54,7 @@ dependencies:
|
|
53
54
|
version: '0.2'
|
54
55
|
- - ">="
|
55
56
|
- !ruby/object:Gem::Version
|
56
|
-
version: 0.2.
|
57
|
+
version: 0.2.2
|
57
58
|
type: :runtime
|
58
59
|
prerelease: false
|
59
60
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -63,7 +64,7 @@ dependencies:
|
|
63
64
|
version: '0.2'
|
64
65
|
- - ">="
|
65
66
|
- !ruby/object:Gem::Version
|
66
|
-
version: 0.2.
|
67
|
+
version: 0.2.2
|
67
68
|
- !ruby/object:Gem::Dependency
|
68
69
|
name: bundler
|
69
70
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,6 +124,7 @@ dependencies:
|
|
123
124
|
description: Complete, fast and testable actions for Rack
|
124
125
|
email:
|
125
126
|
- me@lucaguidi.com
|
127
|
+
- trung.le@ruby-journal.com
|
126
128
|
executables: []
|
127
129
|
extensions: []
|
128
130
|
extra_rdoc_files: []
|
@@ -149,6 +151,7 @@ files:
|
|
149
151
|
- lib/lotus/action/params.rb
|
150
152
|
- lib/lotus/action/rack.rb
|
151
153
|
- lib/lotus/action/redirect.rb
|
154
|
+
- lib/lotus/action/request.rb
|
152
155
|
- lib/lotus/action/session.rb
|
153
156
|
- lib/lotus/action/throwable.rb
|
154
157
|
- lib/lotus/action/validatable.rb
|
@@ -178,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
181
|
version: '0'
|
179
182
|
requirements: []
|
180
183
|
rubyforge_project:
|
181
|
-
rubygems_version: 2.
|
184
|
+
rubygems_version: 2.4.5
|
182
185
|
signing_key:
|
183
186
|
specification_version: 4
|
184
187
|
summary: Complete, fast and testable actions for Rack and Lotus
|