mime_actor 0.2.1 → 0.3.3

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: 35c75654432a3dd52002da0a92b31560432709c940143b6da12d6c8381298cd5
4
+ data.tar.gz: 7a412d03ba99cc45ea2aceb4c3741a49b2bcbc53b04f2a627267e415c4e0955a
5
5
  SHA512:
6
- metadata.gz: '06389feb5335b5445f33c9cfbe25a7982e58df92111c120878d402e03e800d1e5ebeb9e1af5f8de8ff663c001484d5baead8de08b8b8f133acaf142b5d5731e3'
7
- data.tar.gz: 13b279b67f62de25fec4628c2e2320ba06a986d56f296b119147cf6e082fb9512ae1f1b38c713c02e4f8fed4740c432beb11d1d195ecaf73694b13300e59f22f
6
+ metadata.gz: db971845e8bd7544fea9b7bc711c9e290948eaeaf52526b49e72cab85023d6b8087f1f131c4f5f6ed70591ad342bfab94a09e44f3a9f6d250df6bd3c7d30b72e
7
+ data.tar.gz: 0014236f7f1720f88f6bbb7e807c0d34760786b5febc1037d3f871c0b0f2a67d976c4ccadf58d939bff563b5c214bc25ca2160669590050bf6e0ca14c975ae1e
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,10 +1,11 @@
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"
7
7
  require "active_support/core_ext/string/inflections"
8
+ require "set" # remove when ruby > 3,1
8
9
  require "action_dispatch/http/mime_type"
9
10
 
10
11
  module MimeActor
@@ -32,7 +33,7 @@ module MimeActor
32
33
  unfiltered = format.to_set
33
34
  filtered = unfiltered & Mime::SET.symbols.to_set
34
35
  rejected = unfiltered - filtered
35
- raise ArgumentError, "Unsupported formats: #{rejected.join(', ')}" if rejected.size.positive?
36
+ raise ArgumentError, "Unsupported formats: #{rejected.join(", ")}" if rejected.size.positive?
36
37
  else
37
38
  raise ArgumentError, "Format filter can only be Symbol/Enumerable"
38
39
  end
@@ -44,25 +45,26 @@ module MimeActor
44
45
 
45
46
  klazzes.each do |klazz|
46
47
  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
48
+ klazz.name
49
+ elsif klazz.is_a?(String)
50
+ klazz
51
+ else
52
+ raise ArgumentError,
53
+ "#{klazz.inspect} must be a class/module or a String referencing a class/module"
54
+ end
53
55
 
54
56
  # append at the end because strategies are read in reverse.
55
- self.actor_rescuers << [error, format, action, with]
57
+ actor_rescuers << [error, format, action, with]
56
58
  end
57
59
  end
58
60
 
59
61
  def rescue_actor(error, action: nil, format: nil, context: self, visited: [])
60
62
  visited << error
61
63
 
62
- if rescuer = dispatch_rescuer(error, format:, action:, context:)
64
+ if (rescuer = dispatch_rescuer(error, format:, action:, context:))
63
65
  rescuer.call(error, format, action)
64
66
  error
65
- elsif error && error.cause && !visited.include?(error.cause)
67
+ elsif error&.cause && !visited.include?(error.cause)
66
68
  rescue_actor(error.cause, format:, action:, context:, visited:)
67
69
  end
68
70
  end
@@ -75,24 +77,24 @@ module MimeActor
75
77
  rescuer_method = context.method(rescuer)
76
78
  case rescuer_method.arity
77
79
  when 0
78
- -> e,f,a { rescuer_method.call }
80
+ ->(_e, _f, _a) { rescuer_method.call }
79
81
  when 1
80
- -> e,f,a { rescuer_method.call(e) }
82
+ ->(e, _f, _a) { rescuer_method.call(e) }
81
83
  when 2
82
- -> e,f,a { rescuer_method.call(e,f) }
84
+ ->(e, f, _a) { rescuer_method.call(e, f) }
83
85
  else
84
- -> e,f,a { rescuer_method.call(e,f,a) }
86
+ ->(e, f, a) { rescuer_method.call(e, f, a) }
85
87
  end
86
88
  when Proc
87
89
  case rescuer.arity
88
90
  when 0
89
- -> e,f,a { context.instance_exec(&rescuer) }
91
+ ->(_e, _f, _a) { context.instance_exec(&rescuer) }
90
92
  when 1
91
- -> e,f,a { context.instance_exec(e, &rescuer) }
93
+ ->(e, _f, _a) { context.instance_exec(e, &rescuer) }
92
94
  when 2
93
- -> e,f,a { context.instance_exec(e, f, &rescuer) }
95
+ ->(e, f, _a) { context.instance_exec(e, f, &rescuer) }
94
96
  else
95
- -> e,f,a { context.instance_exec(e, f, a, &rescuer) }
97
+ ->(e, f, a) { context.instance_exec(e, f, a, &rescuer) }
96
98
  end
97
99
  end
98
100
  end
@@ -103,9 +105,9 @@ module MimeActor
103
105
  *_, rescuer = actor_rescuers.reverse_each.detect do |rescuee, format_filter, action_filter|
104
106
  next if action_filter.present? && !Array.wrap(action_filter).include?(action)
105
107
  next if format_filter.present? && !Array.wrap(format_filter).include?(format)
106
- next unless klazz = constantize_rescuee(rescuee)
108
+ next unless (klazz = constantize_rescuee(rescuee))
107
109
 
108
- klazz === error # klazz is a member of error
110
+ error.is_a?(klazz)
109
111
  end
110
112
  rescuer
111
113
  end
@@ -124,4 +126,4 @@ module MimeActor
124
126
  end
125
127
  end
126
128
  end
127
- end
129
+ end
@@ -1,16 +1,21 @@
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"
7
9
  require "active_support/core_ext/module/attribute_accessors"
10
+ require "set" # remove when ruby > 3,1
8
11
  require "action_dispatch/http/mime_type"
9
12
 
10
13
  module MimeActor
11
14
  module Scene
12
15
  extend ActiveSupport::Concern
13
16
 
17
+ include Stage
18
+
14
19
  included do
15
20
  mattr_accessor :acting_scenes, instance_writer: false, default: ActiveSupport::HashWithIndifferentAccess.new
16
21
  end
@@ -20,32 +25,31 @@ module MimeActor
20
25
  config = options.extract_options!
21
26
  actions = Array.wrap(config[:on])
22
27
 
23
- if actions.empty?
24
- raise ArgumentError, "Action name can't be empty, e.g. on: :create"
25
- end
28
+ raise ArgumentError, "Action name can't be empty, e.g. on: :create" if actions.empty?
26
29
 
27
30
  options.each do |mime_type|
28
- unless Mime::SET.symbols.include?(mime_type.to_sym)
29
- raise ArgumentError, "Unsupported format: #{mime_type}"
30
- end
31
+ raise ArgumentError, "Unsupported format: #{mime_type}" unless Mime::SET.symbols.include?(mime_type.to_sym)
31
32
 
32
33
  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
34
+ if !acting_scenes.key?(action) && actor?(action)
35
+ raise ArgumentError, "Action method already defined: #{action}"
37
36
  end
38
37
 
39
38
  acting_scenes[action] ||= Set.new
40
39
  acting_scenes[action] |= [mime_type.to_sym]
41
40
 
42
- unless self.instance_methods.include?(action)
43
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
41
+ next if actor?(action)
42
+
43
+ class_eval(
44
+ # def index
45
+ # self.cue_actor(:play_scene, :index)
46
+ # end
47
+ <<-RUBY, __FILE__, __LINE__ + 1
44
48
  def #{action}
45
- respond_to?(:play_scene) && public_send(:play_scene, :#{action})
49
+ self.cue_actor(:play_scene, :#{action})
46
50
  end
47
51
  RUBY
48
- end
52
+ )
49
53
  end
50
54
  end
51
55
  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 = 3
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.3
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