Skip to content

Commit 66b88c5

Browse files
Change doc examples to doctests to fix inconsistencies
1 parent 68f4aa1 commit 66b88c5

File tree

6 files changed

+142
-85
lines changed

6 files changed

+142
-85
lines changed

lib/mail.ex

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,6 @@ defmodule Mail do
9595
end)
9696
end
9797

98-
def get_text(%Mail.Message{headers: %{"content-type" => "text/plain" <> _}} = message),
99-
do: message
100-
10198
def get_text(%Mail.Message{headers: %{"content-type" => ["text/plain" | _]}} = message),
10299
do: message
103100

@@ -261,8 +258,10 @@ defmodule Mail do
261258
@doc """
262259
Add a new `subject` header
263260
264-
Mail.put_subject(%Mail.Message{}, "Welcome to DockYard!")
265-
%Mail.Message{headers: %{subject: "Welcome to DockYard!"}}
261+
## Examples
262+
263+
iex> Mail.put_subject(%Mail.Message{}, "Welcome to DockYard!")
264+
%Mail.Message{headers: %{"subject" => "Welcome to DockYard!"}}
266265
"""
267266
def put_subject(message, subject),
268267
do: Mail.Message.put_header(message, "subject", subject)
@@ -279,15 +278,17 @@ defmodule Mail do
279278
Recipients can be added as a single string or a list of strings.
280279
The list of recipients will be concated to the previous value.
281280
282-
Mail.put_to(%Mail.Message{}, "[email protected]")
283-
%Mail.Message{headers: %{to: ["[email protected]"]}}
281+
## Examples
282+
283+
iex> Mail.put_to(%Mail.Message{}, "[email protected]")
284+
%Mail.Message{headers: %{"to" => ["[email protected]"]}}
284285
285-
Mail.put_to(%Mail.Message{}, ["[email protected]", "[email protected]"])
286-
%Mail.Message{headers: %{to: ["[email protected]", "[email protected]"]}}
286+
iex> Mail.put_to(%Mail.Message{}, ["[email protected]", "[email protected]"])
287+
%Mail.Message{headers: %{"to" => ["[email protected]", "[email protected]"]}}
287288
288-
Mail.put_to(%Mail.Message{}, "[email protected]")
289-
|> Mail.put_to(["[email protected]", "[email protected]"])
290-
%Mail.Message{headers: %{to: ["[email protected]", "[email protected]", "[email protected]"]}}
289+
iex> Mail.put_to(%Mail.Message{}, "[email protected]")
290+
iex> |> Mail.put_to(["[email protected]", "[email protected]"])
291+
%Mail.Message{headers: %{"to" => ["[email protected]", "[email protected]", "[email protected]"]}}
291292
292293
The value of a recipient must conform to either a string value or a tuple with two elements,
293294
otherwise an `ArgumentError` is raised.
@@ -319,15 +320,17 @@ defmodule Mail do
319320
Recipients can be added as a single string or a list of strings.
320321
The list of recipients will be concated to the previous value.
321322
322-
Mail.put_cc(%Mail.Message{}, "[email protected]")
323-
%Mail.Message{headers: %{cc: ["[email protected]"]}}
323+
## Examples
324324
325-
Mail.put_cc(%Mail.Message{}, ["[email protected]", "[email protected]"])
326-
%Mail.Message{headers: %{cc: ["one@example.com", "two@example.com"]}}
325+
iex> Mail.put_cc(%Mail.Message{}, "[email protected]")
326+
%Mail.Message{headers: %{"cc" => ["[email protected]"]}}
327327
328-
Mail.put_cc(%Mail.Message{}, "[email protected]")
329-
|> Mail.put_cc(["[email protected]", "[email protected]"])
330-
%Mail.Message{headers: %{cc: ["[email protected]", "[email protected]", "[email protected]"]}}
328+
iex> Mail.put_cc(%Mail.Message{}, ["[email protected]", "[email protected]"])
329+
%Mail.Message{headers: %{"cc" => ["[email protected]", "[email protected]"]}}
330+
331+
iex> Mail.put_cc(%Mail.Message{}, "[email protected]")
332+
iex> |> Mail.put_cc(["[email protected]", "[email protected]"])
333+
%Mail.Message{headers: %{"cc" => ["[email protected]", "[email protected]", "[email protected]"]}}
331334
332335
The value of a recipient must conform to either a string value or a tuple with two elements,
333336
otherwise an `ArgumentError` is raised.
@@ -359,15 +362,17 @@ defmodule Mail do
359362
Recipients can be added as a single string or a list of strings.
360363
The list of recipients will be concated to the previous value.
361364
362-
Mail.put_bcc(%Mail.Message{}, "[email protected]")
363-
%Mail.Message{headers: %{bcc: ["[email protected]"]}}
365+
## Examples
366+
367+
iex> Mail.put_bcc(%Mail.Message{}, "[email protected]")
368+
%Mail.Message{headers: %{"bcc" => ["[email protected]"]}}
364369
365-
Mail.put_bcc(%Mail.Message{}, ["[email protected]", "[email protected]"])
366-
%Mail.Message{headers: %{bcc: ["[email protected]", "[email protected]"]}}
370+
iex> Mail.put_bcc(%Mail.Message{}, ["[email protected]", "[email protected]"])
371+
%Mail.Message{headers: %{"bcc" => ["[email protected]", "[email protected]"]}}
367372
368-
Mail.put_bcc(%Mail.Message{}, "[email protected]")
369-
|> Mail.put_bcc(["[email protected]", "[email protected]"])
370-
%Mail.Message{headers: %{bcc: ["[email protected]", "[email protected]", "[email protected]"]}}
373+
iex> Mail.put_bcc(%Mail.Message{}, "[email protected]")
374+
iex> |> Mail.put_bcc(["[email protected]", "[email protected]"])
375+
%Mail.Message{headers: %{"bcc" => ["[email protected]", "[email protected]", "[email protected]"]}}
371376
372377
The value of a recipient must conform to either a string value or a tuple with two elements,
373378
otherwise an `ArgumentError` is raised.
@@ -396,8 +401,10 @@ defmodule Mail do
396401
@doc """
397402
Add a new `from` header
398403
399-
Mail.put_from(%Mail.Message{}, "[email protected]")
400-
%Mail.Message{headers: %{from: "[email protected]"}}
404+
## Examples
405+
406+
iex> Mail.put_from(%Mail.Message{}, "[email protected]")
407+
%Mail.Message{headers: %{"from" => "[email protected]"}}
401408
"""
402409
def put_from(message, sender),
403410
do: Mail.Message.put_header(message, "from", sender)
@@ -411,8 +418,10 @@ defmodule Mail do
411418
@doc """
412419
Add a new `reply-to` header
413420
414-
Mail.put_reply_to(%Mail.Message{}, "[email protected]")
415-
%Mail.Message{headers: %{reply_to: "[email protected]"}}
421+
## Examples
422+
423+
iex> Mail.put_reply_to(%Mail.Message{}, "[email protected]")
424+
%Mail.Message{headers: %{"reply-to" => "[email protected]"}}
416425
"""
417426
def put_reply_to(message, reply_address),
418427
do: Mail.Message.put_header(message, "reply-to", reply_address)

lib/mail/message.ex

Lines changed: 79 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ defmodule Mail.Message do
99
@doc """
1010
Add new part
1111
12-
Mail.Message.put_part(%Mail.Message{}, %Mail.Message{})
12+
## Examples
13+
14+
iex> Mail.Message.put_part(%Mail.Message{}, %Mail.Message{})
15+
%Mail.Message{parts: [%Mail.Message{}]}
1316
"""
1417
def put_part(message, %Mail.Message{} = part) do
1518
put_in(message.parts, message.parts ++ [part])
@@ -27,10 +30,14 @@ defmodule Mail.Message do
2730
@doc """
2831
Will match on a full or partial content type
2932
30-
Mail.Message.match_content_type?(message, ~r/text/)
33+
## Examples
34+
35+
iex> message = %Mail.Message{headers: %{"content-type" => ["text/plain", {"charset", "UTF-8"}]}}
36+
iex> Mail.Message.match_content_type?(message, ~r/text/)
3137
true
3238
33-
Mail.Message.match_content_type?(message, "text/html")
39+
iex> message = %Mail.Message{headers: %{"content-type" => ["text/plain", {"charset", "UTF-8"}]}}
40+
iex> Mail.Message.match_content_type?(message, "text/html")
3441
false
3542
"""
3643
def match_content_type?(message, string_or_regex)
@@ -52,7 +59,10 @@ defmodule Mail.Message do
5259
@doc """
5360
Add a new header key/value pair
5461
55-
Mail.Message.put_header(%Mail.Message{}, :content_type, "text/plain")
62+
## Examples
63+
64+
iex> Mail.Message.put_header(%Mail.Message{}, :content_type, "text/plain")
65+
%Mail.Message{headers: %{"content-type" => "text/plain"}}
5666
5767
The individual headers will be in the `headers` field on the
5868
`%Mail.Message{}` struct
@@ -72,7 +82,9 @@ defmodule Mail.Message do
7282
@doc """
7383
Deletes a specific header key
7484
75-
Mail.Message.delete_header(%Mail.Message{headers: %{foo: "bar"}}, :foo)
85+
## Examples
86+
87+
iex> Mail.Message.delete_header(%Mail.Message{headers: %{"foo" => "bar"}}, :foo)
7688
%Mail.Message{headers: %{}}
7789
"""
7890
def delete_header(message, header),
@@ -81,7 +93,9 @@ defmodule Mail.Message do
8193
@doc """
8294
Deletes a list of headers
8395
84-
Mail.Message.delete_headers(%Mail.Message{headers: %{foo: "bar", baz: "qux"}}, [:foo, :baz])
96+
## Examples
97+
98+
iex> Mail.Message.delete_headers(%Mail.Message{headers: %{"foo" => "bar", "baz" => "qux"}}, [:foo, :baz])
8599
%Mail.Message{headers: %{}}
86100
"""
87101
def delete_headers(message, headers)
@@ -104,24 +118,35 @@ defmodule Mail.Message do
104118
105119
The value will always be wrapped in a `List`
106120
107-
Mail.Message.put_content_type(%Mail.Message{}, "text/plain")
108-
%Mail.Message{headers: %{content_type: ["text/plain"]}}
121+
## Examples
122+
123+
iex> Mail.Message.put_content_type(%Mail.Message{}, "text/plain")
124+
%Mail.Message{headers: %{"content-type" => ["text/plain"]}}
125+
126+
iex> Mail.Message.put_content_type(%Mail.Message{}, ["text/plain", {"charset", "UTF-8"}])
127+
%Mail.Message{headers: %{"content-type" => ["text/plain", {"charset", "UTF-8"}]}}
109128
"""
110-
def put_content_type(message, content_type),
111-
do: put_header(message, :content_type, content_type)
129+
def put_content_type(message, content_type) when is_binary(content_type),
130+
do: put_content_type(message, [content_type])
131+
132+
def put_content_type(message, content_type) do
133+
put_header(message, :content_type, content_type)
134+
end
112135

113136
@doc """
114137
Gets the `content_type` from the header
115138
116139
Will ensure the `content_type` is always wrapped in a `List`
117140
118-
Mail.Message.get_content_type(%Mail.Message{})
141+
## Examples
142+
143+
iex> Mail.Message.get_content_type(%Mail.Message{})
119144
[""]
120145
121-
Mail.Message.get_content_type(%Mail.Message{content_type: "text/plain"})
146+
iex> Mail.Message.get_content_type(%Mail.Message{headers: %{"content-type" => "text/plain"}})
122147
["text/plain"]
123148
124-
Mail.Message.get_content_type(%Mail.Message{headers: %{content_type: ["multipart/mixed", {"boundary", "foobar"}]}})
149+
iex> Mail.Message.get_content_type(%Mail.Message{headers: %{"content-type" => ["multipart/mixed", {"boundary", "foobar"}]}})
125150
["multipart/mixed", {"boundary", "foobar"}]
126151
"""
127152
def get_content_type(message),
@@ -135,11 +160,13 @@ defmodule Mail.Message do
135160
Will overwrite existing `boundary` key in the list. Will preserve other
136161
values in the list
137162
138-
Mail.Message.put_boundary(%Mail.Message{}, "foobar")
139-
%Mail.Message{headers: %{content_type: ["", {"boundary", "foobar"}]}}
163+
## Examples
164+
165+
iex> Mail.Message.put_boundary(%Mail.Message{}, "foobar")
166+
%Mail.Message{headers: %{"content-type" => ["", {"boundary", "foobar"}]}}
140167
141-
Mail.Message.put_boundary(%Mail.Message{headers: %{content_type: ["multipart/mixed", {"boundary", "bazqux"}]}})
142-
%Mail.Message{headers: %{content_type: ["multipart/mixed", {"boundary", "foobar"}]}}
168+
iex> Mail.Message.put_boundary(%Mail.Message{headers: %{"content-type" => ["multipart/mixed", {"boundary", "bazqux"}]}}, "foobar")
169+
%Mail.Message{headers: %{"content-type" => ["multipart/mixed", {"boundary", "foobar"}]}}
143170
"""
144171
def put_boundary(message, boundary) do
145172
content_type =
@@ -154,10 +181,12 @@ defmodule Mail.Message do
154181
155182
Will retrieve the boundary value. If one is not set a random one is generated.
156183
157-
Mail.Message.get_boundary(%Mail.Message{headers: %{content_type: ["multipart/mixed", {"boundary", "foobar"}]}})
184+
## Examples
185+
186+
iex> Mail.Message.get_boundary(%Mail.Message{headers: %{"content-type" => ["multipart/mixed", {"boundary", "foobar"}]}})
158187
"foobar"
159188
160-
Mail.Message.get_boundary(%Mail.Message{headers: %{content_type: ["multipart/mixed"]}})
189+
iex> Mail.Message.get_boundary(%Mail.Message{headers: %{"content-type" => ["multipart/mixed", {"boundary", "ASDFSHNEW3473423"}]}})
161190
"ASDFSHNEW3473423"
162191
"""
163192
def get_boundary(message) do
@@ -177,7 +206,9 @@ defmodule Mail.Message do
177206
@doc """
178207
Sets the `body` field on the part
179208
180-
Mail.Message.put_body(%Mail.Message{}, "Some data")
209+
## Examples
210+
211+
iex> Mail.Message.put_body(%Mail.Message{}, "Some Data")
181212
%Mail.Message{body: "Some Data", headers: %{}}
182213
"""
183214
def put_body(part, body),
@@ -186,11 +217,13 @@ defmodule Mail.Message do
186217
@doc """
187218
Build a new text message
188219
189-
Mail.Message.build_text("Some text")
190-
%Mail.Message{body: "Some text", headers: %{content_type: "text/plain"}}
220+
## Examples
191221
192-
Mail.Message.build_text("Some text", charset: "UTF-8")
193-
%Mail.Message{body: "Some text", headers: %{content_type: ["text/plain", {"charset", "UTF-8"}]}}
222+
iex> Mail.Message.build_text("Some text")
223+
%Mail.Message{body: "Some text", headers: %{"content-type" => ["text/plain", {"charset", "UTF-8"}], "content-transfer-encoding" => :quoted_printable}}
224+
225+
iex> Mail.Message.build_text("Some text", charset: "us-ascii")
226+
%Mail.Message{body: "Some text", headers: %{"content-type" => ["text/plain", {"charset", "us-ascii"}], "content-transfer-encoding" => :quoted_printable}}
194227
195228
## Options
196229
@@ -214,11 +247,13 @@ defmodule Mail.Message do
214247
@doc """
215248
Build a new HTML message
216249
217-
Mail.Message.build_html("<h1>Some HTML</h1>")
218-
%Mail.Message{body: "<h1>Some HTML</h1>", headers: %{content_type: "text/html"}}
250+
## Examples
251+
252+
iex> Mail.Message.build_html("<h1>Some HTML</h1>")
253+
%Mail.Message{body: "<h1>Some HTML</h1>", headers: %{"content-type" => ["text/html", {"charset", "UTF-8"}], "content-transfer-encoding" => :quoted_printable}}
219254
220-
Mail.Message.build_html("<h1>Some HTML</h1>", charset: "UTF-8")
221-
%Mail.Message{body: "<h1>Some HTML</h1>", headers: %{content_type: ["text/html", {"charset", "UTF-8"}]}}
255+
iex> Mail.Message.build_html("<h1>Some HTML</h1>", charset: "UTF-8")
256+
%Mail.Message{body: "<h1>Some HTML</h1>", headers: %{"content-type" => ["text/html", {"charset", "UTF-8"}], "content-transfer-encoding" => :quoted_printable}}
222257
223258
## Options
224259
@@ -255,11 +290,13 @@ defmodule Mail.Message do
255290
256291
The mimetype of the file is determined by the file extension.
257292
258-
Mail.Message.build_attachment("README.md")
259-
%Mail.Message{data: "base64 encoded", headers: %{content_type: ["text/x-markdown"], content_disposition: ["attachment", filename: "README.md"], content_transfer_encoding: :base64}}
293+
## Examples
260294
261-
Mail.Message.build_attachment({"README.md", "file contents"})
262-
%Mail.Message{data: "base64 encoded", headers: %{content_type: ["text/x-markdown"], content_disposition: ["attachment", filename: "README.md"], content_transfer_encoding: :base64}}
295+
iex> message = Mail.Message.build_attachment("README.md")
296+
%Mail.Message{body: <<"# Mail\\n", _::binary>>, headers: %{"content-type" => ["text/markdown"], "content-disposition" => ["attachment", {"filename", "README.md"}], "content-transfer-encoding" => :base64}} = message
297+
298+
iex> message = Mail.Message.build_attachment({"README.md", "file contents"})
299+
%Mail.Message{body: "file contents", headers: %{"content-type" => ["text/markdown"], "content-disposition" => ["attachment", {"filename", "README.md"}], "content-transfer-encoding" => :base64}} = message
263300
264301
## Options
265302
@@ -297,18 +334,20 @@ defmodule Mail.Message do
297334
* `:headers` - Headers to be merged
298335
299336
## Examples
300-
Mail.Message.put_attachment(%Mail.Message{}, "README.md")
301-
%Mail.Message{data: "base64 encoded", headers: %{content_type: ["text/x-markdown"], content_disposition: ["attachment", filename: "README.md"], content_transfer_encoding: :base64}}
302337
303-
Mail.Message.put_attachment(%Mail.Message{}, {"README.md", "file contents"})
304-
%Mail.Message{data: "base64 encoded", headers: %{content_type: ["text/x-markdown"], content_disposition: ["attachment", filename: "README.md"], content_transfer_encoding: :base64}}
338+
iex> message = Mail.Message.put_attachment(%Mail.Message{}, "README.md")
339+
%Mail.Message{body: <<"# Mail\\n", _::binary>>, headers: %{"content-type" => ["text/markdown"], "content-disposition" => ["attachment", {"filename", "README.md"}], "content-transfer-encoding" => :base64}} = message
340+
341+
iex> Mail.Message.put_attachment(%Mail.Message{}, {"README.md", "file contents"})
342+
%Mail.Message{body: "file contents", headers: %{"content-type" => ["text/markdown"], "content-disposition" => ["attachment", {"filename", "README.md"}], "content-transfer-encoding" => :base64}}
305343
306344
### Adding custom headers
307-
Mail.Message.put_attachment(%Mail.Message{}, "README.md", headers: [content_id: "attachment-id"])
308-
%Mail.Message{data: "base64 encoded", headers: %{content_type: ["text/x-markdown"], content_disposition: ["attachment", filename: "README.md"], content_transfer_encoding: :base64, content_id: "attachment-id"}}
309345
310-
Mail.Message.put_attachment(%Mail.Message{}, {"README.md", data}, headers: [content_id: "attachment-id"])
311-
%Mail.Message{data: "base64 encoded", headers: %{content_type: ["text/x-markdown"], content_disposition: ["attachment", filename: "README.md"], content_transfer_encoding: :base64, content_id: "attachment-id"}}
346+
iex> message =Mail.Message.put_attachment(%Mail.Message{}, "README.md", headers: [content_id: "attachment-id"])
347+
%Mail.Message{body: <<"# Mail\\n", _::binary>>, headers: %{"content-type" => ["text/markdown"], "content-disposition" => ["attachment", {"filename", "README.md"}], "content-transfer-encoding" => :base64, "content-id" => "attachment-id"}} = message
348+
349+
iex> message = Mail.Message.put_attachment(%Mail.Message{}, {"README.md", "file contents"}, headers: [content_id: "attachment-id"])
350+
%Mail.Message{body: "file contents", headers: %{"content-type" => ["text/markdown"], "content-disposition" => ["attachment", {"filename", "README.md"}], "content-transfer-encoding" => :base64, "content-id" => "attachment-id"}} = message
312351
"""
313352
def put_attachment(message, path_or_file_tuple, opts \\ [])
314353

0 commit comments

Comments
 (0)