email_spec 2.2.2 → 2.3.1
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 +4 -4
- data/Changelog.md +14 -0
- data/README.md +11 -2
- data/features/step_definitions/app_steps.rb +4 -4
- data/lib/email_spec/extractors.rb +45 -0
- data/lib/email_spec/matchers.rb +25 -5
- data/lib/email_spec/version.rb +1 -1
- data/spec/email_spec/mail_ext_spec.rb +3 -2
- data/spec/email_spec/matchers_spec.rb +133 -5
- metadata +14 -21
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 45b6ba1ef662e1569eca4b9ec1dbaf0425b26cdcbe5e618dfa6e47c07473cad7
|
|
4
|
+
data.tar.gz: 1ac72ff510036911b33419ba25069a1116ce7558f6ffef4531e05c9745808019
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a6fd41035b3fa6644ae8789aaa11409f0ddbc8befe6f39ec1ed3672452a819995b2b8f3f316bbbdfbdbbc18496c2462bd08f4cb50ef28a7a7a86f19df103d0cf
|
|
7
|
+
data.tar.gz: 19204b91df3bdc3645d9481a014c7fed7ec780070748a756f6175e77273c19587326e0f17707ed6889e1d613470e2797ca7bc146ad6d4685ff4cb2685468ab6d
|
data/Changelog.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## 2.3.1 2026-03-21
|
|
2
|
+
|
|
3
|
+
* [Fix CC/BCC failing on nil `.cc` or `.bcc` values](https://github.com/email-spec/email-spec/pull/229)
|
|
4
|
+
* [Loosen dependency lock on htmlentities](https://github.com/email-spec/email-spec/pull/230)
|
|
5
|
+
* [Drop EOL Rails versions from appraisals, update CI matrix, and version bump](https://github.com/email-spec/email-spec/pull/231)
|
|
6
|
+
* [Update CI Badge in README.md](https://github.com/email-spec/email-spec/commit/eb2844f)
|
|
7
|
+
|
|
8
|
+
## 2.3.0 2024-07-21
|
|
9
|
+
|
|
10
|
+
* [Support the specified name and address for bcc_to and cc_to matchers](https://github.com/email-spec/email-spec/pull/212)
|
|
11
|
+
* [Allow launchy 3.x versions](https://github.com/email-spec/email-spec/pull/226)
|
|
12
|
+
* [Replace deprecated/removed File.exists? alias](https://github.com/email-spec/email-spec/pull/223)
|
|
13
|
+
* [Extend have_body_text matcher to be able to specify which part in multipart to check](https://github.com/email-spec/email-spec/pull/196)
|
|
14
|
+
|
|
1
15
|
## 2.2.2 2023-06-26
|
|
2
16
|
|
|
3
17
|
* [Defer accommodating different delivery methods to runtime](https://github.com/email-spec/email-spec/pull/224)
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
## Email Spec
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/email-spec/email-spec/actions/workflows/main.yml)
|
|
4
4
|
|
|
5
5
|
A collection of matchers for `RSpec`, `MiniTest` and `Cucumber` steps to make testing emails go smoothly.
|
|
6
6
|
|
|
@@ -302,6 +302,15 @@ expect(email).to have_body_text(/Hi Jojo Binks,/)
|
|
|
302
302
|
```
|
|
303
303
|
|
|
304
304
|
|
|
305
|
+
You can specify which part in multipart to check with `in_html_part` or
|
|
306
|
+
`in_text_part`.
|
|
307
|
+
|
|
308
|
+
```ruby
|
|
309
|
+
email = UserMailer.("jojo@yahoo.com", "Jojo Binks")
|
|
310
|
+
expect(email).to have_body_text(/This is html/).in_html_part
|
|
311
|
+
expect(email).to have_body_text(/This is text/).in_text_part
|
|
312
|
+
```
|
|
313
|
+
|
|
305
314
|
##### have_header(key, value)
|
|
306
315
|
|
|
307
316
|
This checks that the expected key/value pair is in the headers of the email.
|
|
@@ -6,13 +6,13 @@ Given /^the (\w+) app is setup with the latest email steps$/ do |app_name|
|
|
|
6
6
|
'email_steps.rb')
|
|
7
7
|
latest_specs_path = File.join(root_dir, 'lib', 'generators', 'email_spec',
|
|
8
8
|
'steps', 'templates','email_steps.rb')
|
|
9
|
-
FileUtils.rm(email_specs_path) if File.
|
|
9
|
+
FileUtils.rm(email_specs_path) if File.exist?(email_specs_path)
|
|
10
10
|
FileUtils.cp_r(latest_specs_path, email_specs_path)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
Then /^the (\w+) app should have the email steps in place$/ do |app_name|
|
|
14
14
|
email_specs_path = "#{root_dir}/examples/#{app_name}_root/features/step_definitions/email_steps.rb"
|
|
15
|
-
expect(File.
|
|
15
|
+
expect(File.exist?(email_specs_path)).to be true
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
Then /^I should see the following summary report:$/ do |expected_report|
|
|
@@ -22,7 +22,7 @@ end
|
|
|
22
22
|
Given /^the (\w+) app is setup with the latest generators$/ do |app_name|
|
|
23
23
|
app_dir= File.join(root_dir,'examples',"#{app_name}_root")
|
|
24
24
|
email_specs_path = File.join(app_dir,'features','step_definitions','email_steps.rb')
|
|
25
|
-
FileUtils.rm(email_specs_path) if File.
|
|
25
|
+
FileUtils.rm(email_specs_path) if File.exist?(email_specs_path)
|
|
26
26
|
|
|
27
27
|
if app_name == 'rails4'
|
|
28
28
|
#Testing using the gem
|
|
@@ -46,7 +46,7 @@ When /^I run "([^\"]*)" in the (\w+) app$/ do |cmd, app_name|
|
|
|
46
46
|
app_specific_gemfile = File.join(app_path,'Gemfile')
|
|
47
47
|
Dir.chdir(app_path) do
|
|
48
48
|
#hack to fight competing bundles (email specs vs rails4_root's
|
|
49
|
-
if File.
|
|
49
|
+
if File.exist? app_specific_gemfile
|
|
50
50
|
orig_gemfile = ENV['BUNDLE_GEMFILE']
|
|
51
51
|
ENV['BUNDLE_GEMFILE'] = app_specific_gemfile
|
|
52
52
|
@output = `#{cmd}`
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module EmailSpec
|
|
2
|
+
module Extractors
|
|
3
|
+
class Base
|
|
4
|
+
attr_accessor :mail
|
|
5
|
+
|
|
6
|
+
def initialize(mail)
|
|
7
|
+
@mail = mail
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def call
|
|
11
|
+
part_body ? HTMLEntities.new.decode(part_body) : ''
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def part_body
|
|
17
|
+
raise NotImplementedError
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class DefaultPartBody < Base
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def part_body
|
|
25
|
+
(mail.html_part || mail.text_part || mail).body
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class HtmlPartBody < Base
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def part_body
|
|
33
|
+
mail.html_part ? mail.html_part.body : nil
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class TextPartBody < Base
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def part_body
|
|
41
|
+
mail.text_part ? mail.text_part.body : nil
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
data/lib/email_spec/matchers.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require_relative 'extractors'
|
|
2
|
+
|
|
1
3
|
module EmailSpec
|
|
2
4
|
module Matchers
|
|
3
5
|
class EmailMatcher
|
|
@@ -128,7 +130,7 @@ module EmailSpec
|
|
|
128
130
|
|
|
129
131
|
def matches?(email)
|
|
130
132
|
@email = email
|
|
131
|
-
@actual_recipients = address_array{ email
|
|
133
|
+
@actual_recipients = address_array { email[:bcc]&.formatted }.sort
|
|
132
134
|
@actual_recipients == @expected_email_addresses
|
|
133
135
|
end
|
|
134
136
|
|
|
@@ -162,7 +164,7 @@ module EmailSpec
|
|
|
162
164
|
|
|
163
165
|
def matches?(email)
|
|
164
166
|
@email = email
|
|
165
|
-
@actual_recipients = address_array { email
|
|
167
|
+
@actual_recipients = address_array { email[:cc]&.formatted }.sort
|
|
166
168
|
@actual_recipients == @expected_email_addresses
|
|
167
169
|
end
|
|
168
170
|
|
|
@@ -274,6 +276,7 @@ module EmailSpec
|
|
|
274
276
|
|
|
275
277
|
def initialize(text)
|
|
276
278
|
@expected_text = text
|
|
279
|
+
@extractor = EmailSpec::Extractors::DefaultPartBody
|
|
277
280
|
end
|
|
278
281
|
|
|
279
282
|
def description
|
|
@@ -284,13 +287,23 @@ module EmailSpec
|
|
|
284
287
|
end
|
|
285
288
|
end
|
|
286
289
|
|
|
290
|
+
def in_html_part
|
|
291
|
+
@extractor = EmailSpec::Extractors::HtmlPartBody
|
|
292
|
+
self
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def in_text_part
|
|
296
|
+
@extractor = EmailSpec::Extractors::TextPartBody
|
|
297
|
+
self
|
|
298
|
+
end
|
|
299
|
+
|
|
287
300
|
def matches?(email)
|
|
288
301
|
if @expected_text.is_a?(String)
|
|
289
|
-
@given_text = email.
|
|
302
|
+
@given_text = @extractor.new(email).call.to_s.gsub(/\s+/, " ")
|
|
290
303
|
@expected_text = @expected_text.gsub(/\s+/, " ")
|
|
291
304
|
@given_text.include?(@expected_text)
|
|
292
305
|
else
|
|
293
|
-
@given_text = email.
|
|
306
|
+
@given_text = @extractor.new(email).call.to_s
|
|
294
307
|
!!(@given_text =~ @expected_text)
|
|
295
308
|
end
|
|
296
309
|
end
|
|
@@ -358,7 +371,14 @@ module EmailSpec
|
|
|
358
371
|
alias negative_failure_message failure_message_when_negated
|
|
359
372
|
|
|
360
373
|
def mail_headers_hash(email_headers)
|
|
361
|
-
email_headers.fields.inject({})
|
|
374
|
+
email_headers.fields.inject({}) do |hash, field|
|
|
375
|
+
if field.field.class.const_defined?('FIELD_NAME')
|
|
376
|
+
hash[field.field.class::FIELD_NAME] = field.to_s
|
|
377
|
+
else
|
|
378
|
+
hash[field.field.class::NAME.downcase] = field.to_s
|
|
379
|
+
end
|
|
380
|
+
hash
|
|
381
|
+
end
|
|
362
382
|
end
|
|
363
383
|
end
|
|
364
384
|
|
data/lib/email_spec/version.rb
CHANGED
|
@@ -39,8 +39,9 @@ describe EmailSpec::MailExt do
|
|
|
39
39
|
it "decodes parts before return" do
|
|
40
40
|
email = Mail.new(:body => "hello\r\nquoted-printable")
|
|
41
41
|
email.content_transfer_encoding = 'quoted-printable'
|
|
42
|
-
|
|
43
|
-
expect(email.
|
|
42
|
+
|
|
43
|
+
expect(email.encoded).to include("hello\r\nquoted-printable=")
|
|
44
|
+
expect(email.default_part_body).to eq("hello\nquoted-printable")
|
|
44
45
|
end
|
|
45
46
|
end
|
|
46
47
|
|
|
@@ -137,7 +137,7 @@ describe EmailSpec::Matchers do
|
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
it "should not match when the email does not have a sender" do
|
|
140
|
-
email = Mail::Message.new(:from =>
|
|
140
|
+
email = Mail::Message.new(:from => "johnshow@yahoo.com")
|
|
141
141
|
expect(deliver_from("jimmy_bean@yahoo.com")).not_to match(email)
|
|
142
142
|
end
|
|
143
143
|
|
|
@@ -178,6 +178,12 @@ describe EmailSpec::Matchers do
|
|
|
178
178
|
expect(bcc_to("jimmy_bean@yahoo.com")).to match(email)
|
|
179
179
|
end
|
|
180
180
|
|
|
181
|
+
it "should match when the email is set to deliver to the specified name and address" do
|
|
182
|
+
email = Mail::Message.new(:bcc => "Jimmy Bean <jimmy_bean@yahoo.com>")
|
|
183
|
+
|
|
184
|
+
expect(bcc_to("Jimmy Bean <jimmy_bean@yahoo.com>")).to match(email)
|
|
185
|
+
end
|
|
186
|
+
|
|
181
187
|
it "should match when a list of emails is exact same as all of the email's recipients" do
|
|
182
188
|
email = Mail::Message.new(:bcc => ["james@yahoo.com", "karen@yahoo.com"])
|
|
183
189
|
|
|
@@ -198,6 +204,11 @@ describe EmailSpec::Matchers do
|
|
|
198
204
|
expect(bcc_to(user)).to match(email)
|
|
199
205
|
end
|
|
200
206
|
|
|
207
|
+
it "should bcc to nobody when no BCC is specified" do
|
|
208
|
+
email = Mail::Message.new(to: "jimmy_bean@yahoo.com")
|
|
209
|
+
expect(bcc_to("jimmy_bean@yahoo.com")).not_to match(email)
|
|
210
|
+
end
|
|
211
|
+
|
|
201
212
|
it "should bcc to nobody when the email does not perform deliveries" do
|
|
202
213
|
email = Mail::Message.new(:bcc => "jimmy_bean@yahoo.com")
|
|
203
214
|
email.perform_deliveries = false
|
|
@@ -214,6 +225,12 @@ describe EmailSpec::Matchers do
|
|
|
214
225
|
expect(cc_to("jimmy_bean@yahoo.com")).to match(email)
|
|
215
226
|
end
|
|
216
227
|
|
|
228
|
+
it "should match when the email is set to deliver to the specified name and address" do
|
|
229
|
+
email = Mail::Message.new(:cc => "Jimmy Bean <jimmy_bean@yahoo.com>")
|
|
230
|
+
|
|
231
|
+
expect(cc_to("Jimmy Bean <jimmy_bean@yahoo.com>")).to match(email)
|
|
232
|
+
end
|
|
233
|
+
|
|
217
234
|
it "should match when a list of emails is exact same as all of the email's recipients" do
|
|
218
235
|
email = Mail::Message.new(:cc => ["james@yahoo.com", "karen@yahoo.com"])
|
|
219
236
|
|
|
@@ -234,6 +251,11 @@ describe EmailSpec::Matchers do
|
|
|
234
251
|
expect(cc_to(user)).to match(email)
|
|
235
252
|
end
|
|
236
253
|
|
|
254
|
+
it "should cc to nobody when no CC is specified" do
|
|
255
|
+
email = Mail::Message.new(to: "jimmy_bean@yahoo.com")
|
|
256
|
+
expect(cc_to("jimmy_bean@yahoo.com")).not_to match(email)
|
|
257
|
+
end
|
|
258
|
+
|
|
237
259
|
it "should cc to nobody when the email does not perform deliveries" do
|
|
238
260
|
email = Mail::Message.new(to: "jimmy_bean@yahoo.com")
|
|
239
261
|
email.perform_deliveries = false
|
|
@@ -454,6 +476,106 @@ describe EmailSpec::Matchers do
|
|
|
454
476
|
end
|
|
455
477
|
end
|
|
456
478
|
|
|
479
|
+
describe "#have_body_text", ".in_html_part" do
|
|
480
|
+
describe 'when html part is definded in mulitpart' do
|
|
481
|
+
it 'should match when the body matches regexp' do
|
|
482
|
+
email = Mail.new do
|
|
483
|
+
html_part do
|
|
484
|
+
body 'This is html'
|
|
485
|
+
end
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
expect(have_body_text(/This is html/).in_html_part).to match(email)
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
describe 'when text part is definded in mulitpart' do
|
|
493
|
+
it 'should not look at text part' do
|
|
494
|
+
email = Mail.new do
|
|
495
|
+
text_part do
|
|
496
|
+
body 'This is text'
|
|
497
|
+
end
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
expect(have_body_text(/This is text/).in_html_part).not_to match(email)
|
|
501
|
+
end
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
describe 'when html and text parts are definded in mulitpart' do
|
|
505
|
+
it 'should look at html part' do
|
|
506
|
+
email = Mail.new do
|
|
507
|
+
html_part do
|
|
508
|
+
body 'This is html'
|
|
509
|
+
end
|
|
510
|
+
text_part do
|
|
511
|
+
body 'This is text'
|
|
512
|
+
end
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
expect(have_body_text(/This is html/).in_html_part).to match(email)
|
|
516
|
+
expect(have_body_text(/This is text/).in_html_part).not_to match(email)
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
describe 'when nothing is defined in mulitpart' do
|
|
521
|
+
it 'should not look at any parts' do
|
|
522
|
+
email = Mail.new(body: 'This is body')
|
|
523
|
+
|
|
524
|
+
expect(have_body_text(/This is body/).in_html_part).not_to match(email)
|
|
525
|
+
end
|
|
526
|
+
end
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
describe "#have_body_text", ".in_text_part" do
|
|
530
|
+
describe 'when text part is definded in mulitpart' do
|
|
531
|
+
it 'should match when the body matches regexp' do
|
|
532
|
+
email = Mail.new do
|
|
533
|
+
text_part do
|
|
534
|
+
body 'This is text'
|
|
535
|
+
end
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
expect(have_body_text(/This is text/).in_text_part).to match(email)
|
|
539
|
+
end
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
describe 'when text and html parts are definded in mulitpart' do
|
|
543
|
+
it 'should look at text part' do
|
|
544
|
+
email = Mail.new do
|
|
545
|
+
text_part do
|
|
546
|
+
body 'This is text'
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
html_part do
|
|
550
|
+
body 'This is html'
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
expect(have_body_text(/This is text/).in_text_part).to match(email)
|
|
555
|
+
expect(have_body_text(/This is html/).in_text_part).not_to match(email)
|
|
556
|
+
end
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
describe 'when html part is definded in mulitpart' do
|
|
560
|
+
it 'should not look at html part' do
|
|
561
|
+
email = Mail.new do
|
|
562
|
+
html_part do
|
|
563
|
+
body "This is html"
|
|
564
|
+
end
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
expect(have_body_text(/This is html/).in_text_part).not_to match(email)
|
|
568
|
+
end
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
describe 'when nothing is defined in mulitpart' do
|
|
572
|
+
it 'should not look at any parts' do
|
|
573
|
+
email = Mail.new(body: 'This is body')
|
|
574
|
+
|
|
575
|
+
expect(have_body_text(/This is body/).in_text_part).not_to match(email)
|
|
576
|
+
end
|
|
577
|
+
end
|
|
578
|
+
end
|
|
457
579
|
describe "#have_header" do
|
|
458
580
|
describe "when regexps are used" do
|
|
459
581
|
it "should match when header matches passed in regexp" do
|
|
@@ -475,14 +597,14 @@ describe EmailSpec::Matchers do
|
|
|
475
597
|
matcher = have_header(:content_type, /bar/)
|
|
476
598
|
matcher.matches?(Mail::Message.new(:content_type => "text/html"))
|
|
477
599
|
|
|
478
|
-
expect(matcher_failure_message(matcher)).to eq('expected the headers to include \'content_type\' with a value matching /bar/ but they were
|
|
600
|
+
expect(matcher_failure_message(matcher)).to eq('expected the headers to include \'content_type\' with a value matching /bar/ but they were ' + actual_content_type)
|
|
479
601
|
end
|
|
480
602
|
|
|
481
603
|
it "should offer helpful negative failing messages" do
|
|
482
604
|
matcher = have_header(:content_type, /text/)
|
|
483
605
|
matcher.matches?(Mail::Message.new(:content_type => "text/html"))
|
|
484
606
|
|
|
485
|
-
expect(matcher_failure_message_when_negated(matcher)).to eq('expected the headers not to include \'content_type\' with a value matching /text/ but they were
|
|
607
|
+
expect(matcher_failure_message_when_negated(matcher)).to eq('expected the headers not to include \'content_type\' with a value matching /text/ but they were ' + actual_content_type)
|
|
486
608
|
end
|
|
487
609
|
end
|
|
488
610
|
|
|
@@ -506,15 +628,21 @@ describe EmailSpec::Matchers do
|
|
|
506
628
|
matcher = have_header(:content_type, 'text')
|
|
507
629
|
matcher.matches?(Mail::Message.new(:content_type => "text/html"))
|
|
508
630
|
|
|
509
|
-
expect(matcher_failure_message(matcher)).to eq('expected the headers to include \'content_type: text\' but they were
|
|
631
|
+
expect(matcher_failure_message(matcher)).to eq('expected the headers to include \'content_type: text\' but they were ' + actual_content_type)
|
|
510
632
|
end
|
|
511
633
|
|
|
512
634
|
it "should offer helpful negative failing messages" do
|
|
513
635
|
matcher = have_header(:content_type, 'text/html')
|
|
514
636
|
matcher.matches?(Mail::Message.new(:content_type => "text/html"))
|
|
515
637
|
|
|
516
|
-
matcher_failure_message_when_negated(matcher) == 'expected the headers not to include \'content_type: text/html\' but they were
|
|
638
|
+
matcher_failure_message_when_negated(matcher) == 'expected the headers not to include \'content_type: text/html\' but they were ' + actual_content_type
|
|
517
639
|
end
|
|
518
640
|
end
|
|
641
|
+
|
|
642
|
+
def actual_content_type
|
|
643
|
+
# TODO: Ruby 3.4 changed hash output format to include spaces
|
|
644
|
+
# Whenever support for 3.3 and earlier is dropped, this can convert back to a string
|
|
645
|
+
{'content-type' => 'text/html' }.inspect
|
|
646
|
+
end
|
|
519
647
|
end
|
|
520
648
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: email_spec
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ben Mabey
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2026-03-21 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: htmlentities
|
|
@@ -18,28 +18,34 @@ dependencies:
|
|
|
18
18
|
requirements:
|
|
19
19
|
- - "~>"
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
|
-
version: 4.3
|
|
21
|
+
version: '4.3'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
25
|
requirements:
|
|
26
26
|
- - "~>"
|
|
27
27
|
- !ruby/object:Gem::Version
|
|
28
|
-
version: 4.3
|
|
28
|
+
version: '4.3'
|
|
29
29
|
- !ruby/object:Gem::Dependency
|
|
30
30
|
name: launchy
|
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
|
32
32
|
requirements:
|
|
33
|
-
- - "
|
|
33
|
+
- - ">="
|
|
34
34
|
- !ruby/object:Gem::Version
|
|
35
35
|
version: '2.1'
|
|
36
|
+
- - "<"
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: '4.0'
|
|
36
39
|
type: :runtime
|
|
37
40
|
prerelease: false
|
|
38
41
|
version_requirements: !ruby/object:Gem::Requirement
|
|
39
42
|
requirements:
|
|
40
|
-
- - "
|
|
43
|
+
- - ">="
|
|
41
44
|
- !ruby/object:Gem::Version
|
|
42
45
|
version: '2.1'
|
|
46
|
+
- - "<"
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: '4.0'
|
|
43
49
|
- !ruby/object:Gem::Dependency
|
|
44
50
|
name: mail
|
|
45
51
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -82,20 +88,6 @@ dependencies:
|
|
|
82
88
|
- - "~>"
|
|
83
89
|
- !ruby/object:Gem::Version
|
|
84
90
|
version: 1.3.17
|
|
85
|
-
- !ruby/object:Gem::Dependency
|
|
86
|
-
name: actionmailer
|
|
87
|
-
requirement: !ruby/object:Gem::Requirement
|
|
88
|
-
requirements:
|
|
89
|
-
- - "~>"
|
|
90
|
-
- !ruby/object:Gem::Version
|
|
91
|
-
version: '4.2'
|
|
92
|
-
type: :development
|
|
93
|
-
prerelease: false
|
|
94
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
95
|
-
requirements:
|
|
96
|
-
- - "~>"
|
|
97
|
-
- !ruby/object:Gem::Version
|
|
98
|
-
version: '4.2'
|
|
99
91
|
- !ruby/object:Gem::Dependency
|
|
100
92
|
name: rack-test
|
|
101
93
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -278,6 +270,7 @@ files:
|
|
|
278
270
|
- lib/email_spec/deliveries.rb
|
|
279
271
|
- lib/email_spec/email_viewer.rb
|
|
280
272
|
- lib/email_spec/errors.rb
|
|
273
|
+
- lib/email_spec/extractors.rb
|
|
281
274
|
- lib/email_spec/helpers.rb
|
|
282
275
|
- lib/email_spec/mail_ext.rb
|
|
283
276
|
- lib/email_spec/matchers.rb
|
|
@@ -311,7 +304,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
311
304
|
- !ruby/object:Gem::Version
|
|
312
305
|
version: '0'
|
|
313
306
|
requirements: []
|
|
314
|
-
rubygems_version: 3.
|
|
307
|
+
rubygems_version: 3.5.10
|
|
315
308
|
signing_key:
|
|
316
309
|
specification_version: 4
|
|
317
310
|
summary: Easily test email in RSpec, Cucumber or Minitest
|