activity_notification 0.0.9 → 0.0.10

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +5 -0
  4. data/.yardopts +3 -0
  5. data/Gemfile +5 -0
  6. data/Gemfile.lock +50 -44
  7. data/README.md +242 -81
  8. data/Rakefile +13 -13
  9. data/activity_notification.gemspec +6 -8
  10. data/app/controllers/activity_notification/notifications_controller.rb +89 -11
  11. data/app/controllers/activity_notification/notifications_with_devise_controller.rb +12 -3
  12. data/app/mailers/activity_notification/mailer.rb +3 -0
  13. data/gemfiles/Gemfile.rails-4.2 +13 -0
  14. data/gemfiles/Gemfile.rails-4.2.lock +190 -0
  15. data/gemfiles/Gemfile.rails-5.0 +14 -0
  16. data/gemfiles/Gemfile.rails-5.0.lock +201 -0
  17. data/lib/activity_notification.rb +10 -6
  18. data/lib/activity_notification/apis/notification_api.rb +137 -27
  19. data/lib/activity_notification/common.rb +48 -24
  20. data/lib/activity_notification/config.rb +68 -10
  21. data/lib/activity_notification/controllers/store_controller.rb +13 -5
  22. data/lib/activity_notification/helpers/polymorphic_helpers.rb +17 -3
  23. data/lib/activity_notification/helpers/view_helpers.rb +161 -45
  24. data/lib/activity_notification/mailers/helpers.rb +121 -83
  25. data/lib/activity_notification/models/concerns/notifiable.rb +162 -69
  26. data/lib/activity_notification/models/concerns/notifier.rb +2 -0
  27. data/lib/activity_notification/models/concerns/target.rb +124 -25
  28. data/lib/activity_notification/models/notification.rb +168 -4
  29. data/lib/activity_notification/rails/routes.rb +50 -48
  30. data/lib/activity_notification/renderable.rb +106 -26
  31. data/lib/activity_notification/roles/acts_as_notifiable.rb +99 -26
  32. data/lib/activity_notification/roles/acts_as_notifier.rb +3 -0
  33. data/lib/activity_notification/roles/acts_as_target.rb +70 -0
  34. data/lib/activity_notification/version.rb +1 -1
  35. data/lib/generators/activity_notification/active_record/migration_generator.rb +3 -1
  36. data/lib/generators/activity_notification/controllers_generator.rb +5 -0
  37. data/lib/generators/activity_notification/install_generator.rb +7 -3
  38. data/lib/generators/activity_notification/models/notification_generator.rb +4 -2
  39. data/lib/generators/activity_notification/views_generator.rb +20 -0
  40. data/spec/concerns/apis/notification_api_spec.rb +105 -36
  41. data/spec/concerns/common_spec.rb +1 -1
  42. data/spec/concerns/models/notifiable_spec.rb +2 -2
  43. data/spec/concerns/models/notifier_spec.rb +1 -1
  44. data/spec/concerns/models/target_spec.rb +9 -8
  45. data/spec/controllers/notifications_controller_shared_examples.rb +101 -28
  46. data/spec/controllers/notifications_with_devise_controller_spec.rb +14 -4
  47. data/spec/helpers/view_helpers_spec.rb +3 -3
  48. data/spec/mailers/mailer_spec.rb +1 -1
  49. data/spec/models/notification_spec.rb +57 -3
  50. data/spec/rails_app/app/models/article.rb +1 -2
  51. data/spec/rails_app/app/models/comment.rb +8 -6
  52. data/spec/rails_app/app/models/user.rb +1 -1
  53. data/spec/rails_app/app/views/layouts/_header.html.erb +2 -0
  54. data/spec/rails_app/config/application.rb +3 -1
  55. data/spec/rails_app/config/environment.rb +12 -2
  56. data/spec/rails_app/config/environments/test.rb +11 -2
  57. data/spec/roles/acts_as_notifiable_spec.rb +2 -2
  58. data/spec/roles/acts_as_notifier_spec.rb +1 -1
  59. data/spec/roles/acts_as_target_spec.rb +3 -3
  60. data/spec/spec_helper.rb +6 -0
  61. metadata +35 -40
  62. data/spec/rails_app/app/models/concerns/.keep +0 -0
@@ -1,96 +1,134 @@
1
1
  module ActivityNotification
2
+ # Mailer module of ActivityNotification
2
3
  module Mailers
4
+ # Provides helper methods for mailer.
5
+ # Use to resolve parameters from email configuration and send notification email.
3
6
  module Helpers
4
7
  extend ActiveSupport::Concern
5
8
 
6
9
  protected
7
10
 
8
- # Configure default email options
9
- def notification_mail(notification, options = {})
10
- initialize_from_notification(notification)
11
- headers = headers_for(notification.key, options)
12
- begin
13
- mail headers
14
- rescue ActionView::MissingTemplate
15
- mail headers.merge(template_name: 'default')
11
+ # Send notification email with configured options.
12
+ #
13
+ # @param [Notification] notification Notification instance
14
+ # @param [Hash] options Options for email notification
15
+ def notification_mail(notification, options = {})
16
+ initialize_from_notification(notification)
17
+ headers = headers_for(notification.key, options)
18
+ begin
19
+ mail headers
20
+ rescue ActionView::MissingTemplate
21
+ mail headers.merge(template_name: 'default')
22
+ end
16
23
  end
17
- end
18
-
19
- def initialize_from_notification(notification)
20
- @notification, @target, @notifiable = notification, notification.target, notification.notifiable
21
- end
22
-
23
- def headers_for(key, options)
24
- if @notifiable.respond_to?(:overriding_notification_email_key) and
25
- @notifiable.overriding_notification_email_key(@target, key).present?
26
- key = @notifiable.overriding_notification_email_key(@target, key)
24
+
25
+ # Initialize instance variables from notification.
26
+ #
27
+ # @param [Notification] notification Notification instance
28
+ def initialize_from_notification(notification)
29
+ @notification, @target, @notifiable = notification, notification.target, notification.notifiable
27
30
  end
28
- headers = {
29
- subject: subject_for(key),
30
- to: mailer_to(@target),
31
- from: mailer_from(@notification),
32
- reply_to: mailer_reply_to(@notification),
33
- template_path: template_paths,
34
- template_name: template_name(key)
35
- }.merge(options)
36
-
37
- @email = headers[:to]
38
- headers
39
- end
40
-
41
- def mailer_to(target)
42
- target.mailer_to
43
- end
44
-
45
- def mailer_reply_to(notification)
46
- mailer_sender(notification, :reply_to)
47
- end
48
-
49
- def mailer_from(notification)
50
- mailer_sender(notification, :from)
51
- end
52
-
53
- def mailer_sender(notification, sender = :from)
54
- default_sender = default_params[sender]
55
- if default_sender.present?
56
- default_sender.respond_to?(:to_proc) ? instance_eval(&default_sender) : default_sender
57
- elsif ActivityNotification.config.mailer_sender.is_a?(Proc)
58
- ActivityNotification.config.mailer_sender.call(notification)
59
- else
60
- ActivityNotification.config.mailer_sender
31
+
32
+ # Prepare email header from notification key and options.
33
+ #
34
+ # @param [String] key Key of the notification
35
+ # @param [Hash] options Options for email notification
36
+ def headers_for(key, options)
37
+ if @notifiable.respond_to?(:overriding_notification_email_key) and
38
+ @notifiable.overriding_notification_email_key(@target, key).present?
39
+ key = @notifiable.overriding_notification_email_key(@target, key)
40
+ end
41
+ headers = {
42
+ subject: subject_for(key),
43
+ to: mailer_to(@target),
44
+ from: mailer_from(@notification),
45
+ reply_to: mailer_reply_to(@notification),
46
+ template_path: template_paths,
47
+ template_name: template_name(key)
48
+ }.merge(options)
49
+
50
+ @email = headers[:to]
51
+ headers
52
+ end
53
+
54
+ # Returns target email address as 'to'.
55
+ #
56
+ # @param [Object] target Target instance to notify
57
+ # @return [String] Target email address as 'to'
58
+ def mailer_to(target)
59
+ target.mailer_to
60
+ end
61
+
62
+ # Returns sender email address as 'reply_to'.
63
+ #
64
+ # @param [Notification] notification Notification instance
65
+ # @return [String] Sender email address as 'reply_to'
66
+ def mailer_reply_to(notification)
67
+ mailer_sender(notification, :reply_to)
68
+ end
69
+
70
+ # Returns sender email address as 'from'.
71
+ #
72
+ # @param [Notification] notification Notification instance
73
+ # @return [String] Sender email address as 'from'
74
+ def mailer_from(notification)
75
+ mailer_sender(notification, :from)
76
+ end
77
+
78
+ # Returns sender email address configured in initializer or mailer class.
79
+ #
80
+ # @param [Notification] notification Notification instance
81
+ # @return [String] Sender email address configured in initializer or mailer class
82
+ def mailer_sender(notification, sender = :from)
83
+ default_sender = default_params[sender]
84
+ if default_sender.present?
85
+ default_sender.respond_to?(:to_proc) ? instance_eval(&default_sender) : default_sender
86
+ elsif ActivityNotification.config.mailer_sender.is_a?(Proc)
87
+ ActivityNotification.config.mailer_sender.call(notification)
88
+ else
89
+ ActivityNotification.config.mailer_sender
90
+ end
91
+ end
92
+
93
+ # Returns template paths to find email view
94
+ #
95
+ # @return [Array<String>] Template paths to find email view
96
+ def template_paths
97
+ paths = ['activity_notification/mailer/default']
98
+ paths.unshift("activity_notification/mailer/#{@target.to_resources_name}") if @target.present?
99
+ paths
100
+ end
101
+
102
+ # Returns template name from notification key
103
+ #
104
+ # @param [String] key Key of the notification
105
+ # @return [String] Template name
106
+ def template_name(key)
107
+ key.gsub('.', '/')
108
+ end
109
+
110
+
111
+ # Set up a subject doing an I18n lookup.
112
+ # At first, it attempts to set a subject based on the current mapping:
113
+ # en:
114
+ # notification:
115
+ # {target}:
116
+ # {key}:
117
+ # mail_subject: '...'
118
+ #
119
+ # If one does not exist, it fallbacks to default:
120
+ # Notification for #{notification.printable_type}
121
+ #
122
+ # @param [String] key Key of the notification
123
+ # @return [String] Subject of notification email
124
+ def subject_for(key)
125
+ k = key.split('.')
126
+ k.unshift('notification') if k.first != 'notification'
127
+ k.insert(1, @target.to_resource_name)
128
+ k = k.join('.')
129
+ I18n.t(:mail_subject, scope: k,
130
+ default: ["Notification of #{@notifiable.printable_type}"])
61
131
  end
62
- end
63
-
64
- def template_paths
65
- paths = ['activity_notification/mailer/default']
66
- paths.unshift("activity_notification/mailer/#{@target.to_resources_name}") if @target.present?
67
- paths
68
- end
69
-
70
- def template_name(key)
71
- key.gsub('.', '/')
72
- end
73
-
74
-
75
- # Set up a subject doing an I18n lookup.
76
- # At first, it attempts to set a subject based on the current mapping:
77
- # en:
78
- # notification:
79
- # {target}:
80
- # {key}:
81
- # mail_subject: '...'
82
- #
83
- # If one does not exist, it fallbacks to default:
84
- # Notification for #{notification.printable_type}
85
- #
86
- def subject_for(key)
87
- k = key.split('.')
88
- k.unshift('notification') if k.first != 'notification'
89
- k.insert(1, @target.to_resource_name)
90
- k = k.join('.')
91
- I18n.t(:mail_subject, scope: k,
92
- default: ["Notification of #{@notifiable.printable_type}"])
93
- end
94
132
 
95
133
  end
96
134
  end
@@ -1,6 +1,9 @@
1
1
  module ActivityNotification
2
+ # Notifiable implementation included in notifiable model to be notified, like comments or any other user activities.
2
3
  module Notifiable
3
4
  extend ActiveSupport::Concern
5
+ # include PolymorphicHelpers to resolve string extentions
6
+ include ActivityNotification::PolymorphicHelpers
4
7
 
5
8
  included do
6
9
  include Common
@@ -15,15 +18,21 @@ module ActivityNotification
15
18
  set_notifiable_class_defaults
16
19
  end
17
20
 
21
+ # Returns default_url_options for polymorphic_path.
22
+ # @return [Hash] Rails.application.routes.default_url_options
18
23
  def default_url_options
19
24
  Rails.application.routes.default_url_options
20
25
  end
21
26
 
22
27
  class_methods do
28
+ # Checks if the model includes notifiable and notifiable methods are available.
29
+ # @return [Boolean] Always true
23
30
  def available_as_notifiable?
24
31
  true
25
32
  end
26
33
 
34
+ # Sets default values to notifiable class fields.
35
+ # @return [Nil] nil
27
36
  def set_notifiable_class_defaults
28
37
  self._notification_targets = {}
29
38
  self._notification_group = {}
@@ -31,111 +40,195 @@ module ActivityNotification
31
40
  self._notification_parameters = {}
32
41
  self._notification_email_allowed = {}
33
42
  self._notifiable_path = {}
43
+ nil
34
44
  end
35
45
  end
36
46
 
37
- # Methods to be overriden
38
-
47
+ # Returns notification targets from configured field or overriden method.
48
+ # This method is able to be overriden.
49
+ #
50
+ # @param [String] target_type Target type to notify
51
+ # @param [String] key Key of the notification
52
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of the notification targets
39
53
  def notification_targets(target_type, key)
40
- plural_target_type = target_type.to_s.underscore.pluralize
41
- plural_target_type_sym = plural_target_type.to_sym
42
- target_typed_method_name = "notification_#{plural_target_type}"
43
- if respond_to?(target_typed_method_name)
44
- send(target_typed_method_name, key)
45
- else
46
- if _notification_targets[plural_target_type_sym]
47
- resolve_value(_notification_targets[plural_target_type_sym], key)
48
- else
49
- raise NotImplementedError, "You have to implement #{self.class}##{target_typed_method_name} or set :targets in acts_as_notifiable"
50
- end
54
+ target_typed_method_name = "notification_#{target_type.to_s.to_resources_name}"
55
+ resolved_parameter = resolve_parameter(
56
+ target_typed_method_name,
57
+ _notification_targets[target_type.to_s.to_resources_name.to_sym],
58
+ nil,
59
+ key)
60
+ unless resolved_parameter
61
+ raise NotImplementedError, "You have to implement #{self.class}##{target_typed_method_name} "\
62
+ "or set :targets in acts_as_notifiable"
51
63
  end
64
+ resolved_parameter
52
65
  end
53
66
 
67
+ # Returns group owner of the notification from configured field or overriden method.
68
+ # This method is able to be overriden.
69
+ #
70
+ # @param [String] target_type Target type to notify
71
+ # @param [String] key Key of the notification
72
+ # @return [Object] Group owner of the notification
54
73
  def notification_group(target_type, key)
55
- plural_target_type = target_type.to_s.underscore.pluralize
56
- plural_target_type_sym = plural_target_type.to_sym
57
- target_typed_method_name = "notification_group_for_#{plural_target_type}"
58
- if respond_to?(target_typed_method_name)
59
- send(target_typed_method_name, key)
60
- else
61
- resolve_value(_notification_group[plural_target_type_sym], key)
62
- end
74
+ resolve_parameter(
75
+ "notification_group_for_#{target_type.to_s.to_resources_name}",
76
+ _notification_group[target_type.to_s.to_resources_name.to_sym],
77
+ nil,
78
+ key)
63
79
  end
64
80
 
81
+ # Returns additional notification parameters from configured field or overriden method.
82
+ # This method is able to be overriden.
83
+ #
84
+ # @param [String] target_type Target type to notify
85
+ # @param [String] key Key of the notification
86
+ # @return [Hash] Additional notification parameters
65
87
  def notification_parameters(target_type, key)
66
- plural_target_type = target_type.to_s.underscore.pluralize
67
- plural_target_type_sym = plural_target_type.to_sym
68
- target_typed_method_name = "notification_parameters_for_#{plural_target_type}"
69
- if respond_to?(target_typed_method_name)
70
- send(target_typed_method_name, key)
71
- else
72
- resolve_value(_notification_parameters[plural_target_type_sym], key) || {}
73
- end
88
+ resolve_parameter(
89
+ "notification_parameters_for_#{target_type.to_s.to_resources_name}",
90
+ _notification_parameters[target_type.to_s.to_resources_name.to_sym],
91
+ {},
92
+ key)
74
93
  end
75
94
 
95
+ # Returns notifier of the notification from configured field or overriden method.
96
+ # This method is able to be overriden.
97
+ #
98
+ # @param [String] target_type Target type to notify
99
+ # @param [String] key Key of the notification
100
+ # @return [Object] Notifier of the notification
76
101
  def notifier(target_type, key)
77
- plural_target_type = target_type.to_s.underscore.pluralize
78
- plural_target_type_sym = plural_target_type.to_sym
79
- target_typed_method_name = "notifier_for_#{plural_target_type}"
80
- if respond_to?(target_typed_method_name)
81
- send(target_typed_method_name, key)
82
- else
83
- resolve_value(_notifier[plural_target_type_sym], key)
84
- end
102
+ resolve_parameter(
103
+ "notifier_for_#{target_type.to_s.to_resources_name}",
104
+ _notifier[target_type.to_s.to_resources_name.to_sym],
105
+ nil,
106
+ key)
85
107
  end
86
108
 
109
+ # Returns if sending notification email is allowed for the notifiable from configured field or overriden method.
110
+ # This method is able to be overriden.
111
+ #
112
+ # @param [Object] target Target instance to notify
113
+ # @param [String] key Key of the notification
114
+ # @return [Boolean] If sending notification email is allowed for the notifiable
87
115
  def notification_email_allowed?(target, key)
88
- plural_target_type = target.class.to_s.underscore.pluralize
89
- plural_target_type_sym = target.to_resources_name.to_sym
90
- target_typed_method_name = "notification_email_allowed_for_#{plural_target_type}?"
91
- if respond_to?(target_typed_method_name)
92
- send(target_typed_method_name, target, key)
93
- elsif _notification_email_allowed[plural_target_type_sym]
94
- resolve_value(_notification_email_allowed[plural_target_type_sym], target, key)
95
- else
96
- ActivityNotification.config.email_enabled
97
- end
116
+ resolve_parameter(
117
+ "notification_email_allowed_for_#{target.class.to_s.to_resources_name}?",
118
+ _notification_email_allowed[target.class.to_s.to_resources_name.to_sym],
119
+ ActivityNotification.config.email_enabled,
120
+ target, key)
98
121
  end
99
122
 
100
- def notifiable_path(target_type, key = nil)
101
- plural_target_type = target_type.to_s.underscore.pluralize
102
- plural_target_type_sym = plural_target_type.to_sym
103
- target_typed_method_name = "notifiable_path_for_#{plural_target_type}"
104
- if respond_to?(target_typed_method_name)
105
- send(target_typed_method_name, key)
106
- elsif _notifiable_path[plural_target_type_sym]
107
- resolve_value(_notifiable_path[plural_target_type_sym], key)
108
- else
123
+ # Returns notifiable_path to move after opening notification from configured field or overriden method.
124
+ # This method is able to be overriden.
125
+ #
126
+ # @param [String] target_type Target type to notify
127
+ # @param [String] key Key of the notification
128
+ # @return [String] Notifiable path URL to move after opening notification
129
+ def notifiable_path(target_type, key)
130
+ resolved_parameter = resolve_parameter(
131
+ "notifiable_path_for_#{target_type.to_s.to_resources_name}",
132
+ _notifiable_path[target_type.to_s.to_resources_name.to_sym],
133
+ nil,
134
+ key)
135
+ unless resolved_parameter
109
136
  begin
110
- polymorphic_path(self)
137
+ resolved_parameter = polymorphic_path(self)
111
138
  rescue NoMethodError, ActionController::UrlGenerationError
112
- raise NotImplementedError, "You have to implement #{self.class}##{__method__}, set :notifiable_path in acts_as_notifiable or set polymorphic_path routing for #{self.class}"
139
+ raise NotImplementedError, "You have to implement #{self.class}##{__method__}, "\
140
+ "set :notifiable_path in acts_as_notifiable or "\
141
+ "set polymorphic_path routing for #{self.class}"
113
142
  end
114
143
  end
144
+ resolved_parameter
115
145
  end
116
146
 
117
- # TODO docs
118
- # overriding_notification_render_key(target, key)
119
-
120
- # TODO docs
147
+ # overriding_notification_email_key is the method to override key definition for Mailer
148
+ # When respond_to?(overriding_notification_email_key) returns true,
149
+ # Mailer uses overriding_notification_email_key instead of original key.
150
+ #
121
151
  # overriding_notification_email_key(target, key)
122
152
 
123
- # Wrapper methods of Notification class methods
124
-
153
+
154
+ # Generates notifications to configured targets with notifiable model.
155
+ # This method calls NotificationApi#notify internally with self notifiable instance.
156
+ # @see NotificationApi#notify
157
+ #
158
+ # @param [Symbol, String, Class] target_type Type of target
159
+ # @param [Hash] options Options for notifications
160
+ # @option options [String] :key (notifiable.default_notification_key) Key of the notification
161
+ # @option options [Object] :group (nil) Group unit of the notifications
162
+ # @option options [Object] :notifier (nil) Notifier of the notifications
163
+ # @option options [Hash] :parameters ({}) Additional parameters of the notifications
164
+ # @option options [Boolean] :send_email (true) If it sends notification email
165
+ # @option options [Boolean] :send_later (true) If it sends notification email asynchronously
166
+ # @return [Array<Notificaion>] Array of generated notifications
125
167
  def notify(target_type, options = {})
126
168
  Notification.notify(target_type, self, options)
127
169
  end
128
-
129
- def notify_to(target, options = {})
130
- Notification.notify_to(target, self, options)
131
- end
132
-
170
+
171
+ # Generates notifications to one target.
172
+ # This method calls NotificationApi#notify_all internally with self notifiable instance.
173
+ # @see NotificationApi#notify_all
174
+ #
175
+ # @param [Array<Object>] targets Targets to send notifications
176
+ # @param [Hash] options Options for notifications
177
+ # @option options [String] :key (notifiable.default_notification_key) Key of the notification
178
+ # @option options [Object] :group (nil) Group unit of the notifications
179
+ # @option options [Object] :notifier (nil) Notifier of the notifications
180
+ # @option options [Hash] :parameters ({}) Additional parameters of the notifications
181
+ # @option options [Boolean] :send_email (true) Whether it sends notification email
182
+ # @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
183
+ # @return [Array<Notificaion>] Array of generated notifications
133
184
  def notify_all(targets, options = {})
134
185
  Notification.notify_all(targets, self, options)
135
186
  end
136
187
 
188
+ # Generates notifications to one target.
189
+ # This method calls NotificationApi#notify_to internally with self notifiable instance.
190
+ # @see NotificationApi#notify_to
191
+ #
192
+ # @param [Object] target Target to send notifications
193
+ # @param [Hash] options Options for notifications
194
+ # @option options [String] :key (notifiable.default_notification_key) Key of the notification
195
+ # @option options [Object] :group (nil) Group unit of the notifications
196
+ # @option options [Object] :notifier (nil) Notifier of the notifications
197
+ # @option options [Hash] :parameters ({}) Additional parameters of the notifications
198
+ # @option options [Boolean] :send_email (true) Whether it sends notification email
199
+ # @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
200
+ # @return [Notification] Generated notification instance
201
+ def notify_to(target, options = {})
202
+ Notification.notify_to(target, self, options)
203
+ end
204
+
205
+ # Returns default key of the notification.
206
+ # This method is able to be overriden.
207
+ # "#{to_resource_name}.default" is defined as default key.
208
+ #
209
+ # @return [String] Default Key of the notification
137
210
  def default_notification_key
138
211
  "#{to_resource_name}.default"
139
212
  end
213
+
214
+ private
215
+
216
+ # Used to transform parameter value from configured field or defined method.
217
+ # @api private
218
+ #
219
+ # @param [String] target_typed_method_name Method name overriden for the target type
220
+ # @param [Object] parameter_field Parameter Configured field in this model
221
+ # @param [Object] default_value Default parameter value
222
+ # @param [Array] args Arguments to pass to the method overriden or defined as parameter field
223
+ # @return [Object] Resolved parameter value
224
+ def resolve_parameter(target_typed_method_name, parameter_field, default_value, *args)
225
+ if respond_to?(target_typed_method_name)
226
+ send(target_typed_method_name, *args)
227
+ elsif parameter_field
228
+ resolve_value(parameter_field, *args)
229
+ else
230
+ default_value
231
+ end
232
+ end
140
233
  end
141
234
  end