mime_actor 0.2.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 +4 -4
- data/.rubocop.yml +31 -1
- data/Rakefile +1 -1
- data/lib/mime_actor/act.rb +15 -34
- data/lib/mime_actor/errors.rb +5 -7
- data/lib/mime_actor/rescue.rb +23 -22
- data/lib/mime_actor/scene.rb +18 -15
- data/lib/mime_actor/stage.rb +55 -0
- data/lib/mime_actor/version.rb +2 -2
- data/lib/mime_actor.rb +4 -3
- metadata +10 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b52e3908f3269eb87dbe77d561e9bdb9067446b142e526ea8198fbe6481f29c4
|
4
|
+
data.tar.gz: 5d89ea4e185dfefcbbc1576a63967d1d0403f2dbcc39fe20277ee5a3194d9f33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23e504b9e30c8584bf7e7d65d4e6e4033bb92ad2930743e1dc6c91e2bb92226c318ba25a964d4f37cb8c7c356c2766ce5f9215909f6118d10d71b65d13288854
|
7
|
+
data.tar.gz: e4b8a9071b709ab56ac88f9b1605a1868be2952096517922388186a03ccdfe7ac8aba36b1d114e8a09a66cdc23e89bd6bea8a0adba3b600234ffdc758c9aa038
|
data/.rubocop.yml
CHANGED
@@ -1,8 +1,38 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rake
|
3
|
+
- rubocop-rspec
|
4
|
+
|
1
5
|
AllCops:
|
2
|
-
TargetRubyVersion: 3.
|
6
|
+
TargetRubyVersion: 3.1
|
7
|
+
NewCops: enable
|
8
|
+
Exclude:
|
9
|
+
- bin/*
|
10
|
+
|
11
|
+
Style/Documentation:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Style/BlockComments:
|
15
|
+
Exclude:
|
16
|
+
- spec/*_helper.rb
|
3
17
|
|
4
18
|
Style/StringLiterals:
|
5
19
|
EnforcedStyle: double_quotes
|
6
20
|
|
7
21
|
Style/StringLiteralsInInterpolation:
|
8
22
|
EnforcedStyle: double_quotes
|
23
|
+
|
24
|
+
Style/HashSyntax:
|
25
|
+
EnforcedShorthandSyntax: consistent
|
26
|
+
|
27
|
+
Layout/FirstHashElementIndentation:
|
28
|
+
EnforcedStyle: consistent
|
29
|
+
|
30
|
+
Layout/HashAlignment:
|
31
|
+
EnforcedHashRocketStyle: table
|
32
|
+
EnforcedColonStyle: table
|
33
|
+
|
34
|
+
RSpec/MultipleExpectations:
|
35
|
+
Enabled: false
|
36
|
+
|
37
|
+
RSpec/ExampleLength:
|
38
|
+
Enabled: false
|
data/Rakefile
CHANGED
data/lib/mime_actor/act.rb
CHANGED
@@ -1,32 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require "
|
6
|
-
|
7
|
-
require
|
8
|
-
require
|
3
|
+
require "mime_actor/scene"
|
4
|
+
require "mime_actor/stage"
|
5
|
+
require "mime_actor/rescue"
|
6
|
+
|
7
|
+
require "active_support/concern"
|
8
|
+
require "abstract_controller/rendering"
|
9
|
+
require "action_controller/metal/mime_responds"
|
9
10
|
|
10
11
|
module MimeActor
|
11
12
|
module Act
|
12
13
|
extend ActiveSupport::Concern
|
13
|
-
|
14
|
-
include AbstractController::Logger
|
14
|
+
|
15
15
|
include AbstractController::Rendering # required by MimeResponds
|
16
16
|
include ActionController::MimeResponds
|
17
17
|
include Scene
|
18
|
+
include Stage
|
18
19
|
include Rescue
|
19
20
|
|
20
|
-
included do
|
21
|
-
mattr_accessor :raise_on_missing_actor, instance_writer: false, default: false
|
22
|
-
end
|
23
|
-
|
24
21
|
module ClassMethods
|
25
22
|
def dispatch_act(action: nil, format: nil, context: self, &block)
|
26
23
|
lambda do
|
27
24
|
context.instance_exec(&block)
|
28
|
-
rescue
|
29
|
-
respond_to?(:rescue_actor) &&
|
25
|
+
rescue StandardError => e
|
26
|
+
(respond_to?(:rescue_actor) && rescue_actor(e, action:, format:, context:)) || raise
|
30
27
|
end
|
31
28
|
end
|
32
29
|
end
|
@@ -40,11 +37,11 @@ module MimeActor
|
|
40
37
|
mime_types = acting_scenes.fetch(action, Set.new)
|
41
38
|
respond_to do |collector|
|
42
39
|
mime_types.each do |mime_type|
|
43
|
-
next unless actor = find_actor(action
|
40
|
+
next unless (actor = find_actor("#{action}_#{mime_type}"))
|
44
41
|
|
45
42
|
dispatch = self.class.dispatch_act(
|
46
|
-
action:
|
47
|
-
format:
|
43
|
+
action: action,
|
44
|
+
format: mime_type,
|
48
45
|
context: self,
|
49
46
|
&actor
|
50
47
|
)
|
@@ -52,21 +49,5 @@ module MimeActor
|
|
52
49
|
end
|
53
50
|
end
|
54
51
|
end
|
55
|
-
|
56
|
-
def find_actor(action, mime_type)
|
57
|
-
actor_name = "#{action}_#{mime_type}"
|
58
|
-
|
59
|
-
if respond_to?(:action_methods) && public_send(:action_methods).include?(actor_name)
|
60
|
-
return self.method(actor_name)
|
61
|
-
end
|
62
|
-
|
63
|
-
error = MimeActor::ActorNotFound.new(action, mime_type)
|
64
|
-
unless self.raise_on_missing_actor
|
65
|
-
logger.warn { "Actor not found: #{error.inspect}" }
|
66
|
-
return
|
67
|
-
end
|
68
|
-
|
69
|
-
raise error
|
70
|
-
end
|
71
52
|
end
|
72
|
-
end
|
53
|
+
end
|
data/lib/mime_actor/errors.rb
CHANGED
@@ -5,18 +5,16 @@ module MimeActor
|
|
5
5
|
end
|
6
6
|
|
7
7
|
class ActorNotFound < Error
|
8
|
-
attr_reader :actor
|
8
|
+
attr_reader :actor
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
12
|
-
@format = format
|
13
|
-
@actor = "#{action}_#{format}"
|
10
|
+
def initialize(actor)
|
11
|
+
@actor = actor
|
14
12
|
|
15
13
|
super(":#{actor} not found")
|
16
14
|
end
|
17
15
|
|
18
16
|
def inspect
|
19
|
-
"<#{self.class.name}>
|
17
|
+
"<#{self.class.name}> #{message}"
|
20
18
|
end
|
21
19
|
end
|
22
|
-
end
|
20
|
+
end
|
data/lib/mime_actor/rescue.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "active_support/concern"
|
4
4
|
require "active_support/core_ext/array/wrap"
|
5
5
|
require "active_support/core_ext/module/attribute_accessors"
|
6
6
|
require "active_support/core_ext/object/blank"
|
@@ -32,7 +32,7 @@ module MimeActor
|
|
32
32
|
unfiltered = format.to_set
|
33
33
|
filtered = unfiltered & Mime::SET.symbols.to_set
|
34
34
|
rejected = unfiltered - filtered
|
35
|
-
raise ArgumentError, "Unsupported formats: #{rejected.join(
|
35
|
+
raise ArgumentError, "Unsupported formats: #{rejected.join(", ")}" if rejected.size.positive?
|
36
36
|
else
|
37
37
|
raise ArgumentError, "Format filter can only be Symbol/Enumerable"
|
38
38
|
end
|
@@ -44,25 +44,26 @@ module MimeActor
|
|
44
44
|
|
45
45
|
klazzes.each do |klazz|
|
46
46
|
error = if klazz.is_a?(Module)
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
klazz.name
|
48
|
+
elsif klazz.is_a?(String)
|
49
|
+
klazz
|
50
|
+
else
|
51
|
+
raise ArgumentError,
|
52
|
+
"#{klazz.inspect} must be a class/module or a String referencing a class/module"
|
53
|
+
end
|
53
54
|
|
54
55
|
# append at the end because strategies are read in reverse.
|
55
|
-
|
56
|
+
actor_rescuers << [error, format, action, with]
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
59
60
|
def rescue_actor(error, action: nil, format: nil, context: self, visited: [])
|
60
61
|
visited << error
|
61
62
|
|
62
|
-
if rescuer = dispatch_rescuer(error, format:, action:, context:)
|
63
|
+
if (rescuer = dispatch_rescuer(error, format:, action:, context:))
|
63
64
|
rescuer.call(error, format, action)
|
64
65
|
error
|
65
|
-
elsif error
|
66
|
+
elsif error&.cause && !visited.include?(error.cause)
|
66
67
|
rescue_actor(error.cause, format:, action:, context:, visited:)
|
67
68
|
end
|
68
69
|
end
|
@@ -75,24 +76,24 @@ module MimeActor
|
|
75
76
|
rescuer_method = context.method(rescuer)
|
76
77
|
case rescuer_method.arity
|
77
78
|
when 0
|
78
|
-
->
|
79
|
+
->(_e, _f, _a) { rescuer_method.call }
|
79
80
|
when 1
|
80
|
-
->
|
81
|
+
->(e, _f, _a) { rescuer_method.call(e) }
|
81
82
|
when 2
|
82
|
-
->
|
83
|
+
->(e, f, _a) { rescuer_method.call(e, f) }
|
83
84
|
else
|
84
|
-
->
|
85
|
+
->(e, f, a) { rescuer_method.call(e, f, a) }
|
85
86
|
end
|
86
87
|
when Proc
|
87
88
|
case rescuer.arity
|
88
89
|
when 0
|
89
|
-
->
|
90
|
+
->(_e, _f, _a) { context.instance_exec(&rescuer) }
|
90
91
|
when 1
|
91
|
-
->
|
92
|
+
->(e, _f, _a) { context.instance_exec(e, &rescuer) }
|
92
93
|
when 2
|
93
|
-
->
|
94
|
+
->(e, f, _a) { context.instance_exec(e, f, &rescuer) }
|
94
95
|
else
|
95
|
-
->
|
96
|
+
->(e, f, a) { context.instance_exec(e, f, a, &rescuer) }
|
96
97
|
end
|
97
98
|
end
|
98
99
|
end
|
@@ -103,9 +104,9 @@ module MimeActor
|
|
103
104
|
*_, rescuer = actor_rescuers.reverse_each.detect do |rescuee, format_filter, action_filter|
|
104
105
|
next if action_filter.present? && !Array.wrap(action_filter).include?(action)
|
105
106
|
next if format_filter.present? && !Array.wrap(format_filter).include?(format)
|
106
|
-
next unless klazz = constantize_rescuee(rescuee)
|
107
|
+
next unless (klazz = constantize_rescuee(rescuee))
|
107
108
|
|
108
|
-
|
109
|
+
error.is_a?(klazz)
|
109
110
|
end
|
110
111
|
rescuer
|
111
112
|
end
|
@@ -124,4 +125,4 @@ module MimeActor
|
|
124
125
|
end
|
125
126
|
end
|
126
127
|
end
|
127
|
-
end
|
128
|
+
end
|
data/lib/mime_actor/scene.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "mime_actor/stage"
|
4
|
+
|
5
|
+
require "active_support/concern"
|
4
6
|
require "active_support/core_ext/array/extract_options"
|
5
7
|
require "active_support/core_ext/array/wrap"
|
6
8
|
require "active_support/core_ext/hash/indifferent_access"
|
@@ -11,6 +13,8 @@ module MimeActor
|
|
11
13
|
module Scene
|
12
14
|
extend ActiveSupport::Concern
|
13
15
|
|
16
|
+
include Stage
|
17
|
+
|
14
18
|
included do
|
15
19
|
mattr_accessor :acting_scenes, instance_writer: false, default: ActiveSupport::HashWithIndifferentAccess.new
|
16
20
|
end
|
@@ -20,32 +24,31 @@ module MimeActor
|
|
20
24
|
config = options.extract_options!
|
21
25
|
actions = Array.wrap(config[:on])
|
22
26
|
|
23
|
-
if actions.empty?
|
24
|
-
raise ArgumentError, "Action name can't be empty, e.g. on: :create"
|
25
|
-
end
|
27
|
+
raise ArgumentError, "Action name can't be empty, e.g. on: :create" if actions.empty?
|
26
28
|
|
27
29
|
options.each do |mime_type|
|
28
|
-
unless Mime::SET.symbols.include?(mime_type.to_sym)
|
29
|
-
raise ArgumentError, "Unsupported format: #{mime_type}"
|
30
|
-
end
|
30
|
+
raise ArgumentError, "Unsupported format: #{mime_type}" unless Mime::SET.symbols.include?(mime_type.to_sym)
|
31
31
|
|
32
32
|
actions.each do |action|
|
33
|
-
|
34
|
-
|
35
|
-
raise ArgumentError, "Action method already defined: #{action}"
|
36
|
-
end
|
33
|
+
if !acting_scenes.key?(action) && actor?(action)
|
34
|
+
raise ArgumentError, "Action method already defined: #{action}"
|
37
35
|
end
|
38
36
|
|
39
37
|
acting_scenes[action] ||= Set.new
|
40
38
|
acting_scenes[action] |= [mime_type.to_sym]
|
41
39
|
|
42
|
-
|
43
|
-
|
40
|
+
next if actor?(action)
|
41
|
+
|
42
|
+
class_eval(
|
43
|
+
# def index
|
44
|
+
# self.cue_actor(:play_scene, :index)
|
45
|
+
# end
|
46
|
+
<<-RUBY, __FILE__, __LINE__ + 1
|
44
47
|
def #{action}
|
45
|
-
|
48
|
+
self.cue_actor(:play_scene, :#{action})
|
46
49
|
end
|
47
50
|
RUBY
|
48
|
-
|
51
|
+
)
|
49
52
|
end
|
50
53
|
end
|
51
54
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mime_actor/errors"
|
4
|
+
|
5
|
+
require "active_support/concern"
|
6
|
+
require "active_support/configurable"
|
7
|
+
require "active_support/core_ext/module/attribute_accessors"
|
8
|
+
require "abstract_controller/logger"
|
9
|
+
|
10
|
+
module MimeActor
|
11
|
+
module Stage
|
12
|
+
extend ActiveSupport::Concern
|
13
|
+
|
14
|
+
include ActiveSupport::Configurable
|
15
|
+
include AbstractController::Logger
|
16
|
+
|
17
|
+
included do
|
18
|
+
mattr_accessor :raise_on_missing_actor, instance_writer: false, default: false
|
19
|
+
end
|
20
|
+
|
21
|
+
module ClassMethods
|
22
|
+
def actor?(actor_name)
|
23
|
+
return action_methods.include?(actor_name.to_s) if singleton_methods.include?(:action_methods)
|
24
|
+
|
25
|
+
instance_methods.include?(actor_name.to_sym)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def actor?(actor_name)
|
30
|
+
return action_methods.include?(actor_name.to_s) if respond_to?(:action_methods)
|
31
|
+
|
32
|
+
methods.include?(actor_name.to_sym)
|
33
|
+
end
|
34
|
+
|
35
|
+
def find_actor(actor_name)
|
36
|
+
return method(actor_name) if actor?(actor_name)
|
37
|
+
|
38
|
+
error = MimeActor::ActorNotFound.new(actor_name)
|
39
|
+
raise error if raise_on_missing_actor
|
40
|
+
|
41
|
+
logger.warn { "Actor not found: #{error.inspect}" }
|
42
|
+
end
|
43
|
+
|
44
|
+
def cue_actor(actor_name, *args)
|
45
|
+
return unless actor?(actor_name)
|
46
|
+
|
47
|
+
result = public_send(actor_name, *args)
|
48
|
+
if block_given?
|
49
|
+
yield result
|
50
|
+
else
|
51
|
+
result
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/mime_actor/version.rb
CHANGED
data/lib/mime_actor.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
require "mime_actor/version"
|
4
|
+
require "mime_actor/errors"
|
5
5
|
|
6
|
-
require
|
6
|
+
require "active_support/dependencies/autoload"
|
7
7
|
|
8
8
|
module MimeActor
|
9
9
|
extend ActiveSupport::Autoload
|
10
10
|
|
11
11
|
autoload :Act
|
12
12
|
autoload :Scene
|
13
|
+
autoload :Stage
|
13
14
|
autoload :Rescue
|
14
15
|
end
|
metadata
CHANGED
@@ -1,31 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mime_actor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2
|
4
|
+
version: 0.3.2
|
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-06-
|
11
|
+
date: 2024-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '11.0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '11.0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activesupport
|
14
|
+
name: actionpack
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - ">="
|
@@ -39,7 +25,7 @@ dependencies:
|
|
39
25
|
- !ruby/object:Gem::Version
|
40
26
|
version: '5.0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
28
|
+
name: activesupport
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - ">="
|
@@ -53,33 +39,19 @@ dependencies:
|
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: '5.0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rubocop
|
42
|
+
name: rake
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
72
44
|
requirements:
|
73
45
|
- - ">="
|
74
46
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :
|
47
|
+
version: '11.0'
|
48
|
+
type: :runtime
|
77
49
|
prerelease: false
|
78
50
|
version_requirements: !ruby/object:Gem::Requirement
|
79
51
|
requirements:
|
80
52
|
- - ">="
|
81
53
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
54
|
+
version: '11.0'
|
83
55
|
description: ''
|
84
56
|
email:
|
85
57
|
- ryancyq@gmail.com
|
@@ -98,12 +70,14 @@ files:
|
|
98
70
|
- lib/mime_actor/errors.rb
|
99
71
|
- lib/mime_actor/rescue.rb
|
100
72
|
- lib/mime_actor/scene.rb
|
73
|
+
- lib/mime_actor/stage.rb
|
101
74
|
- lib/mime_actor/version.rb
|
102
75
|
- sig/mime_actor.rbs
|
103
76
|
homepage: https://github.com/ryancyq/mime_actor
|
104
77
|
licenses:
|
105
78
|
- MIT
|
106
79
|
metadata:
|
80
|
+
rubygems_mfa_required: 'true'
|
107
81
|
allowed_push_host: https://rubygems.org
|
108
82
|
homepage_uri: https://github.com/ryancyq/mime_actor
|
109
83
|
source_code_uri: https://github.com/ryancyq/mime_actor
|