mime_actor 0.5.4 → 0.6.1
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 +4 -4
- data/.rubocop.yml +4 -0
- data/COMPARE.md +4 -4
- data/README.md +5 -5
- data/codecov.yml +18 -0
- data/lib/mime_actor/action.rb +6 -5
- data/lib/mime_actor/errors.rb +2 -2
- data/lib/mime_actor/rescue.rb +22 -44
- data/lib/mime_actor/scene.rb +88 -37
- data/lib/mime_actor/stage.rb +33 -12
- data/lib/mime_actor/validator.rb +19 -18
- data/lib/mime_actor/version.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5a67bb80dd83c069ea2f06a4afea5e241987d8b9a2a30f0a3eb0d01748b3759
|
4
|
+
data.tar.gz: acb0cd8b89e39ea3962c0949bff4666c96c36f6c15eae5a3709775daa5ef2516
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e64c6a62feb248b76672d75ef4cf9bc0f822b0f2fd57311f879874e910377b80549b133c85b148fd61d44d91259c780299770d7fae4792dbab094c01676df201
|
7
|
+
data.tar.gz: 2577dc3d03d3fa233ba136613e63d0c18a3e59f51bac690b582b18f424cc4ee7e5fee736eafc76393a94af20e3fcf930cd953b4eec07f21282fa9b5dd7be552d
|
data/.rubocop.yml
CHANGED
data/COMPARE.md
CHANGED
@@ -27,7 +27,7 @@ class EventsController < ActionController::Base
|
|
27
27
|
before_action only: :index { @events = Event.all }
|
28
28
|
|
29
29
|
# dynamically defines the action method according to on: argument
|
30
|
-
|
30
|
+
respond_act_to :html, :json, on: :index
|
31
31
|
|
32
32
|
def index_html
|
33
33
|
@event_categories = EventCategory.all
|
@@ -92,13 +92,13 @@ class EventsController < ActionController::Base
|
|
92
92
|
# AbstractController::Callbacks here to load model with params
|
93
93
|
before_action only: [:show, :update] { @event = Event.find(params.require(:event_id)) }
|
94
94
|
|
95
|
-
|
95
|
+
respond_act_to :html, :json, on: [:show, :update]
|
96
96
|
|
97
|
-
|
97
|
+
rescue_act_from ActiveRecord::RecordNotFound, format: :json do |ex|
|
98
98
|
render status: :bad_request, json: { error: ex.message }
|
99
99
|
end
|
100
100
|
|
101
|
-
|
101
|
+
rescue_act_from ActiveRecord::RecordNotFound, format: :html, action: :show do |ex|
|
102
102
|
redirect_to events_path
|
103
103
|
end
|
104
104
|
|
data/README.md
CHANGED
@@ -16,14 +16,14 @@ class EventsController < ActionController::Base
|
|
16
16
|
before_action only: :index { @events = Event.all }
|
17
17
|
before_action only: [:show, :update] { @event = Event.find(params.require(:event_id)) }
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
respond_act_to :html, :json, on: :index
|
20
|
+
respond_act_to :html, :json, on: [:show, :update]
|
21
21
|
|
22
|
-
|
22
|
+
rescue_act_from ActiveRecord::RecordNotFound, format: :json do |ex|
|
23
23
|
render status: :bad_request, json: { error: "Resouce not found" }
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
rescue_act_from ActiveRecord::RecordNotFound, format: :html, action: :show do |ex|
|
27
27
|
redirect_to events_path
|
28
28
|
end
|
29
29
|
|
@@ -99,7 +99,7 @@ Please see [LICENSE](https://github.com/ryancyq/mime_actor/blob/main/LICENSE) fo
|
|
99
99
|
|
100
100
|
## Contributing
|
101
101
|
|
102
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/ryancyq/mime_actor.
|
102
|
+
Bug reports and pull requests are welcome on GitHub at [https://github.com/ryancyq/mime_actor](https://github.com/ryancyq/mime_actor).
|
103
103
|
|
104
104
|
[rubygems_badge]: https://img.shields.io/gem/v/mime_actor.svg
|
105
105
|
[rubygems]: https://rubygems.org/gems/mime_actor
|
data/codecov.yml
ADDED
data/lib/mime_actor/action.rb
CHANGED
@@ -5,6 +5,7 @@ require "mime_actor/stage"
|
|
5
5
|
require "mime_actor/rescue"
|
6
6
|
|
7
7
|
require "active_support/concern"
|
8
|
+
require "active_support/core_ext/object/blank"
|
8
9
|
require "active_support/lazy_load_hooks"
|
9
10
|
require "abstract_controller/rendering"
|
10
11
|
require "action_controller/metal/mime_responds"
|
@@ -27,7 +28,7 @@ module MimeActor
|
|
27
28
|
include Rescue
|
28
29
|
include Logging
|
29
30
|
|
30
|
-
# The core logic where rendering logics are collected as `Proc`
|
31
|
+
# The core logic where rendering logics are collected as `Proc` and passed over to `ActionController::MimeResponds`
|
31
32
|
#
|
32
33
|
# @param action the `action` of the controller
|
33
34
|
#
|
@@ -44,17 +45,17 @@ module MimeActor
|
|
44
45
|
#
|
45
46
|
def start_scene(action)
|
46
47
|
action = action&.to_sym
|
47
|
-
formats = acting_scenes.fetch(action,
|
48
|
+
formats = acting_scenes.fetch(action, {})
|
48
49
|
|
49
50
|
if formats.empty?
|
50
|
-
logger.warn { "format is empty for action
|
51
|
+
logger.warn { "format is empty for action: #{action.inspect}" }
|
51
52
|
return
|
52
53
|
end
|
53
54
|
|
54
55
|
respond_to do |collector|
|
55
|
-
formats.each do |format|
|
56
|
+
formats.each do |format, actor|
|
56
57
|
dispatch = self.class.dispatch_cue(action: action, format: format, context: self) do
|
57
|
-
cue_actor("#{action}_#{format}")
|
58
|
+
cue_actor(actor.presence || "#{action}_#{format}")
|
58
59
|
end
|
59
60
|
collector.public_send(format, &dispatch)
|
60
61
|
end
|
data/lib/mime_actor/errors.rb
CHANGED
@@ -24,7 +24,7 @@ module MimeActor
|
|
24
24
|
|
25
25
|
class ActorNotFound < ActorError
|
26
26
|
def generate_message
|
27
|
-
"
|
27
|
+
"#{actor.inspect} not found"
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -39,7 +39,7 @@ module MimeActor
|
|
39
39
|
|
40
40
|
class ActionExisted < ActionError
|
41
41
|
def generate_message
|
42
|
-
"action
|
42
|
+
"action #{action.inspect} already existed"
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
data/lib/mime_actor/rescue.rb
CHANGED
@@ -8,6 +8,7 @@ require "mime_actor/validator"
|
|
8
8
|
require "active_support/concern"
|
9
9
|
require "active_support/core_ext/array/wrap"
|
10
10
|
require "active_support/core_ext/module/attribute_accessors"
|
11
|
+
require "active_support/core_ext/object/blank"
|
11
12
|
require "active_support/core_ext/string/inflections"
|
12
13
|
|
13
14
|
module MimeActor
|
@@ -16,7 +17,7 @@ module MimeActor
|
|
16
17
|
# Simillar to `ActionController::Rescue` but with additional filtering logic on `action`/`format`.
|
17
18
|
#
|
18
19
|
# @example Rescue RuntimeError when raised for any action with `json` format
|
19
|
-
#
|
20
|
+
# rescue_act_from RuntimeError, format: :json, with: :handle_json_error
|
20
21
|
#
|
21
22
|
module Rescue
|
22
23
|
extend ActiveSupport::Concern
|
@@ -34,49 +35,38 @@ module MimeActor
|
|
34
35
|
# @param klazzes the error classes to rescue
|
35
36
|
# @param action the `action` filter
|
36
37
|
# @param format the `format` filter
|
37
|
-
# @param with the rescue
|
38
|
+
# @param with the rescue handler when `block` is not provided
|
38
39
|
# @param block the `block` to evaluate when `with` is not provided
|
39
40
|
#
|
40
41
|
# @example Rescue StandardError when raised for any action with `html` format
|
41
|
-
#
|
42
|
+
# rescue_act_from StandardError, format: :html, with: :handle_html_error
|
42
43
|
#
|
43
44
|
# @example Rescue StandardError when raised for `show` action with `json` format
|
44
|
-
#
|
45
|
+
# rescue_act_from StandardError, format: :json, action: :show do |ex|
|
45
46
|
# render status: :bad_request, json: { error: ex.message }
|
46
47
|
# end
|
47
48
|
#
|
48
|
-
def
|
49
|
+
def rescue_act_from(*klazzes, action: nil, format: nil, with: nil, &block)
|
49
50
|
raise ArgumentError, "error filter is required" if klazzes.empty?
|
51
|
+
raise ArgumentError, "provide either the with: argument or a block" unless with.present? ^ block_given?
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
+
if block_given?
|
54
|
+
with = block
|
55
|
+
else
|
56
|
+
validate!(:with, with)
|
57
|
+
end
|
53
58
|
|
54
59
|
if action.present?
|
55
|
-
|
56
|
-
validate!(:actions, action)
|
57
|
-
else
|
58
|
-
validate!(:action, action)
|
59
|
-
end
|
60
|
+
action.is_a?(Enumerable) ? validate!(:actions, action) : validate!(:action, action)
|
60
61
|
end
|
61
62
|
|
62
63
|
if format.present?
|
63
|
-
|
64
|
-
validate!(:formats, format)
|
65
|
-
else
|
66
|
-
validate!(:format, format)
|
67
|
-
end
|
64
|
+
format.is_a?(Enumerable) ? validate!(:formats, format) : validate!(:format, format)
|
68
65
|
end
|
69
66
|
|
70
67
|
klazzes.each do |klazz|
|
71
|
-
|
72
|
-
|
73
|
-
klazz.name
|
74
|
-
when String
|
75
|
-
klazz
|
76
|
-
else
|
77
|
-
message = "#{klazz.inspect} must be a Class/Module or a String referencing a Class/Module"
|
78
|
-
raise ArgumentError, message
|
79
|
-
end
|
68
|
+
validate!(:klazz, klazz)
|
69
|
+
error = klazz.is_a?(Module) ? klazz.name : klazz
|
80
70
|
|
81
71
|
# append at the end because strategies are read in reverse.
|
82
72
|
actor_rescuers << [error, format, action, with]
|
@@ -111,26 +101,14 @@ module MimeActor
|
|
111
101
|
case rescuer = find_rescuer(error, format:, action:)
|
112
102
|
when Symbol
|
113
103
|
rescuer_method = context.method(rescuer)
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
when 1
|
118
|
-
->(e, _f, _a) { rescuer_method.call(e) }
|
119
|
-
when 2
|
120
|
-
->(e, f, _a) { rescuer_method.call(e, f) }
|
121
|
-
else
|
122
|
-
->(e, f, a) { rescuer_method.call(e, f, a) }
|
104
|
+
lambda do |*args|
|
105
|
+
passable_args = rescuer_method.arity.negative? ? args : args.take(rescuer_method.arity)
|
106
|
+
rescuer_method.call(*passable_args)
|
123
107
|
end
|
124
108
|
when Proc
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
when 1
|
129
|
-
->(e, _f, _a) { context.instance_exec(e, &rescuer) }
|
130
|
-
when 2
|
131
|
-
->(e, f, _a) { context.instance_exec(e, f, &rescuer) }
|
132
|
-
else
|
133
|
-
->(e, f, a) { context.instance_exec(e, f, a, &rescuer) }
|
109
|
+
lambda do |*args|
|
110
|
+
passable_args = rescuer.arity.negative? ? args : args.take(rescuer.arity)
|
111
|
+
context.instance_exec(*passable_args, &rescuer)
|
134
112
|
end
|
135
113
|
end
|
136
114
|
end
|
data/lib/mime_actor/scene.rb
CHANGED
@@ -9,6 +9,7 @@ require "active_support/concern"
|
|
9
9
|
require "active_support/core_ext/array/extract_options"
|
10
10
|
require "active_support/core_ext/array/wrap"
|
11
11
|
require "active_support/core_ext/module/attribute_accessors"
|
12
|
+
require "active_support/core_ext/object/blank"
|
12
13
|
|
13
14
|
module MimeActor
|
14
15
|
# # MimeActor Scene
|
@@ -16,9 +17,27 @@ module MimeActor
|
|
16
17
|
# Scene provides configuration for `action` + `format` definitions
|
17
18
|
#
|
18
19
|
# @example register a `html` format on action `index`
|
19
|
-
#
|
20
|
+
# respond_act_to :html, on: :index
|
21
|
+
#
|
22
|
+
# # this method should be defined in the class
|
23
|
+
# def index_html; end
|
20
24
|
# @example register `html`, `json` formats on actions `index`, `show`
|
21
|
-
#
|
25
|
+
# respond_act_to :html, :json , on: [:index, :show]
|
26
|
+
#
|
27
|
+
# # these methods should be defined in the class
|
28
|
+
# def index_html; end
|
29
|
+
# def index_json; end
|
30
|
+
# def show_html; end
|
31
|
+
# def show_json; end
|
32
|
+
# @example register a `html` format on action `index` with respond handler method
|
33
|
+
# respond_act_to :html, on: :index, with: :render_html
|
34
|
+
#
|
35
|
+
# # this method should be defined in the class
|
36
|
+
# def render_html; end
|
37
|
+
# @example register a `html` format on action `index` with respond handler proc
|
38
|
+
# respond_act_to :html, on: :index do
|
39
|
+
# render :index
|
40
|
+
# end
|
22
41
|
#
|
23
42
|
# NOTE: Calling the same `action`/`format` multiple times will overwrite previous `action` + `format` definitions.
|
24
43
|
#
|
@@ -34,54 +53,86 @@ module MimeActor
|
|
34
53
|
module ClassMethods
|
35
54
|
# Register `action` + `format` definitions.
|
36
55
|
#
|
37
|
-
# @param
|
38
|
-
# @
|
39
|
-
# @
|
56
|
+
# @param formats the collection of `format`
|
57
|
+
# @param on the collection of `action`
|
58
|
+
# @param with the respond handler when `block` is not provided
|
59
|
+
# @param block the `block` to evaluate when `with` is not provided
|
40
60
|
#
|
41
61
|
# @example register a `html` format on action `index`
|
42
|
-
#
|
62
|
+
# respond_act_to :html, on: :index
|
63
|
+
#
|
64
|
+
# # this method should be defined in the class
|
65
|
+
# def index_html; end
|
43
66
|
# @example register `html`, `json` formats on actions `index`, `show`
|
44
|
-
#
|
67
|
+
# respond_act_to :html, :json , on: [:index, :show]
|
68
|
+
#
|
69
|
+
# # these methods should be defined in the class
|
70
|
+
# def index_html; end
|
71
|
+
# def index_json; end
|
72
|
+
# def show_html; end
|
73
|
+
# def show_json; end
|
74
|
+
# @example register a `html` format on action `index` with respond handler method
|
75
|
+
# respond_act_to :html, on: :index, with: :render_html
|
76
|
+
#
|
77
|
+
# # this method should be defined in the class
|
78
|
+
# def render_html; end
|
79
|
+
# @example register a `html` format on action `index` with respond handler proc
|
80
|
+
# respond_act_to :html, on: :index do
|
81
|
+
# render :index
|
82
|
+
# end
|
45
83
|
#
|
46
84
|
# For each unique `action` being registered, it will have a corresponding `action` method being defined.
|
47
|
-
def
|
48
|
-
|
49
|
-
validate!(:formats, options)
|
85
|
+
def respond_act_to(*formats, on: nil, with: nil, &block)
|
86
|
+
validate!(:formats, formats)
|
50
87
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
88
|
+
raise ArgumentError, "provide either the with: argument or a block" if with.present? && block_given?
|
89
|
+
|
90
|
+
if block_given?
|
91
|
+
with = block
|
92
|
+
elsif with.present?
|
93
|
+
validate!(:with, with)
|
94
|
+
end
|
95
|
+
|
96
|
+
case actions = on
|
97
|
+
when Enumerable
|
55
98
|
validate!(:actions, actions)
|
56
|
-
|
99
|
+
when Symbol, String
|
57
100
|
validate!(:action, actions)
|
101
|
+
else
|
102
|
+
raise ArgumentError, "action is required"
|
58
103
|
end
|
59
104
|
|
60
|
-
|
61
|
-
|
62
|
-
action_defined = (instance_methods + private_instance_methods).include?(action.to_sym)
|
63
|
-
raise MimeActor::ActionExisted, action if !acting_scenes.key?(action) && action_defined
|
64
|
-
|
65
|
-
acting_scenes[action] ||= Set.new
|
66
|
-
acting_scenes[action] |= [format]
|
67
|
-
|
68
|
-
next if action_defined
|
69
|
-
|
70
|
-
class_eval(
|
71
|
-
# def index
|
72
|
-
# self.respond_to?(:start_scene) && self.start_scene(:index)
|
73
|
-
# end
|
74
|
-
<<-RUBY, __FILE__, __LINE__ + 1
|
75
|
-
def #{action}
|
76
|
-
self.respond_to?(:start_scene) && self.start_scene(:#{action})
|
77
|
-
end
|
78
|
-
RUBY
|
79
|
-
)
|
80
|
-
end
|
105
|
+
Array.wrap(actions).each do |action|
|
106
|
+
formats.each { |format| compose_scene(action, format, with) }
|
81
107
|
end
|
82
108
|
end
|
83
109
|
|
84
|
-
alias act_on_format
|
110
|
+
alias act_on_format respond_act_to
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def compose_scene(action, format, actor)
|
115
|
+
action_defined = (instance_methods + private_instance_methods).include?(action.to_sym)
|
116
|
+
raise MimeActor::ActionExisted, action if !acting_scenes.key?(action) && action_defined
|
117
|
+
|
118
|
+
acting_scenes[action] ||= {}
|
119
|
+
acting_scenes[action][format] = actor
|
120
|
+
|
121
|
+
define_scene(action) unless action_defined
|
122
|
+
end
|
123
|
+
|
124
|
+
def define_scene(action)
|
125
|
+
class_eval(
|
126
|
+
# def index
|
127
|
+
# self.respond_to?(:start_scene) && self.start_scene(:index)
|
128
|
+
# end
|
129
|
+
<<-RUBY, __FILE__, __LINE__ + 1
|
130
|
+
def #{action}
|
131
|
+
self.respond_to?(:start_scene) && self.start_scene(:#{action})
|
132
|
+
end
|
133
|
+
RUBY
|
134
|
+
)
|
135
|
+
end
|
85
136
|
end
|
86
137
|
end
|
87
138
|
end
|
data/lib/mime_actor/stage.rb
CHANGED
@@ -37,7 +37,8 @@ module MimeActor
|
|
37
37
|
found
|
38
38
|
end
|
39
39
|
|
40
|
-
# Wraps the given `block` with a `lambda`, rescue any error raised from the `block
|
40
|
+
# Wraps the given `block` with a `lambda`, rescue any error raised from the `block`.
|
41
|
+
# Otherwise, error will be re-raised.
|
41
42
|
#
|
42
43
|
# @param action the `action` to be passed on to `rescue_actor`
|
43
44
|
# @param format the `format` to be passed on to `rescue_actor`
|
@@ -62,25 +63,45 @@ module MimeActor
|
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
65
|
-
# Calls the `actor`
|
66
|
-
#
|
66
|
+
# Calls the `actor` and passing arguments to it.
|
67
67
|
# If a block is given, the result from the `actor` method will be yieled to the block.
|
68
68
|
#
|
69
|
-
#
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
69
|
+
# NOTE: method call on actor if it is String or Symbol. Proc#call if actor is Proc
|
70
|
+
#
|
71
|
+
# @param actor either a method name or a block to evaluate
|
72
|
+
def cue_actor(actor, *args)
|
73
|
+
result = case actor
|
74
|
+
when String, Symbol
|
75
|
+
actor_method_call(actor, *args)
|
76
|
+
when Proc
|
77
|
+
actor_proc_call(actor, *args)
|
78
|
+
else
|
79
|
+
raise TypeError, "invalid actor, got: #{actor.inspect}"
|
80
|
+
end
|
77
81
|
|
78
|
-
result = public_send(actor_name, *args)
|
79
82
|
if block_given?
|
80
83
|
yield result
|
81
84
|
else
|
82
85
|
result
|
83
86
|
end
|
84
87
|
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def actor_method_call(actor_method, *args)
|
92
|
+
unless self.class.actor?(actor_method)
|
93
|
+
raise MimeActor::ActorNotFound, actor_method if raise_on_missing_actor
|
94
|
+
|
95
|
+
logger.warn { "actor #{actor_method.inspect} not found" }
|
96
|
+
return
|
97
|
+
end
|
98
|
+
|
99
|
+
public_send(actor_method, *args)
|
100
|
+
end
|
101
|
+
|
102
|
+
def actor_proc_call(actor_proc, *args)
|
103
|
+
passable_args = actor_proc.arity.negative? ? args : args.take(actor_proc.arity)
|
104
|
+
instance_exec(*passable_args, &actor_proc)
|
105
|
+
end
|
85
106
|
end
|
86
107
|
end
|
data/lib/mime_actor/validator.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
# :markup: markdown
|
4
4
|
|
5
5
|
require "active_support/concern"
|
6
|
+
require "active_support/core_ext/object/blank"
|
6
7
|
require "set" # required by mime_type with ruby <= 3.1
|
7
8
|
require "action_dispatch/http/mime_type"
|
8
9
|
|
@@ -31,7 +32,7 @@ module MimeActor
|
|
31
32
|
# @param rule the name of validator
|
32
33
|
def validate!(rule, *args)
|
33
34
|
validator = "validate_#{rule}"
|
34
|
-
raise NameError, "Validator not found, got: #{validator}" unless respond_to?(validator, true)
|
35
|
+
raise NameError, "Validator not found, got: #{validator.inspect}" unless respond_to?(validator, true)
|
35
36
|
|
36
37
|
error = send(validator, *args)
|
37
38
|
raise error if error
|
@@ -41,7 +42,7 @@ module MimeActor
|
|
41
42
|
#
|
42
43
|
# @param unchecked the `action` to be validated
|
43
44
|
def validate_action(unchecked)
|
44
|
-
|
45
|
+
TypeError.new("action must be a Symbol") unless unchecked.is_a?(Symbol)
|
45
46
|
end
|
46
47
|
|
47
48
|
# Validate `actions` must be a collection of Symbol
|
@@ -49,16 +50,16 @@ module MimeActor
|
|
49
50
|
# @param unchecked the `actions` to be validated
|
50
51
|
def validate_actions(unchecked)
|
51
52
|
rejected = unchecked.reject { |action| action.is_a?(Symbol) }
|
52
|
-
NameError.new("invalid actions, got: #{rejected.join(", ")}") if rejected.size.positive?
|
53
|
+
NameError.new("invalid actions, got: #{rejected.map(&:inspect).join(", ")}") if rejected.size.positive?
|
53
54
|
end
|
54
55
|
|
55
56
|
# Validate `format` must be a Symbol and a valid MIME type
|
56
57
|
#
|
57
58
|
# @param unchecked the `format` to be validated
|
58
59
|
def validate_format(unchecked)
|
59
|
-
return
|
60
|
+
return TypeError.new("format must be a Symbol") unless unchecked.is_a?(Symbol)
|
60
61
|
|
61
|
-
NameError.new("invalid format, got: #{unchecked}") unless scene_formats.include?(unchecked)
|
62
|
+
NameError.new("invalid format, got: #{unchecked.inspect}") unless scene_formats.include?(unchecked)
|
62
63
|
end
|
63
64
|
|
64
65
|
# Validate `formats` must be an collection of Symbol which each of them is a valid MIME type
|
@@ -69,25 +70,25 @@ module MimeActor
|
|
69
70
|
filtered = unfiltered & scene_formats
|
70
71
|
rejected = unfiltered - filtered
|
71
72
|
|
72
|
-
NameError.new("invalid formats, got: #{rejected.join(", ")}") if rejected.size.positive?
|
73
|
+
NameError.new("invalid formats, got: #{rejected.map(&:inspect).join(", ")}") if rejected.size.positive?
|
73
74
|
end
|
74
75
|
|
75
|
-
# Validate `
|
76
|
+
# Validate `klazz` must be a Class/Module or a String referencing a Class/Module
|
77
|
+
#
|
78
|
+
# @param unchecked the `klazz` to be validated
|
79
|
+
def validate_klazz(unchecked)
|
80
|
+
return if unchecked.is_a?(Module) || unchecked.is_a?(String)
|
81
|
+
|
82
|
+
TypeError.new("#{unchecked.inspect} must be a Class/Module or a String referencing a Class/Module")
|
83
|
+
end
|
84
|
+
|
85
|
+
# Validate `with` must be a Symbol or Proc
|
76
86
|
#
|
77
87
|
# @param unchecked the `with` to be validated
|
78
|
-
|
79
|
-
def validate_with(unchecked, block)
|
80
|
-
if unchecked.present? && block.present?
|
81
|
-
return ArgumentError.new("provide either the with: keyword argument or a block")
|
82
|
-
end
|
83
|
-
unless unchecked.present? || block.present?
|
84
|
-
return ArgumentError.new("provide the with: keyword argument or a block")
|
85
|
-
end
|
86
|
-
|
87
|
-
return if block.present?
|
88
|
+
def validate_with(unchecked)
|
88
89
|
return if unchecked.is_a?(Proc) || unchecked.is_a?(Symbol)
|
89
90
|
|
90
|
-
|
91
|
+
TypeError.new("with handler must be a Symbol or Proc, got: #{unchecked.inspect}")
|
91
92
|
end
|
92
93
|
end
|
93
94
|
end
|
data/lib/mime_actor/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mime_actor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Chang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-07-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -68,6 +68,7 @@ files:
|
|
68
68
|
- LICENSE
|
69
69
|
- README.md
|
70
70
|
- Rakefile
|
71
|
+
- codecov.yml
|
71
72
|
- lib/mime_actor.rb
|
72
73
|
- lib/mime_actor/action.rb
|
73
74
|
- lib/mime_actor/errors.rb
|