plain_text 0.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.
@@ -0,0 +1,353 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ # Author: M. Sakano (Wise Babel Ltd)
4
+
5
+ require 'plain_text'
6
+
7
+ $stdout.sync=true
8
+ $stderr.sync=true
9
+ # print '$LOAD_PATH=';p $LOAD_PATH
10
+
11
+ #################################################
12
+ # Unit Test
13
+ #################################################
14
+
15
+ #if $0 == __FILE__
16
+ gem "minitest"
17
+ # require 'minitest/unit'
18
+ require 'minitest/autorun'
19
+ # MiniTest::Unit.autorun
20
+
21
+ class TestUnitPlainTextPart < MiniTest::Test
22
+ T = true
23
+ F = false
24
+ SCFNAME = File.basename(__FILE__)
25
+ Pt = PlainText::Part
26
+
27
+ def setup
28
+ end
29
+
30
+ def teardown
31
+ end
32
+
33
+ def test_new01
34
+ a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
35
+ ap1 = ["a", "b", "c"]
36
+ ab1 = [ "\n\n\n", "\n\n\n", "\n\n"]
37
+ a2 = ["a", "\n\n\n", "b", "\n\n\n", "c"]
38
+ ap2 = ap1
39
+ ab2 = [ "\n\n\n", "\n\n\n", ""]
40
+
41
+ pt1 = Pt.new(a1)
42
+ # p a1
43
+ # p a1.class
44
+ # p a1.object_id
45
+ # p pt1
46
+ # p pt1.class
47
+ # p pt1.object_id
48
+ # p pt1.to_a
49
+ # p pt1.to_a.object_id
50
+ # p pt1.to_a.class
51
+ assert_equal a1[0], pt1[0]
52
+ assert_equal a1[1], pt1[1]
53
+ assert_equal ap1, pt1.parts
54
+ assert_equal ab1, pt1.boundaries
55
+ assert_equal a1, pt1.to_a
56
+ assert_operator a1, '!=', pt1
57
+ assert_operator pt1, '!=', a1
58
+
59
+ pt2 = Pt.new(a2)
60
+ assert_equal a2[0], pt2[0]
61
+ assert_equal a2[2], pt2[2]
62
+ assert_equal ap2, pt2.parts
63
+ assert_equal ab2, pt2.boundaries
64
+ assert_equal a2+[""], pt2.to_a # An empty String is appended.
65
+ assert_operator a2, '!=', pt2
66
+ assert_operator pt2, '!=', a2
67
+ end
68
+
69
+ def test_new02
70
+ a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
71
+ ap1 = ["a", "b", "c"]
72
+ ab1 = [ "\n\n\n", "\n\n\n", "\n\n"]
73
+ a2 = ["a", "\n\n\n", "b", "\n\n\n", "c"]
74
+ ap2 = ap1
75
+ ab2 = [ "\n\n\n", "\n\n\n", ""]
76
+
77
+ pt11 = Pt.new(a1)
78
+ pt12 = Pt.new(ap1, ab1)
79
+ assert_equal pt11, pt12
80
+ pt21 = Pt.new(a2)
81
+ pt22 = Pt.new(ap2, ab2)
82
+ assert_equal pt21, pt22
83
+ end
84
+
85
+ def test_size2extract01
86
+ a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
87
+ pt1 = Pt.new(a1)
88
+ assert_equal 1, pt1.send(:size2extract, 0, 1, ignore_error: false, skip_renormalize: false)
89
+ assert_equal 0, pt1.send(:size2extract, 9, 1, ignore_error: false, skip_renormalize: false)
90
+ assert_equal 1, pt1.send(:size2extract, -1, 1, ignore_error: false, skip_renormalize: false)
91
+ assert_equal 1, pt1.send(:size2extract, -1, 5, ignore_error: false, skip_renormalize: false)
92
+ assert_equal 1, pt1.send(:size2extract, 5, 9, ignore_error: false, skip_renormalize: false)
93
+ assert_equal 1, pt1.send(:size2extract, -1, 9, ignore_error: false, skip_renormalize: false)
94
+ assert_equal 0, pt1.send(:size2extract, 8, 9, ignore_error: false, skip_renormalize: false)
95
+ assert_equal 2, pt1.send(:size2extract, (0..1), ignore_error: false, skip_renormalize: false)
96
+ assert_equal 2, pt1.send(:size2extract, (0...2), ignore_error: false, skip_renormalize: false)
97
+ assert_equal 6, pt1.send(:size2extract, (0..-1), ignore_error: false, skip_renormalize: false)
98
+ assert_equal 0, pt1.send(:size2extract, (0..-1), ignore_error: false, skip_renormalize: true)
99
+ assert_equal 4, pt1.send(:size2extract, (0...-2), ignore_error: false, skip_renormalize: false)
100
+ assert_equal 0, pt1.send(:size2extract, (2..1), ignore_error: false, skip_renormalize: false)
101
+ assert_equal 1, pt1.send(:size2extract, (5..9), ignore_error: false, skip_renormalize: false)
102
+ assert_equal 1, pt1.send(:size2extract, (5...9), ignore_error: false, skip_renormalize: false)
103
+ assert_equal 0, pt1.send(:size2extract, (8..9), ignore_error: false, skip_renormalize: false)
104
+ assert_nil pt1.send(:size2extract, (-9..-1), ignore_error: true, skip_renormalize: false)
105
+ assert_raises(IndexError){ pt1.send(:size2extract, (-9..-1), ignore_error: false, skip_renormalize: false) }
106
+ assert_raises(IndexError){ pt1.send(:size2extract, (1..-9), ignore_error: false, skip_renormalize: false) }
107
+ assert_raises(IndexError){ pt1.send(:size2extract, (-9..-9), ignore_error: false, skip_renormalize: false) }
108
+ end
109
+
110
+
111
+ def test_equal01
112
+ a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
113
+ pt1 = Pt.new(a1)
114
+ a2 = ["a", "\n\n\n", "b", "\n\n\n", "c"]
115
+ pt2 = Pt.new(a2)
116
+
117
+ assert_operator pt1, '==', Pt.new(a1)
118
+ assert_operator a1, '==', pt1.to_a
119
+ assert_operator a1, '!=', pt1
120
+ assert_operator pt1, '!=', a1
121
+ assert_operator a1, '!=', ?a
122
+ assert_operator ?a, '!=', a1
123
+ assert_operator pt1, '!=', pt2
124
+ assert_operator pt2, '!=', pt1
125
+ assert_operator pt1, '!=', ?a
126
+ assert_operator ?a, '!=', pt1
127
+ end
128
+
129
+ def test_nomethoderror01
130
+ a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
131
+ pt1 = Pt.new(a1)
132
+ assert_raises(NoMethodError){ pt1 << 'abc' }
133
+ assert_raises(NoMethodError){ pt1.delete_at(2) }
134
+ end
135
+
136
+ def test_plus01
137
+ a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
138
+ pt1 = Pt.new(a1)
139
+ a3 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n", "d", ""]
140
+ pt3 = pt1 + ["d"] # PlainText::Part + Array => PlainText::Part
141
+
142
+ assert_raises(TypeError){ pt1 + "s" }
143
+ assert_equal a1+["d", ""], pt3.to_a
144
+ assert_equal pt1.class, pt3.class
145
+ assert_equal Pt.new(a3), pt3 # Boundary("") is appended.
146
+ assert_equal Pt::Boundary, pt3.to_a[-1].class
147
+ assert_equal pt3, pt1 + ["d", ""]
148
+
149
+ assert_equal a3.class, ([]+pt3).class # The latter, too, is an Array (NOT PlainText::Part)
150
+ assert_equal a3, []+pt3
151
+
152
+ assert_equal pt3.class, (pt1 + Pt.new(["d", ""])).class # PtP + PtP => PtP
153
+ assert_equal pt3, pt1 + Pt.new(["d", ""])
154
+ end
155
+
156
+ # Tests of [prm], [prm1, prm2], [prm1..prm2] and "equal" operator
157
+ def test_bracket01
158
+ a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
159
+ pt1 = Pt.new(a1)
160
+
161
+ assert_equal pt1.to_a[0], pt1[0]
162
+ assert_equal Pt::Paragraph, pt1[0].class
163
+ assert_equal a1[0], pt1[0]
164
+ assert_equal Pt::Paragraph.new(a1[0]), pt1[0]
165
+
166
+ # negative or too-big out-of-bound begin
167
+ assert_nil pt1[-99]
168
+ assert_nil pt1[98]
169
+
170
+ assert_equal pt1.class, pt1[0, 6].class
171
+ assert_equal a1, pt1[0, 6].to_a
172
+ assert_equal a1[0, 6], pt1[0, 6].to_a
173
+ assert_operator pt1[0, 6], :!=, a1
174
+ assert_operator a1, :!=, pt1[0, 6]
175
+
176
+ assert_equal a1[0, 2], pt1[0, 2].to_a
177
+ assert_equal a1, pt1[0, 98].to_a
178
+ assert_equal a1[0, 99], pt1[0, 98].to_a
179
+
180
+ assert_equal pt1.class, pt1[0..1].class
181
+ assert_equal a1[0..1], pt1[0..1].to_a
182
+ assert_equal a1[0, 2], pt1[0..1].to_a
183
+ assert_equal a1[0..5], pt1[0..5].to_a
184
+ assert_equal a1, pt1[0..5].to_a
185
+ assert_equal a1[0..99], pt1[0..99].to_a
186
+ assert_equal a1, pt1[0..99].to_a
187
+ assert_equal a1, pt1[0..-1].to_a
188
+ assert_equal a1[-6..-1],pt1[-6..-1].to_a
189
+ assert_equal a1, pt1[-6..-1].to_a
190
+ assert_equal a1[-6..3], pt1[-6..3].to_a
191
+ assert_equal a1[-6...4],pt1[-6...4].to_a
192
+
193
+ assert_equal pt1[0..-1], pt1[0..99]
194
+ assert_equal pt1[0, 6], pt1[0..-1]
195
+ assert_equal pt1, pt1[0..99]
196
+
197
+ pt2 = pt1[0, 4]
198
+ assert_equal pt1.class, pt2.class
199
+ assert_equal pt1.parts[0, 2], pt2.parts
200
+ assert_equal pt1.boundaries[0, 2], pt2.boundaries
201
+
202
+ # negative or too-big out-of-bound begin
203
+ assert_nil a1[-99..2]
204
+ assert_nil pt1[-99..2]
205
+ assert_nil pt1[-99..-1]
206
+ assert_nil pt1[98..99]
207
+
208
+ # other out-of-bounds: Empty
209
+ assert_equal Pt.new([]), pt1[2..1]
210
+ assert_equal a1[-2..2], pt1[-2..2].to_a
211
+ assert_equal a1[-2...3], pt1[-2...3].to_a
212
+
213
+
214
+ # Exception (Error)
215
+ assert_raises(TypeError){ pt1['abc'] }
216
+ assert_raises(TypeError){ a1[(?a)..(?c)] }
217
+ assert_raises(TypeError){ pt1[(?a)..(?c)] }
218
+ assert_raises(ArgumentError){ pt1[0, 1] }
219
+ assert_raises(ArgumentError){ pt1[1, 2] }
220
+
221
+ # Special cases, where the first index (or begin) is equal to size (as described in the reference)
222
+ # @see https://docs.ruby-lang.org/ja/latest/class/Array.html#I_--5B--5D
223
+ assert_nil pt1[pt1.size]
224
+ assert_nil pt1[pt1.size, -2]
225
+ assert_raises(TypeError){ pt1[pt1.size, ?a] }
226
+ assert_equal Pt.new([]), pt1[pt1.size, 2]
227
+ assert_equal Pt.new([]), pt1[pt1.size, 98]
228
+ assert_equal Pt.new([]), pt1[pt1.size..99]
229
+ assert_equal Pt.new([]), pt1[pt1.size..1]
230
+ end
231
+
232
+ # Tests of slice! to delete
233
+ def test_slice01
234
+ a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
235
+ a11 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"] # a1.clone
236
+ pt1 = Pt.new(a1.clone)
237
+ pt2 = Pt.new(a11.clone)
238
+
239
+ assert_equal pt1.to_a[0], pt1[0]
240
+ # negative or too-big out-of-bound begin
241
+ assert_nil a1.slice!( -98, 2)
242
+ assert_nil pt1.slice!(-98, 2)
243
+ assert_nil a1.slice!( 98, 2)
244
+ assert_nil pt1.slice!(98, 2)
245
+ assert_equal a11, a1
246
+ assert_equal pt2, pt1
247
+
248
+ assert_equal a11[4, 2], a1.slice!(4, 2)
249
+ ptp = pt1.slice!(4, 2)
250
+ assert_equal pt1.class, ptp.class # PlainText::Part
251
+ assert_equal a11[4, 2], ptp.to_a
252
+ assert_operator a11[4, 2], :!=, ptp # PlainText::Part != Array
253
+ assert_equal a11[0..3], a1
254
+ assert_equal a11[0..3], pt1.to_a
255
+ assert_equal pt2[0..3], pt1
256
+
257
+ # Negative size (Index, Size)
258
+ a1 = a11.clone
259
+ pt1 = Pt.new(a11.clone)
260
+ assert_nil a1.slice!(4, -1)
261
+ ptp = pt1.slice!(4, -1)
262
+ assert_nil ptp
263
+ assert_equal a11, a1
264
+ assert_equal a11, pt1.to_a
265
+
266
+ # Range exceeding (Index, Size)
267
+ a1 = a11.clone
268
+ pt1 = Pt.new(a11.clone)
269
+ assert_equal a11[4, 6], a1.slice!(4, 6)
270
+ ptp = pt1.slice!(4, 6)
271
+ assert_equal pt1.class, ptp.class # PlainText::Part
272
+ assert_equal a11[4, 2], ptp.to_a
273
+ assert_operator a11[4, 2], :!=, ptp # PlainText::Part != Array
274
+ assert_equal a11[0..3], a1
275
+
276
+ # Range exceeding (Range)
277
+ a1 = a11.clone
278
+ pt1 = Pt.new(a11.clone)
279
+ assert_equal a11[4..9], a1.slice!(4..9)
280
+ ptp = pt1.slice!(4..9)
281
+ assert_equal pt1.class, ptp.class # PlainText::Part
282
+ assert_equal a11[4..-1],ptp.to_a
283
+ assert_equal a11[4..9], ptp.to_a
284
+ assert_operator a11[4..9], :!=, ptp # PlainText::Part != Array
285
+ assert_equal a11[0..3], a1
286
+ assert_equal a11[0..3], pt1.to_a
287
+
288
+ # Null Range (Range)
289
+ a1 = a11.clone
290
+ pt1 = Pt.new(a11.clone)
291
+ assert_equal [], a1.slice!(4..0)
292
+ ptp = pt1.slice!(4..0)
293
+ # assert_equal pt1.class, ptp.class # PlainText::Part -- No! In Ruby's specification (2.5), ptp is Array, not its subClass.
294
+ assert_equal [], ptp.to_a
295
+ # assert_operator [], :!=, ptp # PlainText::Part != Array -- The same
296
+ assert_equal a11, a1
297
+ assert_equal a11, pt1.to_a
298
+
299
+ # Negative index (Index, size)
300
+ a1 = a11.clone
301
+ pt1 = Pt.new(a11.clone)
302
+ assert_equal a11[-6, 2], a1.slice!(-6, 2)
303
+ ptp = pt1.slice!(-6, 2)
304
+ assert_equal pt1.class, ptp.class # PlainText::Part
305
+ assert_equal a11[0..1], ptp.to_a
306
+ assert_operator a11[0..1], :!=, ptp # PlainText::Part != Array
307
+ assert_equal a11[2..-1], a1
308
+ assert_equal a11[2..-1], pt1.to_a
309
+
310
+ # Negative index (Range)
311
+ a1 = a11.clone
312
+ pt1 = Pt.new(a11.clone)
313
+ assert_equal a11[-6..-5], a1.slice!(-6..-5)
314
+ ptp = pt1.slice!(-6..-5)
315
+ assert_equal pt1.class, ptp.class # PlainText::Part
316
+ assert_equal a11[0..1], ptp.to_a
317
+ assert_operator a11[0..1], :!=, ptp # PlainText::Part != Array
318
+ assert_equal a11[2..-1], a1
319
+ assert_equal a11[2..-1], pt1.to_a
320
+
321
+ # Exception (Error)
322
+ a1 = a11.clone
323
+ pt1 = Pt.new(a11.clone)
324
+ assert_raises(TypeError){ pt1['abc'] }
325
+ assert_raises(TypeError){ a1[ (?a)..(?c)] }
326
+ assert_raises(TypeError){ pt1[(?a)..(?c)] }
327
+ assert_raises(ArgumentError){ pt1.slice!(0) } # Single element forbidden.
328
+ assert_raises(ArgumentError){ pt1.slice!(0, 3) } # Odd-number elements forbidden.
329
+ assert_raises(ArgumentError){ pt1.slice!(-1, 2) } # Odd-number elements forbidden.
330
+ assert_raises(ArgumentError){ pt1.slice!(1, 2) } # Odd starting index.
331
+ assert_raises(ArgumentError){ pt1.slice!(1..2) } # Odd starting index.
332
+ end
333
+
334
+
335
+ # Tests of Part.parse
336
+ def test_parse01
337
+ s1 = "a\n\n\nb\n\n\nc\n\n"
338
+ pt1 = Pt.parse s1
339
+ assert_equal 6, pt1.size
340
+ assert_equal 3, pt1.parts.size
341
+ assert_equal %w(a b c), pt1.parts
342
+ assert_equal Pt::Paragraph, pt1[0].class
343
+ assert_equal Pt::Boundary, pt1[1].class
344
+ assert_equal s1, pt1.join
345
+ end
346
+
347
+ #assert ( /_rails_db\.sql$/ =~ s1.outfile )
348
+ #assert_nil fkeys
349
+ #assert_match(/^\s*ADD CONSTRAINT/ , s1.instance_eval{ @strall })
350
+ end # class TestUnitPlainTextPart < MiniTest::Test
351
+
352
+ #end # if $0 == __FILE__
353
+
@@ -0,0 +1,78 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ # Author: M. Sakano (Wise Babel Ltd)
4
+
5
+ require 'plain_text'
6
+
7
+ $stdout.sync=true
8
+ $stderr.sync=true
9
+ # print '$LOAD_PATH=';p $LOAD_PATH
10
+
11
+ #################################################
12
+ # Unit Test
13
+ #################################################
14
+
15
+ #if $0 == __FILE__
16
+ gem "minitest"
17
+ # require 'minitest/unit'
18
+ require 'minitest/autorun'
19
+ # MiniTest::Unit.autorun
20
+
21
+ class TestUnitPlainTextSplit < MiniTest::Test
22
+ T = true
23
+ F = false
24
+ SCFNAME = File.basename(__FILE__)
25
+ PTS = PlainText::Split
26
+
27
+ class ChString < String
28
+ # Test sub-class.
29
+ end
30
+
31
+ def setup
32
+ end
33
+
34
+ def teardown
35
+ end
36
+
37
+ def test_split_with_delimiter01
38
+ s1 = "XabXXc"
39
+ s2 = "XabXXcX"
40
+ assert_equal [], PTS.split_with_delimiter("", //)
41
+ assert_equal [], PTS.split_with_delimiter("", /g/)
42
+ assert_equal [], "".split_with_delimiter(/g/)
43
+ assert_equal s1, s1.split_with_delimiter(/X/).join
44
+ assert_equal s2, s2.split_with_delimiter(/X/).join
45
+ assert_equal s1, s1.split_with_delimiter(/_/).join
46
+ assert_equal s2, s2.split_with_delimiter(/_/).join
47
+
48
+ a11 = ["", ?X, "ab", ?X, "", ?X, ?c]
49
+ a12 = a11+[?X]
50
+ assert_equal a11, PTS.split_with_delimiter(s1, /X/)
51
+ assert_equal a11, s1.split_with_delimiter(/X/)
52
+ assert_equal a11, s1.split_with_delimiter('X')
53
+ assert_equal a12, s2.split_with_delimiter(/X/)
54
+ assert_equal a12, s2.split_with_delimiter('X')
55
+
56
+ a21 = ["", ?X, "ab", "XX", ?c]
57
+ a22 = a21+[?X]
58
+ assert_equal a21, s1.split_with_delimiter(/X+/)
59
+ assert_equal a21, s1.split_with_delimiter(/X+(Y?)/) # With grouping in the argument
60
+ assert_equal a21, s1.split_with_delimiter(/(X+)((Y?)(Z?))/) # Even number of groupings
61
+ assert_equal a22, s2.split_with_delimiter(/X+/)
62
+ assert_equal a22, s2.split_with_delimiter(/X+(Y?)/) # With grouping in the argument
63
+ assert_equal a22, s2.split_with_delimiter(/(X+)((Y?)(Z?))/) # Even number of groupings
64
+ end
65
+
66
+ def test_split_with_delimiter02
67
+ # As in the embedded comment
68
+ s = "XYabXXcXY"
69
+ assert_equal ["", "ab", "c"], s.split(/X+Y?/)
70
+ assert_equal ["", "ab", "c", ""], s.split(/X+Y?/, -1)
71
+ assert_equal ["", "Y", "ab", "", "c", "Y"], s.split(/X+(Y?)/)
72
+ assert_equal ["", "Y", "ab", "", "c", "Y", ""], s.split(/X+(Y?)/, -1)
73
+ assert_equal ["", "XY", "Y", "ab", "XX", "", "c", "XY", "Y", ""], s.split(/(X+(Y?))/, -1)
74
+ assert_equal ["", "XY", "ab", "XX", "c", "XY"], s.split_with_delimiter(/X+(Y?)/)
75
+ end
76
+
77
+ end # class TestUnitPlainTextSplit < MiniTest::Test
78
+
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: plain_text
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Masa Sakano
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-10-25 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: This module provides utility functions and methods to handle plain text,
14
+ classes Part/Paragraph/Boundary to represent the logical structure of a document
15
+ and ParseRule to describe the rules to parse plain text to produce a Part-type Ruby
16
+ instance.
17
+ email:
18
+ executables:
19
+ - countchar
20
+ extensions: []
21
+ extra_rdoc_files:
22
+ - README.en.rdoc
23
+ files:
24
+ - ".gitignore"
25
+ - ChangeLog
26
+ - Makefile
27
+ - README.en.rdoc
28
+ - Rakefile
29
+ - bin/countchar
30
+ - lib/plain_text.rb
31
+ - lib/plain_text/parse_rule.rb
32
+ - lib/plain_text/part.rb
33
+ - lib/plain_text/part/boundary.rb
34
+ - lib/plain_text/part/paragraph.rb
35
+ - lib/plain_text/split.rb
36
+ - lib/plain_text/util.rb
37
+ - plain_text.gemspec
38
+ - test/test_plain_text.rb
39
+ - test/test_plain_text_parse_rule.rb
40
+ - test/test_plain_text_part.rb
41
+ - test/test_plain_text_split.rb
42
+ homepage: https://www.wisebabel.com
43
+ licenses:
44
+ - MIT
45
+ metadata:
46
+ yard.run: yri
47
+ post_install_message:
48
+ rdoc_options:
49
+ - "--charset=UTF-8"
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '2.0'
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubyforge_project:
64
+ rubygems_version: 2.7.3
65
+ signing_key:
66
+ specification_version: 4
67
+ summary: Module to handle Plain-Text
68
+ test_files:
69
+ - test/test_plain_text_parse_rule.rb
70
+ - test/test_plain_text_part.rb
71
+ - test/test_plain_text.rb
72
+ - test/test_plain_text_split.rb