lotus-controller 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +60 -8
- data/lib/lotus/action/cookie_jar.rb +6 -2
- data/lib/lotus/action/mime.rb +11 -4
- data/lib/lotus/controller/configuration.rb +86 -19
- data/lib/lotus/controller/version.rb +1 -1
- data/lotus-controller.gemspec +4 -4
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04ae3ccf09d545e91ee49d06a52dd18ea196871f
|
4
|
+
data.tar.gz: 645e47bc4dacb1147cf01007668bd73ece973169
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc76f8ea93416a106fb491bdd3168df82722386b85306eabdf73fca31fa20dff7c38f38ebb317b8393f849a54ec56a3c08e774780691a92289bcf2848af70487
|
7
|
+
data.tar.gz: 923df9fa385da1b3358ebfc46ed386665e6f3f0814f901a39b960603e32dfead3f1f04e90fcf323d56f9401cbbd2e236d52bd5a3ef1a4d1f61f2659322502090
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
# Lotus::Controller
|
2
2
|
Complete, fast and testable actions for Rack
|
3
3
|
|
4
|
+
## v0.4.5 - 2015-09-30
|
5
|
+
### Added
|
6
|
+
- [Theo Felippe] Added configuration entries: `#default_request_format` and `default_response_format`.
|
7
|
+
- [Wellington Santos] Error handling to take account of inherited exceptions.
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
- [Theo Felippe] Deprecated `#default_format` in favor of: `#default_request_format`.
|
11
|
+
|
4
12
|
## v0.4.4 - 2015-06-23
|
5
13
|
### Added
|
6
14
|
- [Luca Guidi] Security protection against Cross Site Request Forgery (CSRF).
|
data/README.md
CHANGED
@@ -432,6 +432,51 @@ action = Articles::Show.new
|
|
432
432
|
action.call({id: 'unknown'}) # => raises RecordNotFound
|
433
433
|
```
|
434
434
|
|
435
|
+
#### Inherited Exceptions
|
436
|
+
|
437
|
+
```ruby
|
438
|
+
class MyCustomException < StandardError
|
439
|
+
end
|
440
|
+
|
441
|
+
module Articles
|
442
|
+
class Index
|
443
|
+
include Lotus::Action
|
444
|
+
|
445
|
+
handle_exception MyCustomException => :handle_my_exception
|
446
|
+
|
447
|
+
def call(params)
|
448
|
+
raise MyCustomException
|
449
|
+
end
|
450
|
+
|
451
|
+
private
|
452
|
+
|
453
|
+
def handle_my_exception
|
454
|
+
# ...
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
class Show
|
459
|
+
include Lotus::Action
|
460
|
+
|
461
|
+
handle_exception StandardError => :handle_standard_error
|
462
|
+
|
463
|
+
def call(params)
|
464
|
+
raise MyCustomException
|
465
|
+
end
|
466
|
+
|
467
|
+
private
|
468
|
+
|
469
|
+
def handle_standard_error
|
470
|
+
# ...
|
471
|
+
end
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
Articles::Index.new.call({}) # => `handle_my_exception` will be invoked
|
476
|
+
Articles::Show.new.call({}) # => `handle_standard_error` will be invoked,
|
477
|
+
# because `MyCustomException` inherits from `StandardError`
|
478
|
+
```
|
479
|
+
|
435
480
|
### Throwable HTTP statuses
|
436
481
|
|
437
482
|
When `#halt` is used with a valid HTTP code, it stops the execution and sets the proper status and body for the response:
|
@@ -754,7 +799,7 @@ action = Create.new
|
|
754
799
|
action.call({ article: { title: 'Hello' }}) # => [301, {'Location' => '/articles/23'}, '']
|
755
800
|
```
|
756
801
|
|
757
|
-
###
|
802
|
+
### MIME Types
|
758
803
|
|
759
804
|
`Lotus::Action` automatically sets the `Content-Type` header, according to the request.
|
760
805
|
|
@@ -796,7 +841,7 @@ action.call({ 'HTTP_ACCEPT' => 'text/html' }) # Content-Type "application/json"
|
|
796
841
|
action.format # :json
|
797
842
|
```
|
798
843
|
|
799
|
-
You can restrict the accepted
|
844
|
+
You can restrict the accepted MIME types:
|
800
845
|
|
801
846
|
```ruby
|
802
847
|
class Show
|
@@ -814,7 +859,7 @@ end
|
|
814
859
|
# When called with "application/xml" => 406
|
815
860
|
```
|
816
861
|
|
817
|
-
You can check if the requested
|
862
|
+
You can check if the requested MIME type is accepted by the client.
|
818
863
|
|
819
864
|
```ruby
|
820
865
|
class Show
|
@@ -841,7 +886,7 @@ class Show
|
|
841
886
|
end
|
842
887
|
```
|
843
888
|
|
844
|
-
Lotus::Controller is shipped with an extensive list of the most common
|
889
|
+
Lotus::Controller is shipped with an extensive list of the most common MIME types.
|
845
890
|
Also, you can register your own:
|
846
891
|
|
847
892
|
```ruby
|
@@ -1002,16 +1047,23 @@ Lotus::Controller.configure do
|
|
1002
1047
|
#
|
1003
1048
|
handle_exception ArgumentError => 404
|
1004
1049
|
|
1005
|
-
# Register a format to
|
1006
|
-
# Argument: hash, key: format symbol, value:
|
1050
|
+
# Register a format to MIME type mapping
|
1051
|
+
# Argument: hash, key: format symbol, value: MIME type string, empty by default
|
1007
1052
|
#
|
1008
1053
|
format custom: 'application/custom'
|
1009
1054
|
|
1010
|
-
# Define a
|
1055
|
+
# Define a fallback format to detect in case of HTTP request with `Accept: */*`
|
1056
|
+
# If not defined here, it will return Rack's default: `application/octet-stream`
|
1057
|
+
# Argument: symbol, it should be already known. defaults to `nil`
|
1058
|
+
#
|
1059
|
+
default_request_format :html
|
1060
|
+
|
1061
|
+
# Define a default format to set as `Content-Type` header for response,
|
1062
|
+
# unless otherwise specified.
|
1011
1063
|
# If not defined here, it will return Rack's default: `application/octet-stream`
|
1012
1064
|
# Argument: symbol, it should be already known. defaults to `nil`
|
1013
1065
|
#
|
1014
|
-
|
1066
|
+
default_response_format :html
|
1015
1067
|
|
1016
1068
|
# Define a default charset to return in the `Content-Type` response header
|
1017
1069
|
# If not defined here, it returns `utf-8`
|
@@ -28,6 +28,10 @@ module Lotus
|
|
28
28
|
# @api private
|
29
29
|
COOKIE_STRING_KEY = 'rack.request.cookie_string'.freeze
|
30
30
|
|
31
|
+
# @since 0.4.5
|
32
|
+
# @api private
|
33
|
+
COOKIE_SEPARATOR = ';,'.freeze
|
34
|
+
|
31
35
|
# Initialize the CookieJar
|
32
36
|
#
|
33
37
|
# @param env [Hash] a raw Rack env
|
@@ -128,7 +132,7 @@ module Lotus
|
|
128
132
|
string = env[HTTP_HEADER]
|
129
133
|
|
130
134
|
return hash if string == env[COOKIE_STRING_KEY]
|
131
|
-
# TODO Next Rack 1.
|
135
|
+
# TODO Next Rack 1.7.x ?? version will have ::Rack::Utils.parse_cookies
|
132
136
|
# We can then replace the following lines.
|
133
137
|
hash.clear
|
134
138
|
|
@@ -137,7 +141,7 @@ module Lotus
|
|
137
141
|
# the Cookie header such that those with more specific Path attributes
|
138
142
|
# precede those with less specific. Ordering with respect to other
|
139
143
|
# attributes (e.g., Domain) is unspecified.
|
140
|
-
cookies = ::Rack::Utils.parse_query(string,
|
144
|
+
cookies = ::Rack::Utils.parse_query(string, COOKIE_SEPARATOR) { |s| ::Rack::Utils.unescape(s) rescue s }
|
141
145
|
cookies.each { |k,v| hash[k] = Array === v ? v.first : v }
|
142
146
|
env[COOKIE_STRING_KEY] = string
|
143
147
|
hash
|
data/lib/lotus/action/mime.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rack/utils'
|
2
2
|
require 'lotus/utils'
|
3
3
|
require 'lotus/utils/kernel'
|
4
|
+
require 'lotus/utils/deprecation'
|
4
5
|
|
5
6
|
module Lotus
|
6
7
|
module Action
|
@@ -169,7 +170,7 @@ module Lotus
|
|
169
170
|
# @since 0.1.0
|
170
171
|
#
|
171
172
|
# @see Lotus::Action::Mime#format=
|
172
|
-
# @see Lotus::Configuration#
|
173
|
+
# @see Lotus::Configuration#default_request_format
|
173
174
|
# @see Lotus::Action::Mime#default_content_type
|
174
175
|
# @see Lotus::Action::Mime#DEFAULT_CONTENT_TYPE
|
175
176
|
#
|
@@ -185,7 +186,7 @@ module Lotus
|
|
185
186
|
# end
|
186
187
|
# end
|
187
188
|
def content_type
|
188
|
-
@content_type || accepts || default_content_type || DEFAULT_CONTENT_TYPE
|
189
|
+
@content_type || default_response_type || accepts || default_content_type || DEFAULT_CONTENT_TYPE
|
189
190
|
end
|
190
191
|
|
191
192
|
# Action charset setter, receives new charset value
|
@@ -421,12 +422,18 @@ module Lotus
|
|
421
422
|
end
|
422
423
|
end
|
423
424
|
|
425
|
+
# @since 0.5.0
|
426
|
+
# @api private
|
427
|
+
def default_response_type
|
428
|
+
self.class.format_to_mime_type(configuration.default_response_format) if configuration.default_response_format
|
429
|
+
end
|
430
|
+
|
424
431
|
# @since 0.2.0
|
425
432
|
# @api private
|
426
433
|
def default_content_type
|
427
434
|
self.class.format_to_mime_type(
|
428
|
-
configuration.
|
429
|
-
) if configuration.
|
435
|
+
configuration.default_request_format
|
436
|
+
) if configuration.default_request_format
|
430
437
|
end
|
431
438
|
|
432
439
|
# @since 0.2.0
|
@@ -191,7 +191,16 @@ module Lotus
|
|
191
191
|
#
|
192
192
|
# @see Lotus::Controller::Configuration#handle_exception
|
193
193
|
def exception_handler(exception)
|
194
|
-
|
194
|
+
handler = nil
|
195
|
+
|
196
|
+
@handled_exceptions.each do |exception_class, h|
|
197
|
+
if exception.kind_of?(exception_class)
|
198
|
+
handler = h
|
199
|
+
break
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
handler || DEFAULT_ERROR_CODE
|
195
204
|
end
|
196
205
|
|
197
206
|
# Check if the given exception is handled.
|
@@ -409,35 +418,90 @@ module Lotus
|
|
409
418
|
# an argument, it will set the corresponding instance variable. When
|
410
419
|
# called without, it will return the already set value, or the default.
|
411
420
|
#
|
412
|
-
# @overload
|
421
|
+
# @overload default_request_format(format)
|
413
422
|
# Sets the given value
|
414
423
|
# @param format [#to_sym] the symbol format
|
415
424
|
# @raise [TypeError] if it cannot be coerced to a symbol
|
416
425
|
#
|
417
|
-
# @overload
|
426
|
+
# @overload default_request_format
|
418
427
|
# Gets the value
|
419
428
|
# @return [Symbol,nil]
|
420
429
|
#
|
421
|
-
# @since 0.
|
430
|
+
# @since 0.5.0
|
422
431
|
#
|
423
432
|
# @see Lotus::Action::Mime
|
424
433
|
#
|
425
434
|
# @example Getting the value
|
426
435
|
# require 'lotus/controller'
|
427
436
|
#
|
428
|
-
# Lotus::Controller.configuration.
|
437
|
+
# Lotus::Controller.configuration.default_request_format # => nil
|
429
438
|
#
|
430
439
|
# @example Setting the value
|
431
440
|
# require 'lotus/controller'
|
432
441
|
#
|
433
442
|
# Lotus::Controller.configure do
|
434
|
-
#
|
443
|
+
# default_request_format :html
|
435
444
|
# end
|
445
|
+
def default_request_format(format = nil)
|
446
|
+
if format
|
447
|
+
@default_request_format = Utils::Kernel.Symbol(format)
|
448
|
+
else
|
449
|
+
@default_request_format
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
# Set a format as default fallback for all the requests without a strict
|
454
|
+
# requirement for the mime type.
|
455
|
+
#
|
456
|
+
# @since 0.2.0
|
457
|
+
#
|
458
|
+
# @deprecated Use {#default_request_format} instead.
|
436
459
|
def default_format(format = nil)
|
460
|
+
Lotus::Utils::Deprecation.new('default_format is deprecated, please use default_request_format')
|
461
|
+
default_request_format(format)
|
462
|
+
end
|
463
|
+
|
464
|
+
# Set a format to be used for all responses regardless of the request type.
|
465
|
+
#
|
466
|
+
# The given format must be coercible to a symbol, and be a valid mime type
|
467
|
+
# alias. If it isn't, at the runtime the framework will raise a
|
468
|
+
# `Lotus::Controller::UnknownFormatError`.
|
469
|
+
#
|
470
|
+
# By default this value is nil.
|
471
|
+
#
|
472
|
+
# This is part of a DSL, for this reason when this method is called with
|
473
|
+
# an argument, it will set the corresponding instance variable. When
|
474
|
+
# called without, it will return the already set value, or the default.
|
475
|
+
#
|
476
|
+
# @overload default_response_format(format)
|
477
|
+
# Sets the given value
|
478
|
+
# @param format [#to_sym] the symbol format
|
479
|
+
# @raise [TypeError] if it cannot be coerced to a symbol
|
480
|
+
#
|
481
|
+
# @overload default_response_format
|
482
|
+
# Gets the value
|
483
|
+
# @return [Symbol,nil]
|
484
|
+
#
|
485
|
+
# @since 0.5.0
|
486
|
+
#
|
487
|
+
# @see Lotus::Action::Mime
|
488
|
+
#
|
489
|
+
# @example Getting the value
|
490
|
+
# require 'lotus/controller'
|
491
|
+
#
|
492
|
+
# Lotus::Controller.configuration.default_response_format # => nil
|
493
|
+
#
|
494
|
+
# @example Setting the value
|
495
|
+
# require 'lotus/controller'
|
496
|
+
#
|
497
|
+
# Lotus::Controller.configure do
|
498
|
+
# default_response_format :json
|
499
|
+
# end
|
500
|
+
def default_response_format(format = nil)
|
437
501
|
if format
|
438
|
-
@
|
502
|
+
@default_response_format = Utils::Kernel.Symbol(format)
|
439
503
|
else
|
440
|
-
@
|
504
|
+
@default_response_format
|
441
505
|
end
|
442
506
|
end
|
443
507
|
|
@@ -569,7 +633,8 @@ module Lotus
|
|
569
633
|
c.action_module = action_module
|
570
634
|
c.modules = modules.dup
|
571
635
|
c.formats = formats.dup
|
572
|
-
c.
|
636
|
+
c.default_request_format = default_request_format
|
637
|
+
c.default_response_format = default_response_format
|
573
638
|
c.default_charset = default_charset
|
574
639
|
c.default_headers = default_headers.dup
|
575
640
|
c.cookies = cookies.dup
|
@@ -591,15 +656,16 @@ module Lotus
|
|
591
656
|
# @since 0.2.0
|
592
657
|
# @api private
|
593
658
|
def reset!
|
594
|
-
@handle_exceptions
|
595
|
-
@handled_exceptions
|
596
|
-
@modules
|
597
|
-
@formats
|
598
|
-
@
|
599
|
-
@
|
600
|
-
@
|
601
|
-
@
|
602
|
-
@
|
659
|
+
@handle_exceptions = true
|
660
|
+
@handled_exceptions = {}
|
661
|
+
@modules = []
|
662
|
+
@formats = DEFAULT_FORMATS.dup
|
663
|
+
@default_request_format = nil
|
664
|
+
@default_response_format = nil
|
665
|
+
@default_charset = nil
|
666
|
+
@default_headers = {}
|
667
|
+
@cookies = {}
|
668
|
+
@action_module = ::Lotus::Action
|
603
669
|
end
|
604
670
|
|
605
671
|
# Copy the configuration for the given action
|
@@ -632,7 +698,8 @@ module Lotus
|
|
632
698
|
attr_accessor :formats
|
633
699
|
attr_writer :action_module
|
634
700
|
attr_writer :modules
|
635
|
-
attr_writer :
|
701
|
+
attr_writer :default_request_format
|
702
|
+
attr_writer :default_response_format
|
636
703
|
attr_writer :default_charset
|
637
704
|
attr_writer :default_headers
|
638
705
|
attr_writer :cookies
|
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', 'Trung Lê']
|
10
|
-
spec.email = ['me@lucaguidi.com', 'trung.le@ruby-journal.com']
|
9
|
+
spec.authors = ['Luca Guidi', 'Trung Lê', 'Alfonso Uceda']
|
10
|
+
spec.email = ['me@lucaguidi.com', 'trung.le@ruby-journal.com', 'uceda73@gmail.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'
|
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
spec.required_ruby_version = '>= 2.0.0'
|
21
21
|
|
22
|
-
spec.add_dependency 'rack', '~> 1.
|
22
|
+
spec.add_dependency 'rack', '~> 1.6', '>= 1.6.2'
|
23
23
|
spec.add_dependency 'lotus-utils', '~> 0.5'
|
24
|
-
spec.add_dependency 'lotus-validations', '~> 0.3'
|
24
|
+
spec.add_dependency 'lotus-validations', '~> 0.3', '>= 0.3.3'
|
25
25
|
|
26
26
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
27
27
|
spec.add_development_dependency 'minitest', '~> 5'
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lotus-controller
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
- Trung Lê
|
9
|
+
- Alfonso Uceda
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2015-
|
13
|
+
date: 2015-09-30 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: rack
|
@@ -17,14 +18,20 @@ dependencies:
|
|
17
18
|
requirements:
|
18
19
|
- - "~>"
|
19
20
|
- !ruby/object:Gem::Version
|
20
|
-
version: '1.
|
21
|
+
version: '1.6'
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.6.2
|
21
25
|
type: :runtime
|
22
26
|
prerelease: false
|
23
27
|
version_requirements: !ruby/object:Gem::Requirement
|
24
28
|
requirements:
|
25
29
|
- - "~>"
|
26
30
|
- !ruby/object:Gem::Version
|
27
|
-
version: '1.
|
31
|
+
version: '1.6'
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.6.2
|
28
35
|
- !ruby/object:Gem::Dependency
|
29
36
|
name: lotus-utils
|
30
37
|
requirement: !ruby/object:Gem::Requirement
|
@@ -46,6 +53,9 @@ dependencies:
|
|
46
53
|
- - "~>"
|
47
54
|
- !ruby/object:Gem::Version
|
48
55
|
version: '0.3'
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: 0.3.3
|
49
59
|
type: :runtime
|
50
60
|
prerelease: false
|
51
61
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -53,6 +63,9 @@ dependencies:
|
|
53
63
|
- - "~>"
|
54
64
|
- !ruby/object:Gem::Version
|
55
65
|
version: '0.3'
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.3.3
|
56
69
|
- !ruby/object:Gem::Dependency
|
57
70
|
name: bundler
|
58
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -113,6 +126,7 @@ description: Complete, fast and testable actions for Rack
|
|
113
126
|
email:
|
114
127
|
- me@lucaguidi.com
|
115
128
|
- trung.le@ruby-journal.com
|
129
|
+
- uceda73@gmail.com
|
116
130
|
executables: []
|
117
131
|
extensions: []
|
118
132
|
extra_rdoc_files: []
|
@@ -171,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
185
|
version: '0'
|
172
186
|
requirements: []
|
173
187
|
rubyforge_project:
|
174
|
-
rubygems_version: 2.4.
|
188
|
+
rubygems_version: 2.4.5.1
|
175
189
|
signing_key:
|
176
190
|
specification_version: 4
|
177
191
|
summary: Complete, fast and testable actions for Rack and Lotus
|