activity_notification 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
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