actionmailer 7.1.3.2 → 7.2.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionmailer might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -163
- data/lib/action_mailer/base.rb +5 -6
- data/lib/action_mailer/delivery_methods.rb +1 -2
- data/lib/action_mailer/gem_version.rb +3 -3
- data/lib/action_mailer/parameterized.rb +5 -7
- data/lib/action_mailer/preview.rb +0 -24
- data/lib/action_mailer/test_helper.rb +0 -20
- data/lib/action_mailer.rb +1 -1
- metadata +17 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb3256479066f6e71da2f41cb8a37cd1b14f3bd42d8e5e77ae5718b307cd2f62
|
4
|
+
data.tar.gz: 9291f3df95d95b264683c027560a7942ccc609871eddc79f1f266a3d9a668d8c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0243c77d172d2431deda2bc81d240357f8eaaeb48b069eef03eb3e7113c59dba5251d9c95c61350e90cfcf20080ab3f79f001c176b1fe231cb5bfd9ef27a51f0
|
7
|
+
data.tar.gz: 537da0a128c3e07b1b895cc11616d188193a9a440d6c5150244b75d4efeabe6c2e9fcebebd08fa58c0be55ecd46ac0ae365147187aa444a780726e5d0dc9d69b
|
data/CHANGELOG.md
CHANGED
@@ -1,168 +1,11 @@
|
|
1
|
-
## Rails 7.
|
1
|
+
## Rails 7.2.0.beta1 (May 29, 2024) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Remove deprecated params via `:args` for `assert_enqueued_email_with`.
|
4
4
|
|
5
|
+
*Rafael Mendonça França*
|
5
6
|
|
6
|
-
|
7
|
+
* Remove deprecated `config.action_mailer.preview_path`.
|
7
8
|
|
8
|
-
*
|
9
|
+
*Rafael Mendonça França*
|
9
10
|
|
10
|
-
|
11
|
-
## Rails 7.1.3 (January 16, 2024) ##
|
12
|
-
|
13
|
-
* No changes.
|
14
|
-
|
15
|
-
|
16
|
-
## Rails 7.1.2 (November 10, 2023) ##
|
17
|
-
|
18
|
-
* No changes.
|
19
|
-
|
20
|
-
|
21
|
-
## Rails 7.1.1 (October 11, 2023) ##
|
22
|
-
|
23
|
-
* No changes.
|
24
|
-
|
25
|
-
|
26
|
-
## Rails 7.1.0 (October 05, 2023) ##
|
27
|
-
|
28
|
-
* No changes.
|
29
|
-
|
30
|
-
|
31
|
-
## Rails 7.1.0.rc2 (October 01, 2023) ##
|
32
|
-
|
33
|
-
* No changes.
|
34
|
-
|
35
|
-
|
36
|
-
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
37
|
-
|
38
|
-
* Introduce `ActionMailer::FormBuilder`
|
39
|
-
|
40
|
-
Use the `default_form_builder` method in mailers to set the default form builder
|
41
|
-
for templates rendered by that mailer. Matches the behaviour in Action Controller.
|
42
|
-
|
43
|
-
*Alex Ghiculescu*
|
44
|
-
|
45
|
-
|
46
|
-
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
47
|
-
|
48
|
-
* Mailers are listed in alphabetical order on the mailer preview page now.
|
49
|
-
|
50
|
-
*Martin Spickermann*
|
51
|
-
|
52
|
-
* Deprecate passing params to `assert_enqueued_email_with` via the `:args`
|
53
|
-
kwarg. `assert_enqueued_email_with` now supports a `:params` kwarg, so use
|
54
|
-
that to pass params:
|
55
|
-
|
56
|
-
```ruby
|
57
|
-
# BEFORE
|
58
|
-
assert_enqueued_email_with MyMailer, :my_method, args: { my_param: "value" }
|
59
|
-
|
60
|
-
# AFTER
|
61
|
-
assert_enqueued_email_with MyMailer, :my_method, params: { my_param: "value" }
|
62
|
-
```
|
63
|
-
|
64
|
-
To specify named mailer args as a Hash, wrap the Hash in an array:
|
65
|
-
|
66
|
-
```ruby
|
67
|
-
assert_enqueued_email_with MyMailer, :my_method, args: [{ my_arg: "value" }]
|
68
|
-
# OR
|
69
|
-
assert_enqueued_email_with MyMailer, :my_method, args: [my_arg: "value"]
|
70
|
-
```
|
71
|
-
|
72
|
-
*Jonathan Hefner*
|
73
|
-
|
74
|
-
* Accept procs for args and params in `assert_enqueued_email_with`
|
75
|
-
|
76
|
-
```ruby
|
77
|
-
assert_enqueued_email_with DeliveryJob, params: -> p { p[:token] =~ /\w+/ } do
|
78
|
-
UserMailer.with(token: user.generate_token).email_verification.deliver_later
|
79
|
-
end
|
80
|
-
```
|
81
|
-
|
82
|
-
*Max Chernyak*
|
83
|
-
|
84
|
-
* Added `*_deliver` callbacks to `ActionMailer::Base` that wrap mail message delivery.
|
85
|
-
|
86
|
-
Example:
|
87
|
-
|
88
|
-
```ruby
|
89
|
-
class EventsMailer < ApplicationMailer
|
90
|
-
after_deliver do
|
91
|
-
User.find_by(email: message.to.first).update(email_provider_id: message.message_id, emailed_at: Time.current)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
```
|
95
|
-
|
96
|
-
*Ben Sheldon*
|
97
|
-
|
98
|
-
* Added `deliver_enqueued_emails` to `ActionMailer::TestHelper`. This method
|
99
|
-
delivers all enqueued email jobs.
|
100
|
-
|
101
|
-
Example:
|
102
|
-
|
103
|
-
```ruby
|
104
|
-
def test_deliver_enqueued_emails
|
105
|
-
deliver_enqueued_emails do
|
106
|
-
ContactMailer.welcome.deliver_later
|
107
|
-
end
|
108
|
-
assert_emails 1
|
109
|
-
end
|
110
|
-
```
|
111
|
-
|
112
|
-
*Andrew Novoselac*
|
113
|
-
|
114
|
-
* The `deliver_later_queue_name` used by the default mailer job can now be
|
115
|
-
configured on a per-mailer basis. Previously this was only configurable
|
116
|
-
for all mailers via `ActionMailer::Base`.
|
117
|
-
|
118
|
-
Example:
|
119
|
-
|
120
|
-
```ruby
|
121
|
-
class EventsMailer < ApplicationMailer
|
122
|
-
self.deliver_later_queue_name = :throttled_mailer
|
123
|
-
end
|
124
|
-
```
|
125
|
-
|
126
|
-
*Jeffrey Hardy*
|
127
|
-
|
128
|
-
* Email previews now include an expandable section to show all headers.
|
129
|
-
|
130
|
-
Headers like `Message-ID` for threading or email service provider specific
|
131
|
-
features like analytics tags or account metadata can now be viewed directly
|
132
|
-
in the mailer preview.
|
133
|
-
|
134
|
-
*Matt Swanson*
|
135
|
-
|
136
|
-
* Default `ActionMailer::Parameterized#params` to an empty `Hash`
|
137
|
-
|
138
|
-
*Sean Doyle*
|
139
|
-
|
140
|
-
* Introduce the `capture_emails` test helper.
|
141
|
-
|
142
|
-
Returns all emails that are sent in a block.
|
143
|
-
|
144
|
-
```ruby
|
145
|
-
def test_emails
|
146
|
-
emails = capture_emails do
|
147
|
-
ContactMailer.welcome.deliver_now
|
148
|
-
ContactMailer.welcome.deliver_later
|
149
|
-
end
|
150
|
-
assert_email "Hi there", emails.first.subject
|
151
|
-
end
|
152
|
-
```
|
153
|
-
|
154
|
-
*Alex Ghiculescu*
|
155
|
-
|
156
|
-
* Added ability to download `.eml` file for the email preview.
|
157
|
-
|
158
|
-
*Igor Kasyanchuk*
|
159
|
-
|
160
|
-
* Support multiple preview paths for mailers.
|
161
|
-
|
162
|
-
Option `config.action_mailer.preview_path` is deprecated in favor of
|
163
|
-
`config.action_mailer.preview_paths`. Appending paths to this configuration option
|
164
|
-
will cause those paths to be used in the search for mailer previews.
|
165
|
-
|
166
|
-
*fatkodima*
|
167
|
-
|
168
|
-
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionmailer/CHANGELOG.md) for previous changes.
|
11
|
+
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionmailer/CHANGELOG.md) for previous changes.
|
data/lib/action_mailer/base.rb
CHANGED
@@ -625,17 +625,16 @@ module ActionMailer
|
|
625
625
|
payload[:perform_deliveries] = mail.perform_deliveries
|
626
626
|
end
|
627
627
|
|
628
|
-
def method_missing(method_name,
|
629
|
-
if action_methods.include?(method_name.
|
630
|
-
MessageDelivery.new(self, method_name,
|
628
|
+
def method_missing(method_name, ...)
|
629
|
+
if action_methods.include?(method_name.name)
|
630
|
+
MessageDelivery.new(self, method_name, ...)
|
631
631
|
else
|
632
632
|
super
|
633
633
|
end
|
634
634
|
end
|
635
|
-
ruby2_keywords(:method_missing)
|
636
635
|
|
637
636
|
def respond_to_missing?(method, include_all = false)
|
638
|
-
action_methods.include?(method.
|
637
|
+
action_methods.include?(method.name) || super
|
639
638
|
end
|
640
639
|
end
|
641
640
|
|
@@ -669,7 +668,7 @@ module ActionMailer
|
|
669
668
|
true
|
670
669
|
end
|
671
670
|
|
672
|
-
def method_missing(
|
671
|
+
def method_missing(...)
|
673
672
|
nil
|
674
673
|
end
|
675
674
|
end
|
@@ -32,8 +32,7 @@ module ActionMailer
|
|
32
32
|
|
33
33
|
add_delivery_method :sendmail, Mail::Sendmail,
|
34
34
|
location: "/usr/sbin/sendmail",
|
35
|
-
|
36
|
-
arguments: Gem::Version.new(Mail::VERSION.version) >= Gem::Version.new("2.8.0") ? %w[-i] : "-i"
|
35
|
+
arguments: %w[-i]
|
37
36
|
|
38
37
|
add_delivery_method :test, Mail::TestMailer
|
39
38
|
end
|
@@ -114,14 +114,13 @@ module ActionMailer
|
|
114
114
|
end
|
115
115
|
|
116
116
|
private
|
117
|
-
def method_missing(method_name,
|
118
|
-
if @mailer.action_methods.include?(method_name.
|
119
|
-
ActionMailer::Parameterized::MessageDelivery.new(@mailer, method_name, @params,
|
117
|
+
def method_missing(method_name, ...)
|
118
|
+
if @mailer.action_methods.include?(method_name.name)
|
119
|
+
ActionMailer::Parameterized::MessageDelivery.new(@mailer, method_name, @params, ...)
|
120
120
|
else
|
121
121
|
super
|
122
122
|
end
|
123
123
|
end
|
124
|
-
ruby2_keywords(:method_missing)
|
125
124
|
|
126
125
|
def respond_to_missing?(method, include_all = false)
|
127
126
|
@mailer.respond_to?(method, include_all)
|
@@ -129,11 +128,10 @@ module ActionMailer
|
|
129
128
|
end
|
130
129
|
|
131
130
|
class MessageDelivery < ActionMailer::MessageDelivery # :nodoc:
|
132
|
-
def initialize(mailer_class, action, params,
|
133
|
-
super(mailer_class, action,
|
131
|
+
def initialize(mailer_class, action, params, ...)
|
132
|
+
super(mailer_class, action, ...)
|
134
133
|
@params = params
|
135
134
|
end
|
136
|
-
ruby2_keywords(:initialize)
|
137
135
|
|
138
136
|
private
|
139
137
|
def processed_mailer
|
@@ -25,31 +25,7 @@ module ActionMailer
|
|
25
25
|
mattr_accessor :preview_interceptors, instance_writer: false, default: [ActionMailer::InlinePreviewInterceptor]
|
26
26
|
end
|
27
27
|
|
28
|
-
def preview_path
|
29
|
-
ActionMailer.deprecator.warn(<<-MSG.squish)
|
30
|
-
Using preview_path option is deprecated and will be removed in Rails 7.2.
|
31
|
-
Please use preview_paths instead.
|
32
|
-
MSG
|
33
|
-
self.class.preview_paths.first
|
34
|
-
end
|
35
|
-
|
36
28
|
module ClassMethods
|
37
|
-
def preview_path=(value)
|
38
|
-
ActionMailer.deprecator.warn(<<-MSG.squish)
|
39
|
-
Using preview_path= option is deprecated and will be removed in Rails 7.2.
|
40
|
-
Please use preview_paths= instead.
|
41
|
-
MSG
|
42
|
-
self.preview_paths << value
|
43
|
-
end
|
44
|
-
|
45
|
-
def preview_path
|
46
|
-
ActionMailer.deprecator.warn(<<-MSG.squish)
|
47
|
-
Using preview_path option is deprecated and will be removed in Rails 7.2.
|
48
|
-
Please use preview_paths instead.
|
49
|
-
MSG
|
50
|
-
self.preview_paths.first
|
51
|
-
end
|
52
|
-
|
53
29
|
# Register one or more Interceptors which will be called before mail is previewed.
|
54
30
|
def register_preview_interceptors(*interceptors)
|
55
31
|
interceptors.flatten.compact.each { |interceptor| register_preview_interceptor(interceptor) }
|
@@ -160,26 +160,6 @@ module ActionMailer
|
|
160
160
|
mailer = mailer.instance_variable_get(:@mailer)
|
161
161
|
end
|
162
162
|
|
163
|
-
if args.is_a?(Hash)
|
164
|
-
ActionMailer.deprecator.warn <<~MSG
|
165
|
-
Passing a Hash to the assert_enqueued_email_with :args kwarg causes the
|
166
|
-
Hash to be treated as params. This behavior is deprecated and will be
|
167
|
-
removed in Rails 7.2.
|
168
|
-
|
169
|
-
To specify a params Hash, use the :params kwarg:
|
170
|
-
|
171
|
-
assert_enqueued_email_with MyMailer, :my_method, params: { my_param: "value" }
|
172
|
-
|
173
|
-
Or, to specify named mailer args as a Hash, wrap the Hash in an array:
|
174
|
-
|
175
|
-
assert_enqueued_email_with MyMailer, :my_method, args: [{ my_arg: "value" }]
|
176
|
-
# OR
|
177
|
-
assert_enqueued_email_with MyMailer, :my_method, args: [my_arg: "value"]
|
178
|
-
MSG
|
179
|
-
|
180
|
-
params, args = args, nil
|
181
|
-
end
|
182
|
-
|
183
163
|
args = Array(args) unless args.is_a?(Proc)
|
184
164
|
queue ||= mailer.deliver_later_queue_name || ActiveJob::Base.default_queue_name
|
185
165
|
|
data/lib/action_mailer.rb
CHANGED
@@ -35,7 +35,7 @@ require "active_support/core_ext/module/attr_internal"
|
|
35
35
|
require "active_support/core_ext/string/inflections"
|
36
36
|
require "active_support/lazy_load_hooks"
|
37
37
|
|
38
|
-
# :include:
|
38
|
+
# :include: ../README.rdoc
|
39
39
|
module ActionMailer
|
40
40
|
extend ::ActiveSupport::Autoload
|
41
41
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actionmailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.2.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,118 +16,70 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 7.
|
19
|
+
version: 7.2.0.beta1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 7.
|
26
|
+
version: 7.2.0.beta1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: actionpack
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 7.
|
33
|
+
version: 7.2.0.beta1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 7.
|
40
|
+
version: 7.2.0.beta1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: actionview
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 7.
|
47
|
+
version: 7.2.0.beta1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 7.
|
54
|
+
version: 7.2.0.beta1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activejob
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 7.
|
61
|
+
version: 7.2.0.beta1
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 7.
|
68
|
+
version: 7.2.0.beta1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: mail
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '2.5'
|
76
|
-
- - ">="
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: 2.5.4
|
79
|
-
type: :runtime
|
80
|
-
prerelease: false
|
81
|
-
version_requirements: !ruby/object:Gem::Requirement
|
82
|
-
requirements:
|
83
|
-
- - "~>"
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '2.5'
|
86
|
-
- - ">="
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: 2.5.4
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: net-imap
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
92
|
-
requirements:
|
93
|
-
- - ">="
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '0'
|
96
|
-
type: :runtime
|
97
|
-
prerelease: false
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - ">="
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0'
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: net-pop
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - ">="
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
110
|
-
type: :runtime
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - ">="
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '0'
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: net-smtp
|
119
71
|
requirement: !ruby/object:Gem::Requirement
|
120
72
|
requirements:
|
121
73
|
- - ">="
|
122
74
|
- !ruby/object:Gem::Version
|
123
|
-
version:
|
75
|
+
version: 2.8.0
|
124
76
|
type: :runtime
|
125
77
|
prerelease: false
|
126
78
|
version_requirements: !ruby/object:Gem::Requirement
|
127
79
|
requirements:
|
128
80
|
- - ">="
|
129
81
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
82
|
+
version: 2.8.0
|
131
83
|
- !ruby/object:Gem::Dependency
|
132
84
|
name: rails-dom-testing
|
133
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -182,10 +134,10 @@ licenses:
|
|
182
134
|
- MIT
|
183
135
|
metadata:
|
184
136
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
185
|
-
changelog_uri: https://github.com/rails/rails/blob/v7.
|
186
|
-
documentation_uri: https://api.rubyonrails.org/v7.
|
137
|
+
changelog_uri: https://github.com/rails/rails/blob/v7.2.0.beta1/actionmailer/CHANGELOG.md
|
138
|
+
documentation_uri: https://api.rubyonrails.org/v7.2.0.beta1/
|
187
139
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
188
|
-
source_code_uri: https://github.com/rails/rails/tree/v7.
|
140
|
+
source_code_uri: https://github.com/rails/rails/tree/v7.2.0.beta1/actionmailer
|
189
141
|
rubygems_mfa_required: 'true'
|
190
142
|
post_install_message:
|
191
143
|
rdoc_options: []
|
@@ -195,7 +147,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
147
|
requirements:
|
196
148
|
- - ">="
|
197
149
|
- !ruby/object:Gem::Version
|
198
|
-
version:
|
150
|
+
version: 3.1.0
|
199
151
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
152
|
requirements:
|
201
153
|
- - ">="
|
@@ -203,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
155
|
version: '0'
|
204
156
|
requirements:
|
205
157
|
- none
|
206
|
-
rubygems_version: 3.5.
|
158
|
+
rubygems_version: 3.5.10
|
207
159
|
signing_key:
|
208
160
|
specification_version: 4
|
209
161
|
summary: Email composition and delivery framework (part of Rails).
|