kbaum-mail 2.1.2.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.
Files changed (114) hide show
  1. data/CHANGELOG.rdoc +289 -0
  2. data/README.rdoc +575 -0
  3. data/Rakefile +72 -0
  4. data/TODO.rdoc +19 -0
  5. data/lib/mail.rb +113 -0
  6. data/lib/mail/attachments_list.rb +76 -0
  7. data/lib/mail/body.rb +243 -0
  8. data/lib/mail/configuration.rb +69 -0
  9. data/lib/mail/core_extensions/nil.rb +11 -0
  10. data/lib/mail/core_extensions/string.rb +19 -0
  11. data/lib/mail/elements/address.rb +306 -0
  12. data/lib/mail/elements/address_list.rb +74 -0
  13. data/lib/mail/elements/content_disposition_element.rb +30 -0
  14. data/lib/mail/elements/content_location_element.rb +25 -0
  15. data/lib/mail/elements/content_transfer_encoding_element.rb +21 -0
  16. data/lib/mail/elements/content_type_element.rb +35 -0
  17. data/lib/mail/elements/date_time_element.rb +26 -0
  18. data/lib/mail/elements/envelope_from_element.rb +34 -0
  19. data/lib/mail/elements/message_ids_element.rb +29 -0
  20. data/lib/mail/elements/mime_version_element.rb +26 -0
  21. data/lib/mail/elements/phrase_list.rb +21 -0
  22. data/lib/mail/elements/received_element.rb +30 -0
  23. data/lib/mail/encodings/base64.rb +18 -0
  24. data/lib/mail/encodings/encodings.rb +201 -0
  25. data/lib/mail/encodings/quoted_printable.rb +26 -0
  26. data/lib/mail/envelope.rb +35 -0
  27. data/lib/mail/field.rb +219 -0
  28. data/lib/mail/field_list.rb +33 -0
  29. data/lib/mail/fields/bcc_field.rb +53 -0
  30. data/lib/mail/fields/cc_field.rb +52 -0
  31. data/lib/mail/fields/comments_field.rb +41 -0
  32. data/lib/mail/fields/common/address_container.rb +16 -0
  33. data/lib/mail/fields/common/common_address.rb +128 -0
  34. data/lib/mail/fields/common/common_date.rb +51 -0
  35. data/lib/mail/fields/common/common_field.rb +64 -0
  36. data/lib/mail/fields/common/common_message_id.rb +57 -0
  37. data/lib/mail/fields/common/parameter_hash.rb +39 -0
  38. data/lib/mail/fields/content_description_field.rb +19 -0
  39. data/lib/mail/fields/content_disposition_field.rb +60 -0
  40. data/lib/mail/fields/content_id_field.rb +63 -0
  41. data/lib/mail/fields/content_location_field.rb +42 -0
  42. data/lib/mail/fields/content_transfer_encoding_field.rb +45 -0
  43. data/lib/mail/fields/content_type_field.rb +175 -0
  44. data/lib/mail/fields/date_field.rb +53 -0
  45. data/lib/mail/fields/from_field.rb +53 -0
  46. data/lib/mail/fields/in_reply_to_field.rb +52 -0
  47. data/lib/mail/fields/keywords_field.rb +43 -0
  48. data/lib/mail/fields/message_id_field.rb +80 -0
  49. data/lib/mail/fields/mime_version_field.rb +54 -0
  50. data/lib/mail/fields/optional_field.rb +11 -0
  51. data/lib/mail/fields/received_field.rb +62 -0
  52. data/lib/mail/fields/references_field.rb +53 -0
  53. data/lib/mail/fields/reply_to_field.rb +53 -0
  54. data/lib/mail/fields/resent_bcc_field.rb +53 -0
  55. data/lib/mail/fields/resent_cc_field.rb +53 -0
  56. data/lib/mail/fields/resent_date_field.rb +33 -0
  57. data/lib/mail/fields/resent_from_field.rb +53 -0
  58. data/lib/mail/fields/resent_message_id_field.rb +32 -0
  59. data/lib/mail/fields/resent_sender_field.rb +60 -0
  60. data/lib/mail/fields/resent_to_field.rb +53 -0
  61. data/lib/mail/fields/return_path_field.rb +62 -0
  62. data/lib/mail/fields/sender_field.rb +65 -0
  63. data/lib/mail/fields/structured_field.rb +36 -0
  64. data/lib/mail/fields/subject_field.rb +15 -0
  65. data/lib/mail/fields/to_field.rb +53 -0
  66. data/lib/mail/fields/unstructured_field.rb +117 -0
  67. data/lib/mail/header.rb +235 -0
  68. data/lib/mail/mail.rb +194 -0
  69. data/lib/mail/message.rb +1780 -0
  70. data/lib/mail/network/delivery_methods/file_delivery.rb +40 -0
  71. data/lib/mail/network/delivery_methods/sendmail.rb +62 -0
  72. data/lib/mail/network/delivery_methods/smtp.rb +110 -0
  73. data/lib/mail/network/delivery_methods/test_mailer.rb +40 -0
  74. data/lib/mail/network/retriever_methods/imap.rb +31 -0
  75. data/lib/mail/network/retriever_methods/pop3.rb +149 -0
  76. data/lib/mail/parsers/address_lists.rb +61 -0
  77. data/lib/mail/parsers/address_lists.treetop +19 -0
  78. data/lib/mail/parsers/content_disposition.rb +369 -0
  79. data/lib/mail/parsers/content_disposition.treetop +46 -0
  80. data/lib/mail/parsers/content_location.rb +133 -0
  81. data/lib/mail/parsers/content_location.treetop +20 -0
  82. data/lib/mail/parsers/content_transfer_encoding.rb +179 -0
  83. data/lib/mail/parsers/content_transfer_encoding.treetop +25 -0
  84. data/lib/mail/parsers/content_type.rb +512 -0
  85. data/lib/mail/parsers/content_type.treetop +58 -0
  86. data/lib/mail/parsers/date_time.rb +111 -0
  87. data/lib/mail/parsers/date_time.treetop +11 -0
  88. data/lib/mail/parsers/envelope_from.rb +188 -0
  89. data/lib/mail/parsers/envelope_from.treetop +32 -0
  90. data/lib/mail/parsers/message_ids.rb +42 -0
  91. data/lib/mail/parsers/message_ids.treetop +15 -0
  92. data/lib/mail/parsers/mime_version.rb +141 -0
  93. data/lib/mail/parsers/mime_version.treetop +19 -0
  94. data/lib/mail/parsers/phrase_lists.rb +42 -0
  95. data/lib/mail/parsers/phrase_lists.treetop +15 -0
  96. data/lib/mail/parsers/received.rb +68 -0
  97. data/lib/mail/parsers/received.treetop +11 -0
  98. data/lib/mail/parsers/rfc2045.rb +406 -0
  99. data/lib/mail/parsers/rfc2045.treetop +35 -0
  100. data/lib/mail/parsers/rfc2822.rb +5081 -0
  101. data/lib/mail/parsers/rfc2822.treetop +410 -0
  102. data/lib/mail/parsers/rfc2822_obsolete.rb +3607 -0
  103. data/lib/mail/parsers/rfc2822_obsolete.treetop +241 -0
  104. data/lib/mail/part.rb +82 -0
  105. data/lib/mail/parts_list.rb +34 -0
  106. data/lib/mail/patterns.rb +43 -0
  107. data/lib/mail/utilities.rb +163 -0
  108. data/lib/mail/vendor/treetop.rb +4 -0
  109. data/lib/mail/version.rb +10 -0
  110. data/lib/mail/version_specific/ruby_1_8.rb +84 -0
  111. data/lib/mail/version_specific/ruby_1_9.rb +77 -0
  112. data/lib/tasks/corpus.rake +125 -0
  113. data/lib/tasks/treetop.rake +10 -0
  114. metadata +188 -0
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+ module Mail
3
+ module Encodings
4
+ class QuotedPrintable
5
+
6
+ # Decode the string from Quoted-Printable
7
+ def self.decode(str)
8
+ str.unpack("M*").first
9
+ end
10
+
11
+ def self.encode(str)
12
+ str.gsub( /[^a-z ]/i ) { quoted_printable_encode($&) }
13
+ end
14
+
15
+ private
16
+
17
+ # Convert the given character to quoted printable format, taking into
18
+ # account multi-byte characters (if executing with $KCODE="u", for instance)
19
+ def self.quoted_printable_encode(character)
20
+ result = ""
21
+ character.each_byte { |b| result << "=%02X" % b }
22
+ result
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ #
3
+ # = Mail Envelope
4
+ #
5
+ # The Envelope class provides a field for the first line in an
6
+ # mbox file, that looks like "From mikel@test.lindsaar.net DATETIME"
7
+ #
8
+ # This envelope class reads that line, and turns it into an
9
+ # Envelope.from and Envelope.date for your use.
10
+ module Mail
11
+ class Envelope < StructuredField
12
+
13
+ def initialize(*args)
14
+ super(FIELD_NAME, strip_field(FIELD_NAME, args.last))
15
+ end
16
+
17
+ def tree
18
+ @element ||= Mail::EnvelopeFromElement.new(value)
19
+ @tree ||= @element.tree
20
+ end
21
+
22
+ def element
23
+ @element ||= Mail::EnvelopeFromElement.new(value)
24
+ end
25
+
26
+ def date
27
+ ::DateTime.parse("#{element.date_time}")
28
+ end
29
+
30
+ def from
31
+ element.address
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,219 @@
1
+ # encoding: utf-8
2
+ module Mail
3
+ # Provides a single class to call to create a new structured or unstructured
4
+ # field. Works out per RFC what field of field it is being given and returns
5
+ # the correct field of class back on new.
6
+ #
7
+ # ===Per RFC 2822
8
+ #
9
+ # 2.2. Header Fields
10
+ #
11
+ # Header fields are lines composed of a field name, followed by a colon
12
+ # (":"), followed by a field body, and terminated by CRLF. A field
13
+ # name MUST be composed of printable US-ASCII characters (i.e.,
14
+ # characters that have values between 33 and 126, inclusive), except
15
+ # colon. A field body may be composed of any US-ASCII characters,
16
+ # except for CR and LF. However, a field body may contain CRLF when
17
+ # used in header "folding" and "unfolding" as described in section
18
+ # 2.2.3. All field bodies MUST conform to the syntax described in
19
+ # sections 3 and 4 of this standard.
20
+ #
21
+ class Field
22
+
23
+ include Patterns
24
+ include Comparable
25
+
26
+ STRUCTURED_FIELDS = %w[ bcc cc content-description content-disposition
27
+ content-id content-location content-transfer-encoding
28
+ content-type date from in-reply-to keywords message-id
29
+ mime-version received references reply-to
30
+ resent-bcc resent-cc resent-date resent-from
31
+ resent-message-id resent-sender resent-to
32
+ return-path sender to ]
33
+
34
+ KNOWN_FIELDS = STRUCTURED_FIELDS + ['comments', 'subject']
35
+
36
+ # Generic Field Exception
37
+ class FieldError < StandardError
38
+ end
39
+
40
+ # Raised when a parsing error has occurred (ie, a StructuredField has tried
41
+ # to parse a field that is invalid or improperly written)
42
+ class ParseError < FieldError #:nodoc:
43
+ end
44
+
45
+ # Raised when attempting to set a structured field's contents to an invalid syntax
46
+ class SyntaxError < FieldError #:nodoc:
47
+ end
48
+
49
+ # Accepts a string:
50
+ #
51
+ # Field.new("field-name: field data")
52
+ #
53
+ # Or name, value pair:
54
+ #
55
+ # Field.new("field-name", "value")
56
+ #
57
+ # Or a name by itself:
58
+ #
59
+ # Field.new("field-name")
60
+ #
61
+ # Note, does not want a terminating carriage return. Returns
62
+ # self appropriately parsed. If value is not a string, then
63
+ # it will be passed through as is, for example, content-type
64
+ # field can accept an array with the type and a hash of
65
+ # parameters:
66
+ #
67
+ # Field.new('content-type', ['text', 'plain', {:charset => 'UTF-8'}])
68
+ def initialize(name, value = nil)
69
+ case
70
+ when name =~ /:/ && value.blank? # Field.new("field-name: field data")
71
+ name, value = split(name)
72
+ create_field(name, value)
73
+ when name !~ /:/ && value.blank? # Field.new("field-name")
74
+ create_field(name, nil)
75
+ else # Field.new("field-name", "value")
76
+ create_field(name, value)
77
+ end
78
+ return self
79
+ end
80
+
81
+ def field=(value)
82
+ @field = value
83
+ end
84
+
85
+ def field
86
+ @field
87
+ end
88
+
89
+ def name
90
+ field.name
91
+ end
92
+
93
+ def value
94
+ field.value
95
+ end
96
+
97
+ def value=(str)
98
+ create_field(name, str)
99
+ end
100
+
101
+ def to_s
102
+ field.to_s
103
+ end
104
+
105
+ def update(name, value)
106
+ create_field(name, value)
107
+ end
108
+
109
+ def same( other )
110
+ match_to_s(other.name, field.name)
111
+ end
112
+
113
+ def <=>( other )
114
+ self_order = FIELD_ORDER.rindex(self.name.to_s.downcase) || 100
115
+ other_order = FIELD_ORDER.rindex(other.name.to_s.downcase) || 100
116
+ self_order <=> other_order
117
+ end
118
+
119
+ def method_missing(name, *args, &block)
120
+ field.send(name, *args, &block)
121
+ end
122
+
123
+ FIELD_ORDER = %w[ return-path received
124
+ resent-date resent-from resent-sender resent-to
125
+ resent-cc resent-bcc resent-message-id
126
+ date from sender reply-to to cc bcc
127
+ message-id in-reply-to references
128
+ subject comments keywords
129
+ mime-version content-type content-transfer-encoding
130
+ content-location content-disposition content-description ]
131
+
132
+ private
133
+
134
+ def split(raw_field)
135
+ match_data = raw_field.match(/^(#{FIELD_NAME})\s*:\s*(#{FIELD_BODY})?$/)
136
+ [match_data[1].to_s.strip, match_data[2].to_s.strip]
137
+ rescue
138
+ STDERR.puts "WARNING: Could not parse (and so ignorning) '#{raw_field}'"
139
+ end
140
+
141
+ def create_field(name, value)
142
+ begin
143
+ self.field = new_field(name, value)
144
+ rescue
145
+ self.field = Mail::UnstructuredField.new(name, value)
146
+ end
147
+ end
148
+
149
+ def new_field(name, value)
150
+ # Could do this with constantize and make it "as DRY as", but a simple case
151
+ # statement is, well, simpler...
152
+ case name.to_s
153
+ when /^to$/i
154
+ ToField.new(name, value)
155
+ when /^cc$/i
156
+ CcField.new(name, value)
157
+ when /^bcc$/i
158
+ BccField.new(name, value)
159
+ when /^message-id$/i
160
+ MessageIdField.new(name, value)
161
+ when /^in-reply-to$/i
162
+ InReplyToField.new(name, value)
163
+ when /^references$/i
164
+ ReferencesField.new(name, value)
165
+ when /^subject$/i
166
+ SubjectField.new(name, value)
167
+ when /^comments$/i
168
+ CommentsField.new(name, value)
169
+ when /^keywords$/i
170
+ KeywordsField.new(name, value)
171
+ when /^date$/i
172
+ DateField.new(name, value)
173
+ when /^from$/i
174
+ FromField.new(name, value)
175
+ when /^sender$/i
176
+ SenderField.new(name, value)
177
+ when /^reply-to$/i
178
+ ReplyToField.new(name, value)
179
+ when /^resent-date$/i
180
+ ResentDateField.new(name, value)
181
+ when /^resent-from$/i
182
+ ResentFromField.new(name, value)
183
+ when /^resent-sender$/i
184
+ ResentSenderField.new(name, value)
185
+ when /^resent-to$/i
186
+ ResentToField.new(name, value)
187
+ when /^resent-cc$/i
188
+ ResentCcField.new(name, value)
189
+ when /^resent-bcc$/i
190
+ ResentBccField.new(name, value)
191
+ when /^resent-message-id$/i
192
+ ResentMessageIdField.new(name, value)
193
+ when /^return-path$/i
194
+ ReturnPathField.new(name, value)
195
+ when /^received$/i
196
+ ReceivedField.new(name, value)
197
+ when /^mime-version$/i
198
+ MimeVersionField.new(name, value)
199
+ when /^content-transfer-encoding$/i
200
+ ContentTransferEncodingField.new(name, value)
201
+ when /^content-description$/i
202
+ ContentDescriptionField.new(name, value)
203
+ when /^content-disposition$/i
204
+ ContentDispositionField.new(name, value)
205
+ when /^content-type$/i
206
+ ContentTypeField.new(name, value)
207
+ when /^content-id$/i
208
+ ContentIdField.new(name, value)
209
+ when /^content-location$/i
210
+ ContentLocationField.new(name, value)
211
+ else
212
+ OptionalField.new(name, value)
213
+ end
214
+
215
+ end
216
+
217
+ end
218
+
219
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ module Mail
3
+
4
+ # Field List class provides an enhanced array that keeps a list of
5
+ # email fields in order. And allows you to insert new fields without
6
+ # having to worry about the order they will appear in.
7
+ class FieldList < Array
8
+
9
+ include Enumerable
10
+
11
+ def <<( new_field )
12
+ current_entry = self.rindex(new_field.name)
13
+ if current_entry
14
+ self.insert((current_entry + 1), new_field)
15
+ else
16
+ insert_idx = -1
17
+ self.each_with_index do |item, idx|
18
+ case item <=> new_field
19
+ when -1
20
+ next
21
+ when 0
22
+ next
23
+ when 1
24
+ insert_idx = idx
25
+ break
26
+ end
27
+ end
28
+ insert(insert_idx, new_field)
29
+ end
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+ #
3
+ # = Blind Carbon Copy Field
4
+ #
5
+ # The Bcc field inherits from StructuredField and handles the Bcc: header
6
+ # field in the email.
7
+ #
8
+ # Sending bcc to a mail message will instantiate a Mail::Field object that
9
+ # has a BccField as it's field type. This includes all Mail::CommonAddress
10
+ # module instance metods.
11
+ #
12
+ # Only one Bcc field can appear in a header, though it can have multiple
13
+ # addresses and groups of addresses.
14
+ #
15
+ # == Examples:
16
+ #
17
+ # mail = Mail.new
18
+ # mail.bcc = 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
19
+ # mail.bcc #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
20
+ # mail[:bcc] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::BccField:0x180e1c4
21
+ # mail['bcc'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::BccField:0x180e1c4
22
+ # mail['Bcc'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::BccField:0x180e1c4
23
+ #
24
+ # mail[:bcc].encoded #=> '' # Bcc field does not get output into an email
25
+ # mail[:bcc].decoded #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
26
+ # mail[:bcc].addresses #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
27
+ # mail[:bcc].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
28
+ #
29
+ module Mail
30
+ class BccField < StructuredField
31
+
32
+ include Mail::CommonAddress
33
+
34
+ FIELD_NAME = 'bcc'
35
+ CAPITALIZED_FIELD = 'Bcc'
36
+
37
+ def initialize(*args)
38
+ super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, args.last))
39
+ self.parse
40
+ self
41
+ end
42
+
43
+ # Bcc field should never be :encoded
44
+ def encoded
45
+ ''
46
+ end
47
+
48
+ def decoded
49
+ do_decode
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+ #
3
+ # = Carbon Copy Field
4
+ #
5
+ # The Cc field inherits from StructuredField and handles the Cc: header
6
+ # field in the email.
7
+ #
8
+ # Sending cc to a mail message will instantiate a Mail::Field object that
9
+ # has a CcField as it's field type. This includes all Mail::CommonAddress
10
+ # module instance metods.
11
+ #
12
+ # Only one Cc field can appear in a header, though it can have multiple
13
+ # addresses and groups of addresses.
14
+ #
15
+ # == Examples:
16
+ #
17
+ # mail = Mail.new
18
+ # mail.cc = 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
19
+ # mail.cc #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
20
+ # mail[:cc] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CcField:0x180e1c4
21
+ # mail['cc'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CcField:0x180e1c4
22
+ # mail['Cc'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CcField:0x180e1c4
23
+ #
24
+ # mail[:cc].encoded #=> 'Cc: Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net\r\n'
25
+ # mail[:cc].decoded #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
26
+ # mail[:cc].addresses #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
27
+ # mail[:cc].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
28
+ #
29
+ module Mail
30
+ class CcField < StructuredField
31
+
32
+ include Mail::CommonAddress
33
+
34
+ FIELD_NAME = 'cc'
35
+ CAPITALIZED_FIELD = 'Cc'
36
+
37
+ def initialize(*args)
38
+ super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, args.last))
39
+ self.parse
40
+ self
41
+ end
42
+
43
+ def encoded
44
+ do_encode(CAPITALIZED_FIELD)
45
+ end
46
+
47
+ def decoded
48
+ do_decode
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ #
3
+ # = Comments Field
4
+ #
5
+ # The Comments field inherits from UnstructuredField and handles the Comments:
6
+ # header field in the email.
7
+ #
8
+ # Sending comments to a mail message will instantiate a Mail::Field object that
9
+ # has a CommentsField as it's field type.
10
+ #
11
+ # An email header can have as many comments fields as it wants. There is no upper
12
+ # limit, the comments field is also optional (that is, no comment is needed)
13
+ #
14
+ # == Examples:
15
+ #
16
+ # mail = Mail.new
17
+ # mail.comments = 'This is a comment'
18
+ # mail.comments #=> 'This is a comment'
19
+ # mail[:comments] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CommentsField:0x180e1c4
20
+ # mail['comments'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CommentsField:0x180e1c4
21
+ # mail['comments'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CommentsField:0x180e1c4
22
+ #
23
+ # mail.comments = "This is another comment"
24
+ # mail[:comments].map { |c| c.to_s }
25
+ # #=> ['This is a comment', "This is another comment"]
26
+ #
27
+ module Mail
28
+ class CommentsField < UnstructuredField
29
+
30
+ FIELD_NAME = 'comments'
31
+ CAPITALIZED_FIELD = 'Comments'
32
+
33
+ def initialize(*args)
34
+ super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, args.last))
35
+ self.parse
36
+ self
37
+
38
+ end
39
+
40
+ end
41
+ end