lotus-controller 0.4.6 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cac7b8bf14852940993b526910f912f4c8a84398
4
- data.tar.gz: 0d1987258f25f24b2e3b797441e557d76e704184
3
+ metadata.gz: b2ff1fea9be3ce5d7e3cb2fd0555efbf3928d0f7
4
+ data.tar.gz: a7eac7e0477f45078bf77172a9c179aa712be57a
5
5
  SHA512:
6
- metadata.gz: 17ef726ad1e57674ef8215aa9cb1aa4277f8ef29518d89e893f66dc8a631e7f9387f118f77d6dcacfdbc8ff8595e46798455ef6d2175ca12a6a365b33396b2e5
7
- data.tar.gz: 4acdfbe61468ee74824894b1c060b8068a612c619acfab62c283284214e17c694a43c3c940ae46d3c17548ffbc2c98d48740a04b6396f1407467afc37ff7c2c7
6
+ metadata.gz: eaab2895b510bedd269fc9bb9147c50af9e742b7a99041a22bb35a767e9bd195955f377ecd8ba2e0c7452ae4776e7aba213d8f3bbfa230f8af21361658869632
7
+ data.tar.gz: b25f2829ca7b31440d2e768231d9ba2c5a88a85aa09c71ffe44cadcff7c396d35cab2a7387b0a04db4aacf62bcb6a9be9a4f36759f3ca47f577c3447df695a9a
data/CHANGELOG.md CHANGED
@@ -1,9 +1,22 @@
1
1
  # Lotus::Controller
2
2
  Complete, fast and testable actions for Rack
3
3
 
4
+ ## v0.5.0 - 2016-01-12
5
+ ### Added
6
+ - [Luca Guidi] Reference a raised exception in Rack env's `rack.exception`. Compatibility with exception reporting SaaS.
7
+
8
+ ### Fixed
9
+ - [Cainã Costa] Ensure Rack environment to be always available for sessions unit tests
10
+ - [Luca Guidi] Ensure superclass exceptions to not shadow subclasses during exception handling (eg. `CustomError` handler will take precedence over `StandardError`)
11
+
12
+ ### Changed
13
+ - [Luca Guidi] Removed `Lotus::Controller::Configuration#default_format`
14
+ - [Cainã Costa] Made `Lotus::Action#session` a public method for improved unit testing
15
+ - [Karim Tarek] Introduced `Lotus::Controller::Error` and let all the framework exceptions to inherit from it.
16
+
4
17
  ## v0.4.6 - 2015-12-04
5
18
  ### Added
6
- - [Luca Guidi] Allow to force custom headers for responses that shouldn't include them (eg 204). Override `#keep_response_header?(header)` in action
19
+ - [Luca Guidi] Allow to force custom headers for responses that according to RFC shouldn't include them (eg 204). Override `#keep_response_header?(header)` in action
7
20
 
8
21
  ## v0.4.5 - 2015-09-30
9
22
  ### Added
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright © 2014-2015 Luca Guidi
1
+ Copyright © 2014-2016 Luca Guidi
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -921,6 +921,37 @@ action.call({ 'HTTP_ACCEPT' => '*/*' }) # => Content-Type 'application/custom'
921
921
  action.format # => :custom
922
922
  ```
923
923
 
924
+ ### Streamed Responses
925
+
926
+ When the work to be done by the server takes time, it may be a good idea to stream your response. Here's an example of a streamed CSV.
927
+
928
+ ```ruby
929
+ Lotus::Controller.configure do
930
+ format csv: 'text/csv'
931
+ middleware.use ::Rack::Chunked
932
+ end
933
+
934
+ class Csv
935
+ include Lotus::Action
936
+
937
+ def call(params)
938
+ self.format = :csv
939
+ self.body = Enumerator.new do |yielder|
940
+ yielder << csv_header
941
+
942
+ # Expensive operation is streamed as each line becomes available
943
+ csv_body.each_line do |line|
944
+ yielder << line
945
+ end
946
+ end
947
+ end
948
+ end
949
+ ```
950
+
951
+ Note:
952
+ * In development, Lotus' code reloading needs to be disabled for streaming to work. This is because `Shotgun` interferes with the streaming action. You can disable it like this `lotus server --code-reloading=false`
953
+ * Streaming does not work with WEBrick as it buffers its response. We recommend using `puma`, though you may find success with other servers
954
+
924
955
  ### No rendering, please
925
956
 
926
957
  Lotus::Controller is designed to be a pure HTTP endpoint, rendering belongs to other layers of MVC.
@@ -1131,7 +1162,9 @@ Articles::Create.new.call({})
1131
1162
  ### Thread safety
1132
1163
 
1133
1164
  An Action is **mutable**. When used without Lotus::Router, be sure to instantiate an
1134
- action for each request.
1165
+ action for each request. The same advice applies when using
1166
+ Lotus::Router but NOT routing to `mycontroller#myaction` but instead
1167
+ routing direct to a class.
1135
1168
 
1136
1169
  ```ruby
1137
1170
  # config.ru
@@ -1169,4 +1202,4 @@ __Lotus::Controller__ uses [Semantic Versioning 2.0.0](http://semver.org)
1169
1202
 
1170
1203
  ## Copyright
1171
1204
 
1172
- Copyright © 2014-2015 Luca Guidi – Released under MIT License
1205
+ Copyright © 2014-2016 Luca Guidi – Released under MIT License
@@ -77,7 +77,7 @@ module Lotus
77
77
  # It returns a <tt>204</tt> but still wants to specify the rate limit
78
78
  # quota via <tt>X-Rate-Limit</tt>.
79
79
  #
80
- # @since x.x.x
80
+ # @since 0.5.0
81
81
  # @api public
82
82
  #
83
83
  # @see Lotus::Action::HEAD#finish
@@ -473,12 +473,17 @@ module Lotus
473
473
  [match, quality]
474
474
  end.compact
475
475
 
476
- # See https://github.com/lotus/controller/issues/59
477
- # See https://github.com/lotus/controller/issues/104
478
- values = values.reverse unless Lotus::Utils.jruby?
476
+ if Lotus::Utils.jruby?
477
+ # See https://github.com/lotus/controller/issues/59
478
+ # See https://github.com/lotus/controller/issues/104
479
+ values.reverse!
480
+ else
481
+ # See https://github.com/jruby/jruby/issues/3004
482
+ values.sort!
483
+ end
479
484
 
480
- value = values.sort_by do |match, quality|
481
- (match.split('/', 2).count('*') * -10) + quality
485
+ value = values.sort_by do |match, quality|
486
+ (match.split('/'.freeze, 2).count('*'.freeze) * -10) + quality
482
487
  end.last
483
488
 
484
489
  value.first if value
@@ -30,8 +30,6 @@ module Lotus
30
30
  end
31
31
  end
32
32
 
33
- protected
34
-
35
33
  # Gets the session from the request and expose it as an Hash.
36
34
  #
37
35
  # @return [Hash] the HTTP session from the request
@@ -15,6 +15,19 @@ module Lotus
15
15
  # @api private
16
16
  RACK_ERRORS = 'rack.errors'.freeze
17
17
 
18
+ # This isn't part of Rack SPEC
19
+ #
20
+ # Exception notifiers use <tt>rack.exception</tt> instead of
21
+ # <tt>rack.errors</tt>, so we need to support it.
22
+ #
23
+ # @since 0.5.0
24
+ # @api private
25
+ #
26
+ # @see Lotus::Action::Throwable::RACK_ERRORS
27
+ # @see http://www.rubydoc.info/github/rack/rack/file/SPEC#The_Error_Stream
28
+ # @see https://github.com/lotus/controller/issues/133
29
+ RACK_EXCEPTION = 'rack.exception'.freeze
30
+
18
31
  def self.included(base)
19
32
  base.extend ClassMethods
20
33
  end
@@ -140,6 +153,8 @@ module Lotus
140
153
  def _reference_in_rack_errors(exception)
141
154
  return if configuration.handled_exception?(exception)
142
155
 
156
+ @_env[RACK_EXCEPTION] = exception
157
+
143
158
  if errors = @_env[RACK_ERRORS]
144
159
  errors.write(_dump_exception(exception))
145
160
  errors.flush
@@ -2,6 +2,7 @@ require 'lotus/utils/class_attribute'
2
2
  require 'lotus/action'
3
3
  require 'lotus/controller/configuration'
4
4
  require 'lotus/controller/version'
5
+ require 'lotus/controller/error'
5
6
 
6
7
  module Lotus
7
8
  # A set of logically grouped actions
@@ -35,7 +36,7 @@ module Lotus
35
36
  # @since 0.2.0
36
37
  #
37
38
  # @see Lotus::Action::Mime#format=
38
- class UnknownFormatError < ::StandardError
39
+ class UnknownFormatError < Lotus::Controller::Error
39
40
  def initialize(format)
40
41
  super("Cannot find a corresponding Mime type for '#{ format }'. Please configure it with Lotus::Controller::Configuration#format.")
41
42
  end
@@ -180,6 +180,7 @@ module Lotus
180
180
  # end
181
181
  def handle_exception(exception)
182
182
  @handled_exceptions.merge!(exception)
183
+ _sort_handled_exceptions!
183
184
  end
184
185
 
185
186
  # Return a callable handler for the given exception
@@ -450,17 +451,6 @@ module Lotus
450
451
  end
451
452
  end
452
453
 
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.
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
454
  # Set a format to be used for all responses regardless of the request type.
465
455
  #
466
456
  # The given format must be coercible to a symbol, and be a valid mime type
@@ -693,6 +683,13 @@ module Lotus
693
683
  end
694
684
 
695
685
  protected
686
+ # @since 0.5.0
687
+ # @api private
688
+ def _sort_handled_exceptions!
689
+ @handled_exceptions = Hash[
690
+ @handled_exceptions.sort{|(ex1,_),(ex2,_)| ex1.ancestors.include?(ex2) ? -1 : 1 }
691
+ ]
692
+ end
696
693
 
697
694
  attr_accessor :handled_exceptions
698
695
  attr_accessor :formats
@@ -0,0 +1,7 @@
1
+ module Lotus
2
+ module Controller
3
+ # @since 0.5.0
4
+ class Error < ::StandardError
5
+ end
6
+ end
7
+ end
@@ -3,6 +3,6 @@ module Lotus
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '0.4.6'.freeze
6
+ VERSION = '0.5.0'.freeze
7
7
  end
8
8
  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.6', '>= 1.6.2'
23
- spec.add_dependency 'lotus-utils', '~> 0.5'
24
- spec.add_dependency 'lotus-validations', '~> 0.3', '>= 0.3.3'
23
+ spec.add_dependency 'lotus-utils', '~> 0.6'
24
+ spec.add_dependency 'lotus-validations', '~> 0.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.4.6
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-12-04 00:00:00.000000000 Z
13
+ date: 2016-01-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -38,34 +38,28 @@ dependencies:
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '0.5'
41
+ version: '0.6'
42
42
  type: :runtime
43
43
  prerelease: false
44
44
  version_requirements: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0.5'
48
+ version: '0.6'
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: lotus-validations
51
51
  requirement: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '0.3'
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- version: 0.3.3
55
+ version: '0.4'
59
56
  type: :runtime
60
57
  prerelease: false
61
58
  version_requirements: !ruby/object:Gem::Requirement
62
59
  requirements:
63
60
  - - "~>"
64
61
  - !ruby/object:Gem::Version
65
- version: '0.3'
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: 0.3.3
62
+ version: '0.4'
69
63
  - !ruby/object:Gem::Dependency
70
64
  name: bundler
71
65
  requirement: !ruby/object:Gem::Requirement
@@ -162,6 +156,7 @@ files:
162
156
  - lib/lotus/action/validatable.rb
163
157
  - lib/lotus/controller.rb
164
158
  - lib/lotus/controller/configuration.rb
159
+ - lib/lotus/controller/error.rb
165
160
  - lib/lotus/controller/version.rb
166
161
  - lib/lotus/http/status.rb
167
162
  - lotus-controller.gemspec
@@ -185,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
180
  version: '0'
186
181
  requirements: []
187
182
  rubyforge_project:
188
- rubygems_version: 2.4.5.1
183
+ rubygems_version: 2.5.1
189
184
  signing_key:
190
185
  specification_version: 4
191
186
  summary: Complete, fast and testable actions for Rack and Lotus