Skip to content

Commit 24e929f

Browse files
committed
move command data formatters to net/imap/command_data
Partially implements #10.
1 parent 746757b commit 24e929f

File tree

2 files changed

+193
-184
lines changed

2 files changed

+193
-184
lines changed

lib/net/imap.rb

Lines changed: 1 addition & 184 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
rescue LoadError
2323
end
2424

25+
require_relative "imap/command_data"
2526
require_relative "imap/response_data"
2627
require_relative "imap/response_parser"
2728

@@ -1612,190 +1613,6 @@ def start_tls_session(params = {})
16121613
end
16131614
end
16141615

1615-
class RawData # :nodoc:
1616-
def send_data(imap, tag)
1617-
imap.__send__(:put_string, @data)
1618-
end
1619-
1620-
def validate
1621-
end
1622-
1623-
private
1624-
1625-
def initialize(data)
1626-
@data = data
1627-
end
1628-
end
1629-
1630-
class Atom # :nodoc:
1631-
def send_data(imap, tag)
1632-
imap.__send__(:put_string, @data)
1633-
end
1634-
1635-
def validate
1636-
end
1637-
1638-
private
1639-
1640-
def initialize(data)
1641-
@data = data
1642-
end
1643-
end
1644-
1645-
class QuotedString # :nodoc:
1646-
def send_data(imap, tag)
1647-
imap.__send__(:send_quoted_string, @data)
1648-
end
1649-
1650-
def validate
1651-
end
1652-
1653-
private
1654-
1655-
def initialize(data)
1656-
@data = data
1657-
end
1658-
end
1659-
1660-
class Literal # :nodoc:
1661-
def send_data(imap, tag)
1662-
imap.__send__(:send_literal, @data, tag)
1663-
end
1664-
1665-
def validate
1666-
end
1667-
1668-
private
1669-
1670-
def initialize(data)
1671-
@data = data
1672-
end
1673-
end
1674-
1675-
class MessageSet # :nodoc:
1676-
def send_data(imap, tag)
1677-
imap.__send__(:put_string, format_internal(@data))
1678-
end
1679-
1680-
def validate
1681-
validate_internal(@data)
1682-
end
1683-
1684-
private
1685-
1686-
def initialize(data)
1687-
@data = data
1688-
end
1689-
1690-
def format_internal(data)
1691-
case data
1692-
when "*"
1693-
return data
1694-
when Integer
1695-
if data == -1
1696-
return "*"
1697-
else
1698-
return data.to_s
1699-
end
1700-
when Range
1701-
return format_internal(data.first) +
1702-
":" + format_internal(data.last)
1703-
when Array
1704-
return data.collect {|i| format_internal(i)}.join(",")
1705-
when ThreadMember
1706-
return data.seqno.to_s +
1707-
":" + data.children.collect {|i| format_internal(i).join(",")}
1708-
end
1709-
end
1710-
1711-
def validate_internal(data)
1712-
case data
1713-
when "*"
1714-
when Integer
1715-
NumValidator.ensure_nz_number(data)
1716-
when Range
1717-
when Array
1718-
data.each do |i|
1719-
validate_internal(i)
1720-
end
1721-
when ThreadMember
1722-
data.children.each do |i|
1723-
validate_internal(i)
1724-
end
1725-
else
1726-
raise DataFormatError, data.inspect
1727-
end
1728-
end
1729-
end
1730-
1731-
class ClientID # :nodoc:
1732-
1733-
def send_data(imap, tag)
1734-
imap.__send__(:send_data, format_internal(@data), tag)
1735-
end
1736-
1737-
def validate
1738-
validate_internal(@data)
1739-
end
1740-
1741-
private
1742-
1743-
def initialize(data)
1744-
@data = data
1745-
end
1746-
1747-
def validate_internal(client_id)
1748-
client_id.to_h.each do |k,v|
1749-
unless StringFormatter.valid_string?(k)
1750-
raise DataFormatError, client_id.inspect
1751-
end
1752-
end
1753-
rescue NoMethodError, TypeError # to_h failed
1754-
raise DataFormatError, client_id.inspect
1755-
end
1756-
1757-
def format_internal(client_id)
1758-
return nil if client_id.nil?
1759-
client_id.to_h.flat_map {|k,v|
1760-
[StringFormatter.string(k), StringFormatter.nstring(v)]
1761-
}
1762-
end
1763-
1764-
end
1765-
1766-
module StringFormatter
1767-
1768-
LITERAL_REGEX = /[\x80-\xff\r\n]/n
1769-
1770-
module_function
1771-
1772-
# Allows symbols in addition to strings
1773-
def valid_string?(str)
1774-
str.is_a?(Symbol) || str.respond_to?(:to_str)
1775-
end
1776-
1777-
# Allows nil, symbols, and strings
1778-
def valid_nstring?(str)
1779-
str.nil? || valid_string?(str)
1780-
end
1781-
1782-
# coerces using +to_s+
1783-
def string(str)
1784-
str = str.to_s
1785-
if str =~ LITERAL_REGEX
1786-
Literal.new(str)
1787-
else
1788-
QuotedString.new(str)
1789-
end
1790-
end
1791-
1792-
# coerces non-nil using +to_s+
1793-
def nstring(str)
1794-
str.nil? ? nil : string(str)
1795-
end
1796-
1797-
end
1798-
17991616
# Common validators of number and nz_number types
18001617
module NumValidator # :nodoc
18011618
class << self

lib/net/imap/command_data.rb

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
# frozen_string_literal: true
2+
3+
module Net
4+
class IMAP < Protocol
5+
6+
7+
class RawData # :nodoc:
8+
def send_data(imap, tag)
9+
imap.__send__(:put_string, @data)
10+
end
11+
12+
def validate
13+
end
14+
15+
private
16+
17+
def initialize(data)
18+
@data = data
19+
end
20+
end
21+
22+
class Atom # :nodoc:
23+
def send_data(imap, tag)
24+
imap.__send__(:put_string, @data)
25+
end
26+
27+
def validate
28+
end
29+
30+
private
31+
32+
def initialize(data)
33+
@data = data
34+
end
35+
end
36+
37+
class QuotedString # :nodoc:
38+
def send_data(imap, tag)
39+
imap.__send__(:send_quoted_string, @data)
40+
end
41+
42+
def validate
43+
end
44+
45+
private
46+
47+
def initialize(data)
48+
@data = data
49+
end
50+
end
51+
52+
class Literal # :nodoc:
53+
def send_data(imap, tag)
54+
imap.__send__(:send_literal, @data, tag)
55+
end
56+
57+
def validate
58+
end
59+
60+
private
61+
62+
def initialize(data)
63+
@data = data
64+
end
65+
end
66+
67+
class MessageSet # :nodoc:
68+
def send_data(imap, tag)
69+
imap.__send__(:put_string, format_internal(@data))
70+
end
71+
72+
def validate
73+
validate_internal(@data)
74+
end
75+
76+
private
77+
78+
def initialize(data)
79+
@data = data
80+
end
81+
82+
def format_internal(data)
83+
case data
84+
when "*"
85+
return data
86+
when Integer
87+
if data == -1
88+
return "*"
89+
else
90+
return data.to_s
91+
end
92+
when Range
93+
return format_internal(data.first) +
94+
":" + format_internal(data.last)
95+
when Array
96+
return data.collect {|i| format_internal(i)}.join(",")
97+
when ThreadMember
98+
return data.seqno.to_s +
99+
":" + data.children.collect {|i| format_internal(i).join(",")}
100+
end
101+
end
102+
103+
def validate_internal(data)
104+
case data
105+
when "*"
106+
when Integer
107+
NumValidator.ensure_nz_number(data)
108+
when Range
109+
when Array
110+
data.each do |i|
111+
validate_internal(i)
112+
end
113+
when ThreadMember
114+
data.children.each do |i|
115+
validate_internal(i)
116+
end
117+
else
118+
raise DataFormatError, data.inspect
119+
end
120+
end
121+
end
122+
123+
class ClientID # :nodoc:
124+
125+
def send_data(imap, tag)
126+
imap.__send__(:send_data, format_internal(@data), tag)
127+
end
128+
129+
def validate
130+
validate_internal(@data)
131+
end
132+
133+
private
134+
135+
def initialize(data)
136+
@data = data
137+
end
138+
139+
def validate_internal(client_id)
140+
client_id.to_h.each do |k,v|
141+
unless StringFormatter.valid_string?(k)
142+
raise DataFormatError, client_id.inspect
143+
end
144+
end
145+
rescue NoMethodError, TypeError # to_h failed
146+
raise DataFormatError, client_id.inspect
147+
end
148+
149+
def format_internal(client_id)
150+
return nil if client_id.nil?
151+
client_id.to_h.flat_map {|k,v|
152+
[StringFormatter.string(k), StringFormatter.nstring(v)]
153+
}
154+
end
155+
156+
end
157+
158+
module StringFormatter
159+
160+
LITERAL_REGEX = /[\x80-\xff\r\n]/n
161+
162+
module_function
163+
164+
# Allows symbols in addition to strings
165+
def valid_string?(str)
166+
str.is_a?(Symbol) || str.respond_to?(:to_str)
167+
end
168+
169+
# Allows nil, symbols, and strings
170+
def valid_nstring?(str)
171+
str.nil? || valid_string?(str)
172+
end
173+
174+
# coerces using +to_s+
175+
def string(str)
176+
str = str.to_s
177+
if str =~ LITERAL_REGEX
178+
Literal.new(str)
179+
else
180+
QuotedString.new(str)
181+
end
182+
end
183+
184+
# coerces non-nil using +to_s+
185+
def nstring(str)
186+
str.nil? ? nil : string(str)
187+
end
188+
189+
end
190+
191+
end
192+
end

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy