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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ebd84a2af57785ebac0ce18f1ef7137e50e6c3312c16ddf103b9c112aba7d43
4
- data.tar.gz: f7ad301149d348455263ffa0d2ce8457177b91276e930a9852b941d465ebeb9a
3
+ metadata.gz: b52e3908f3269eb87dbe77d561e9bdb9067446b142e526ea8198fbe6481f29c4
4
+ data.tar.gz: 5d89ea4e185dfefcbbc1576a63967d1d0403f2dbcc39fe20277ee5a3194d9f33
5
5
  SHA512:
6
- metadata.gz: '06389feb5335b5445f33c9cfbe25a7982e58df92111c120878d402e03e800d1e5ebeb9e1af5f8de8ff663c001484d5baead8de08b8b8f133acaf142b5d5731e3'
7
- data.tar.gz: 13b279b67f62de25fec4628c2e2320ba06a986d56f296b119147cf6e082fb9512ae1f1b38c713c02e4f8fed4740c432beb11d1d195ecaf73694b13300e59f22f
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.0
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
@@ -5,5 +5,5 @@ require "bundler/gem_tasks"
5
5
  require "rubocop/rake_task"
6
6
  RuboCop::RakeTask.new
7
7
 
8
- require 'rspec/core/rake_task'
8
+ require "rspec/core/rake_task"
9
9
  RSpec::Core::RakeTask.new(:spec)
@@ -1,32 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/concern'
4
- require 'active_support/configurable'
5
- require "active_support/core_ext/module/attribute_accessors"
6
- require 'abstract_controller/logger'
7
- require 'abstract_controller/rendering'
8
- require 'action_controller/metal/mime_responds'
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
- include ActiveSupport::Configurable
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 Exception => ex
29
- respond_to?(:rescue_actor) && public_send(:rescue_actor, ex, action:, format:, context:) || raise
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, mime_type)
40
+ next unless (actor = find_actor("#{action}_#{mime_type}"))
44
41
 
45
42
  dispatch = self.class.dispatch_act(
46
- action: action,
47
- format: mime_type,
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
@@ -5,18 +5,16 @@ module MimeActor
5
5
  end
6
6
 
7
7
  class ActorNotFound < Error
8
- attr_reader :actor, :action, :format
8
+ attr_reader :actor
9
9
 
10
- def initialize(action, format)
11
- @action = action
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}> actor:#{actor} not found for action:#{action}, format:#{format}"
17
+ "<#{self.class.name}> #{message}"
20
18
  end
21
19
  end
22
- end
20
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/concern'
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(', ')}" if rejected.size.positive?
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
- klazz.name
48
- elsif klazz.is_a?(String)
49
- klazz
50
- else
51
- raise ArgumentError, "#{klazz.inspect} must be a class/module or a String referencing a class/module"
52
- end
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
- self.actor_rescuers << [error, format, action, with]
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 && error.cause && !visited.include?(error.cause)
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
- -> e,f,a { rescuer_method.call }
79
+ ->(_e, _f, _a) { rescuer_method.call }
79
80
  when 1
80
- -> e,f,a { rescuer_method.call(e) }
81
+ ->(e, _f, _a) { rescuer_method.call(e) }
81
82
  when 2
82
- -> e,f,a { rescuer_method.call(e,f) }
83
+ ->(e, f, _a) { rescuer_method.call(e, f) }
83
84
  else
84
- -> e,f,a { rescuer_method.call(e,f,a) }
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
- -> e,f,a { context.instance_exec(&rescuer) }
90
+ ->(_e, _f, _a) { context.instance_exec(&rescuer) }
90
91
  when 1
91
- -> e,f,a { context.instance_exec(e, &rescuer) }
92
+ ->(e, _f, _a) { context.instance_exec(e, &rescuer) }
92
93
  when 2
93
- -> e,f,a { context.instance_exec(e, f, &rescuer) }
94
+ ->(e, f, _a) { context.instance_exec(e, f, &rescuer) }
94
95
  else
95
- -> e,f,a { context.instance_exec(e, f, a, &rescuer) }
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
- klazz === error # klazz is a member of error
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
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/concern'
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
- unless acting_scenes.key?(action)
34
- if respond_to?(:action_methods) && public_send(:action_methods).include?(action.to_s)
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
- unless self.instance_methods.include?(action)
43
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
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
- respond_to?(:play_scene) && public_send(:play_scene, :#{action})
48
+ self.cue_actor(:play_scene, :#{action})
46
49
  end
47
50
  RUBY
48
- end
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
@@ -11,8 +11,8 @@ module MimeActor
11
11
 
12
12
  module VERSION
13
13
  MAJOR = 0
14
- MINOR = 2
15
- BUILD = 1
14
+ MINOR = 3
15
+ BUILD = 2
16
16
  PRE = nil
17
17
 
18
18
  STRING = [MAJOR, MINOR, BUILD, PRE].compact.join(".")
data/lib/mime_actor.rb CHANGED
@@ -1,14 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "mime_actor/version"
4
- require_relative "mime_actor/errors"
3
+ require "mime_actor/version"
4
+ require "mime_actor/errors"
5
5
 
6
- require 'active_support/dependencies/autoload'
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.1
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-23 00:00:00.000000000 Z
11
+ date: 2024-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
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: actionpack
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: rspec
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: :development
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