csvreader 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +1 -0
- data/README.md +56 -3
- data/lib/csvreader/parser_fixed.rb +25 -9
- data/lib/csvreader/version.rb +1 -1
- data/test/data/iris11.csv +163 -0
- data/test/test_parser_fixed.rb +18 -13
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c522e332ef3c1fead487b99d5fe147ba43ad2090
|
4
|
+
data.tar.gz: 51dd6d88ef8dc35615513961bab7e0e1c3b3512b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e563f75e916829e8de1b0a3b1208dd089de9a7907d010e3ba2cd23f1a70fedcb8d98c95e65c15ab7d3ad8705ae41a4ad6cd543ba20d6a72dc67f27b0060286b
|
7
|
+
data.tar.gz: 57036e2457b4dc1837748538062150650b47abef3d2493f4c4f42db4291fdd3001cb6fb218eca38c7c11816c67360cfea74030e137ff7edf8de1fb9e47f991ec
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -422,7 +422,7 @@ Csv.strict.read( ..., sep: "\t" )
|
|
422
422
|
|
423
423
|
|
424
424
|
|
425
|
-
### Q: How can I read records with fixed width (and no separator)?
|
425
|
+
### Q: How can I read records with fixed width fields (and no separator)?
|
426
426
|
|
427
427
|
Pass in the `width` keyword option with the field widths / lengths
|
428
428
|
to the "fixed" parser. Example:
|
@@ -432,7 +432,7 @@ txt = <<TXT
|
|
432
432
|
12345678123456781234567890123456789012345678901212345678901234
|
433
433
|
TXT
|
434
434
|
|
435
|
-
Csv.fixed.parse( txt, width: [8,8,32,14] )
|
435
|
+
Csv.fixed.parse( txt, width: [8,8,32,14] ) # or Csv.fix or Csv.f
|
436
436
|
# => [["12345678","12345678", "12345678901234567890123456789012", "12345678901234"]]
|
437
437
|
|
438
438
|
|
@@ -441,15 +441,68 @@ John Smith john@example.com 1-888-555-6666
|
|
441
441
|
Michele O'Reileymichele@example.com 1-333-321-8765
|
442
442
|
TXT
|
443
443
|
|
444
|
-
Csv.fixed.parse( txt, width: [8,8,32,14] )
|
444
|
+
Csv.fixed.parse( txt, width: [8,8,32,14] ) # or Csv.fix or Csv.f
|
445
445
|
# => [["John", "Smith", "john@example.com", "1-888-555-6666"],
|
446
446
|
# ["Michele", "O'Reiley", "michele@example.com", "1-333-321-8765"]]
|
447
447
|
|
448
448
|
# and so on
|
449
449
|
```
|
450
450
|
|
451
|
+
<!--
|
451
452
|
Note: You can use for your convenience the built-in
|
452
453
|
`Csv.fix` or `Csv.f` aliases / shortcuts.
|
454
|
+
-->
|
455
|
+
|
456
|
+
|
457
|
+
Note: You can use negative widths (e.g. `-2`, `-3`, and so on)
|
458
|
+
to "skip" filler fields (e.g. `--`, `---`, and so on).
|
459
|
+
Example:
|
460
|
+
|
461
|
+
``` ruby
|
462
|
+
txt = <<TXT
|
463
|
+
12345678--12345678---12345678901234567890123456789012--12345678901234XXX
|
464
|
+
TXT
|
465
|
+
|
466
|
+
Csv.fixed.parse( txt, width: [8,-2,8,-3,32,-2,14] ) # or Csv.fix or Csv.f
|
467
|
+
# => [["12345678","12345678", "12345678901234567890123456789012", "12345678901234"]]
|
468
|
+
```
|
469
|
+
|
470
|
+
|
471
|
+
Bonus: If the width is a string (not an array)
|
472
|
+
(e.g. `'a8 a8 a32 Z*'` or `'A8 A8 A32 Z*'` and so on)
|
473
|
+
than the fixed width field parser
|
474
|
+
will use `String#unpack` and the value of width as its format string spec.
|
475
|
+
Example:
|
476
|
+
|
477
|
+
``` ruby
|
478
|
+
txt = <<TXT
|
479
|
+
12345678123456781234567890123456789012345678901212345678901234
|
480
|
+
TXT
|
481
|
+
|
482
|
+
Csv.fixed.parse( txt, width: 'a8 a8 a32 Z*' ) # or Csv.fix or Csv.f
|
483
|
+
# => [["12345678","12345678", "12345678901234567890123456789012", "12345678901234"]]
|
484
|
+
|
485
|
+
txt = <<TXT
|
486
|
+
John Smith john@example.com 1-888-555-6666
|
487
|
+
Michele O'Reileymichele@example.com 1-333-321-8765
|
488
|
+
TXT
|
489
|
+
|
490
|
+
Csv.fixed.parse( txt, width: 'A8 A8 A32 Z*' ) # or Csv.fix or Csv.f
|
491
|
+
# => [["John", "Smith", "john@example.com", "1-888-555-6666"],
|
492
|
+
# ["Michele", "O'Reiley", "michele@example.com", "1-333-321-8765"]]
|
493
|
+
|
494
|
+
# and so on
|
495
|
+
```
|
496
|
+
|
497
|
+
| String Directive | Returns | Meaning |
|
498
|
+
|------------------|---------|-------------------------|
|
499
|
+
| `A` | String | Arbitrary binary string (remove trailing nulls and ASCII spaces) |
|
500
|
+
| `a` | String | Arbitrary binary string |
|
501
|
+
| `Z` | String | Null-terminated string |
|
502
|
+
|
503
|
+
|
504
|
+
and many more. See the `String#unpack` documentation
|
505
|
+
for the complete format spec and directives.
|
453
506
|
|
454
507
|
|
455
508
|
|
@@ -69,15 +69,31 @@ def parse_lines( input, width:, &block )
|
|
69
69
|
end
|
70
70
|
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
72
|
+
if width.is_a?( String )
|
73
|
+
## assume it's String#unpack format e.g.
|
74
|
+
## "209231-231992395 MoreData".unpack('aa5A1A9a4Z*')
|
75
|
+
## returns an array as follows :
|
76
|
+
## ["2", "09231", "-", "231992395", " ", "MoreData"]
|
77
|
+
## see String#unpack
|
78
|
+
|
79
|
+
values = line.unpack( width )
|
80
|
+
else ## assume array with integers
|
81
|
+
values = []
|
82
|
+
offset = 0 # start position / offset
|
83
|
+
width.each_with_index do |w,i|
|
84
|
+
logger.debug "[#{i}] start: #{offset}, width: #{w}" if logger.debug?
|
85
|
+
|
86
|
+
if w < 0 ## convention - if width negative, skip column
|
87
|
+
# note: minus (-) and minus (-) equal plus (+)
|
88
|
+
## e.g. 2 - -2 = 4
|
89
|
+
offset -= w
|
90
|
+
else
|
91
|
+
value = line[offset, w]
|
92
|
+
value = value.strip if value ## note: if not nil strip; only use rstrip (for trailing only) - why? why not?
|
93
|
+
values << value
|
94
|
+
offset += w
|
95
|
+
end
|
96
|
+
end
|
81
97
|
end
|
82
98
|
|
83
99
|
## note: requires block - enforce? how? why? why not?
|
data/lib/csvreader/version.rb
CHANGED
@@ -0,0 +1,163 @@
|
|
1
|
+
###
|
2
|
+
# The Iris flower data set or Fisher's Iris data set is a multivariate data set
|
3
|
+
# introduced by the British statistician and biologist Ronald Fisher in his 1936 paper
|
4
|
+
# The use of multiple measurements in taxonomic problems as an example of
|
5
|
+
# linear discriminant analysis.
|
6
|
+
# See https://en.wikipedia.org/wiki/Iris_flower_data_set
|
7
|
+
|
8
|
+
|
9
|
+
# The dataset contains a set of 150 records under five attributes
|
10
|
+
# - petal length, petal width, sepal length, sepal width and species.
|
11
|
+
|
12
|
+
|
13
|
+
Sepal length, Sepal width, Petal length, Petal width, Species
|
14
|
+
5.1, 3.5, 1.4, 0.2, I. setosa
|
15
|
+
4.9, 3.0, 1.4, 0.2, I. setosa
|
16
|
+
4.7, 3.2, 1.3, 0.2, I. setosa
|
17
|
+
4.6, 3.1, 1.5, 0.2, I. setosa
|
18
|
+
5.0, 3.6, 1.4, 0.3, I. setosa
|
19
|
+
5.4, 3.9, 1.7, 0.4, I. setosa
|
20
|
+
4.6, 3.4, 1.4, 0.3, I. setosa
|
21
|
+
5.0, 3.4, 1.5, 0.2, I. setosa
|
22
|
+
4.4, 2.9, 1.4, 0.2, I. setosa
|
23
|
+
4.9, 3.1, 1.5, 0.1, I. setosa
|
24
|
+
5.4, 3.7, 1.5, 0.2, I. setosa
|
25
|
+
4.8, 3.4, 1.6, 0.2, I. setosa
|
26
|
+
4.8, 3.0, 1.4, 0.1, I. setosa
|
27
|
+
4.3, 3.0, 1.1, 0.1, I. setosa
|
28
|
+
5.8, 4.0, 1.2, 0.2, I. setosa
|
29
|
+
5.7, 4.4, 1.5, 0.4, I. setosa
|
30
|
+
5.4, 3.9, 1.3, 0.4, I. setosa
|
31
|
+
5.1, 3.5, 1.4, 0.3, I. setosa
|
32
|
+
5.7, 3.8, 1.7, 0.3, I. setosa
|
33
|
+
5.1, 3.8, 1.5, 0.3, I. setosa
|
34
|
+
5.4, 3.4, 1.7, 0.2, I. setosa
|
35
|
+
5.1, 3.7, 1.5, 0.4, I. setosa
|
36
|
+
4.6, 3.6, 1.0, 0.2, I. setosa
|
37
|
+
5.1, 3.3, 1.7, 0.5, I. setosa
|
38
|
+
4.8, 3.4, 1.9, 0.2, I. setosa
|
39
|
+
5.0, 3.0, 1.6, 0.2, I. setosa
|
40
|
+
5.0, 3.4, 1.6, 0.4, I. setosa
|
41
|
+
5.2, 3.5, 1.5, 0.2, I. setosa
|
42
|
+
5.2, 3.4, 1.4, 0.2, I. setosa
|
43
|
+
4.7, 3.2, 1.6, 0.2, I. setosa
|
44
|
+
4.8, 3.1, 1.6, 0.2, I. setosa
|
45
|
+
5.4, 3.4, 1.5, 0.4, I. setosa
|
46
|
+
5.2, 4.1, 1.5, 0.1, I. setosa
|
47
|
+
5.5, 4.2, 1.4, 0.2, I. setosa
|
48
|
+
4.9, 3.1, 1.5, 0.2, I. setosa
|
49
|
+
5.0, 3.2, 1.2, 0.2, I. setosa
|
50
|
+
5.5, 3.5, 1.3, 0.2, I. setosa
|
51
|
+
4.9, 3.6, 1.4, 0.1, I. setosa
|
52
|
+
4.4, 3.0, 1.3, 0.2, I. setosa
|
53
|
+
5.1, 3.4, 1.5, 0.2, I. setosa
|
54
|
+
5.0, 3.5, 1.3, 0.3, I. setosa
|
55
|
+
4.5, 2.3, 1.3, 0.3, I. setosa
|
56
|
+
4.4, 3.2, 1.3, 0.2, I. setosa
|
57
|
+
5.0, 3.5, 1.6, 0.6, I. setosa
|
58
|
+
5.1, 3.8, 1.9, 0.4, I. setosa
|
59
|
+
4.8, 3.0, 1.4, 0.3, I. setosa
|
60
|
+
5.1, 3.8, 1.6, 0.2, I. setosa
|
61
|
+
4.6, 3.2, 1.4, 0.2, I. setosa
|
62
|
+
5.3, 3.7, 1.5, 0.2, I. setosa
|
63
|
+
5.0, 3.3, 1.4, 0.2, I. setosa
|
64
|
+
7.0, 3.2, 4.7, 1.4, I. versicolor
|
65
|
+
6.4, 3.2, 4.5, 1.5, I. versicolor
|
66
|
+
6.9, 3.1, 4.9, 1.5, I. versicolor
|
67
|
+
5.5, 2.3, 4.0, 1.3, I. versicolor
|
68
|
+
6.5, 2.8, 4.6, 1.5, I. versicolor
|
69
|
+
5.7, 2.8, 4.5, 1.3, I. versicolor
|
70
|
+
6.3, 3.3, 4.7, 1.6, I. versicolor
|
71
|
+
4.9, 2.4, 3.3, 1.0, I. versicolor
|
72
|
+
6.6, 2.9, 4.6, 1.3, I. versicolor
|
73
|
+
5.2, 2.7, 3.9, 1.4, I. versicolor
|
74
|
+
5.0, 2.0, 3.5, 1.0, I. versicolor
|
75
|
+
5.9, 3.0, 4.2, 1.5, I. versicolor
|
76
|
+
6.0, 2.2, 4.0, 1.0, I. versicolor
|
77
|
+
6.1, 2.9, 4.7, 1.4, I. versicolor
|
78
|
+
5.6, 2.9, 3.6, 1.3, I. versicolor
|
79
|
+
6.7, 3.1, 4.4, 1.4, I. versicolor
|
80
|
+
5.6, 3.0, 4.5, 1.5, I. versicolor
|
81
|
+
5.8, 2.7, 4.1, 1.0, I. versicolor
|
82
|
+
6.2, 2.2, 4.5, 1.5, I. versicolor
|
83
|
+
5.6, 2.5, 3.9, 1.1, I. versicolor
|
84
|
+
5.9, 3.2, 4.8, 1.8, I. versicolor
|
85
|
+
6.1, 2.8, 4.0, 1.3, I. versicolor
|
86
|
+
6.3, 2.5, 4.9, 1.5, I. versicolor
|
87
|
+
6.1, 2.8, 4.7, 1.2, I. versicolor
|
88
|
+
6.4, 2.9, 4.3, 1.3, I. versicolor
|
89
|
+
6.6, 3.0, 4.4, 1.4, I. versicolor
|
90
|
+
6.8, 2.8, 4.8, 1.4, I. versicolor
|
91
|
+
6.7, 3.0, 5.0, 1.7, I. versicolor
|
92
|
+
6.0, 2.9, 4.5, 1.5, I. versicolor
|
93
|
+
5.7, 2.6, 3.5, 1.0, I. versicolor
|
94
|
+
5.5, 2.4, 3.8, 1.1, I. versicolor
|
95
|
+
5.5, 2.4, 3.7, 1.0, I. versicolor
|
96
|
+
5.8, 2.7, 3.9, 1.2, I. versicolor
|
97
|
+
6.0, 2.7, 5.1, 1.6, I. versicolor
|
98
|
+
5.4, 3.0, 4.5, 1.5, I. versicolor
|
99
|
+
6.0, 3.4, 4.5, 1.6, I. versicolor
|
100
|
+
6.7, 3.1, 4.7, 1.5, I. versicolor
|
101
|
+
6.3, 2.3, 4.4, 1.3, I. versicolor
|
102
|
+
5.6, 3.0, 4.1, 1.3, I. versicolor
|
103
|
+
5.5, 2.5, 4.0, 1.3, I. versicolor
|
104
|
+
5.5, 2.6, 4.4, 1.2, I. versicolor
|
105
|
+
6.1, 3.0, 4.6, 1.4, I. versicolor
|
106
|
+
5.8, 2.6, 4.0, 1.2, I. versicolor
|
107
|
+
5.0, 2.3, 3.3, 1.0, I. versicolor
|
108
|
+
5.6, 2.7, 4.2, 1.3, I. versicolor
|
109
|
+
5.7, 3.0, 4.2, 1.2, I. versicolor
|
110
|
+
5.7, 2.9, 4.2, 1.3, I. versicolor
|
111
|
+
6.2, 2.9, 4.3, 1.3, I. versicolor
|
112
|
+
5.1, 2.5, 3.0, 1.1, I. versicolor
|
113
|
+
5.7, 2.8, 4.1, 1.3, I. versicolor
|
114
|
+
6.3, 3.3, 6.0, 2.5, I. virginica
|
115
|
+
5.8, 2.7, 5.1, 1.9, I. virginica
|
116
|
+
7.1, 3.0, 5.9, 2.1, I. virginica
|
117
|
+
6.3, 2.9, 5.6, 1.8, I. virginica
|
118
|
+
6.5, 3.0, 5.8, 2.2, I. virginica
|
119
|
+
7.6, 3.0, 6.6, 2.1, I. virginica
|
120
|
+
4.9, 2.5, 4.5, 1.7, I. virginica
|
121
|
+
7.3, 2.9, 6.3, 1.8, I. virginica
|
122
|
+
6.7, 2.5, 5.8, 1.8, I. virginica
|
123
|
+
7.2, 3.6, 6.1, 2.5, I. virginica
|
124
|
+
6.5, 3.2, 5.1, 2.0, I. virginica
|
125
|
+
6.4, 2.7, 5.3, 1.9, I. virginica
|
126
|
+
6.8, 3.0, 5.5, 2.1, I. virginica
|
127
|
+
5.7, 2.5, 5.0, 2.0, I. virginica
|
128
|
+
5.8, 2.8, 5.1, 2.4, I. virginica
|
129
|
+
6.4, 3.2, 5.3, 2.3, I. virginica
|
130
|
+
6.5, 3.0, 5.5, 1.8, I. virginica
|
131
|
+
7.7, 3.8, 6.7, 2.2, I. virginica
|
132
|
+
7.7, 2.6, 6.9, 2.3, I. virginica
|
133
|
+
6.0, 2.2, 5.0, 1.5, I. virginica
|
134
|
+
6.9, 3.2, 5.7, 2.3, I. virginica
|
135
|
+
5.6, 2.8, 4.9, 2.0, I. virginica
|
136
|
+
7.7, 2.8, 6.7, 2.0, I. virginica
|
137
|
+
6.3, 2.7, 4.9, 1.8, I. virginica
|
138
|
+
6.7, 3.3, 5.7, 2.1, I. virginica
|
139
|
+
7.2, 3.2, 6.0, 1.8, I. virginica
|
140
|
+
6.2, 2.8, 4.8, 1.8, I. virginica
|
141
|
+
6.1, 3.0, 4.9, 1.8, I. virginica
|
142
|
+
6.4, 2.8, 5.6, 2.1, I. virginica
|
143
|
+
7.2, 3.0, 5.8, 1.6, I. virginica
|
144
|
+
7.4, 2.8, 6.1, 1.9, I. virginica
|
145
|
+
7.9, 3.8, 6.4, 2.0, I. virginica
|
146
|
+
6.4, 2.8, 5.6, 2.2, I. virginica
|
147
|
+
6.3, 2.8, 5.1, 1.5, I. virginica
|
148
|
+
6.1, 2.6, 5.6, 1.4, I. virginica
|
149
|
+
7.7, 3.0, 6.1, 2.3, I. virginica
|
150
|
+
6.3, 3.4, 5.6, 2.4, I. virginica
|
151
|
+
6.4, 3.1, 5.5, 1.8, I. virginica
|
152
|
+
6.0, 3.0, 4.8, 1.8, I. virginica
|
153
|
+
6.9, 3.1, 5.4, 2.1, I. virginica
|
154
|
+
6.7, 3.1, 5.6, 2.4, I. virginica
|
155
|
+
6.9, 3.1, 5.1, 2.3, I. virginica
|
156
|
+
5.8, 2.7, 5.1, 1.9, I. virginica
|
157
|
+
6.8, 3.2, 5.9, 2.3, I. virginica
|
158
|
+
6.7, 3.3, 5.7, 2.5, I. virginica
|
159
|
+
6.7, 3.0, 5.2, 2.3, I. virginica
|
160
|
+
6.3, 2.5, 5.0, 1.9, I. virginica
|
161
|
+
6.5, 3.0, 5.2, 2.0, I. virginica
|
162
|
+
6.2, 3.4, 5.4, 2.3, I. virginica
|
163
|
+
5.9, 3.0, 5.1, 1.8, I. virginica
|
data/test/test_parser_fixed.rb
CHANGED
@@ -14,9 +14,9 @@ def parser() CsvReader::Parser::FIXED; end
|
|
14
14
|
def reader() CsvReader.fixed; end
|
15
15
|
|
16
16
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
17
|
+
def test_numbers
|
18
|
+
numbers( parser )
|
19
|
+
numbers( reader )
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_contacts
|
@@ -25,7 +25,7 @@ def test_contacts
|
|
25
25
|
end
|
26
26
|
|
27
27
|
|
28
|
-
def
|
28
|
+
def numbers( parser )
|
29
29
|
records = [["12345678","12345678", "12345678901234567890123456789012", "12345678901234"]]
|
30
30
|
|
31
31
|
assert_equal records, parser.parse( <<TXT, width: [8,8,32,14] )
|
@@ -37,6 +37,11 @@ TXT
|
|
37
37
|
|
38
38
|
assert_equal records, parser.parse( <<TXT, width: [8,8,32,14] )
|
39
39
|
12345678123456781234567890123456789012345678901212345678901234
|
40
|
+
TXT
|
41
|
+
|
42
|
+
## note: negative width fields gets skipped
|
43
|
+
assert_equal records, parser.parse( <<TXT, width: [8,-2,8,-3,32,-2,14] )
|
44
|
+
12345678XX12345678XXX12345678901234567890123456789012XX12345678901234XXX
|
40
45
|
TXT
|
41
46
|
end
|
42
47
|
|
@@ -61,20 +66,20 @@ TXT
|
|
61
66
|
end
|
62
67
|
|
63
68
|
|
64
|
-
def test_contacts
|
65
|
-
records = [["John", "Smith", "john@example.com", "1-888-555-6666"],
|
66
|
-
["Michele", "O'Reiley", "michele@example.com", "1-333-321-8765"]]
|
67
|
-
|
68
|
-
assert_equal records, parser.parse( <<TXT, width: [8,8,32,14] )
|
69
|
-
# fixed width with comments and blank lines
|
70
69
|
|
71
|
-
|
72
|
-
|
70
|
+
def test_unpack_numbers
|
71
|
+
records = [["12345678","12345678", "12345678901234567890123456789012", "12345678901234"]]
|
73
72
|
|
73
|
+
assert_equal records, parser.parse( <<TXT, width: 'a8 a8 a32 Z*' )
|
74
|
+
12345678123456781234567890123456789012345678901212345678901234
|
74
75
|
TXT
|
76
|
+
end
|
75
77
|
|
78
|
+
def test_unpack_contacts
|
79
|
+
records = [["John", "Smith", "john@example.com", "1-888-555-6666"],
|
80
|
+
["Michele", "O'Reiley", "michele@example.com", "1-333-321-8765"]]
|
76
81
|
|
77
|
-
|
82
|
+
assert_equal records, parser.parse( <<TXT, width: 'A8 A8 A32 Z*' )
|
78
83
|
John Smith john@example.com 1-888-555-6666
|
79
84
|
Michele O'Reileymichele@example.com 1-333-321-8765
|
80
85
|
TXT
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csvreader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- test/data/cars11.csv
|
74
74
|
- test/data/cities11.csv
|
75
75
|
- test/data/customers11.csv
|
76
|
+
- test/data/iris11.csv
|
76
77
|
- test/data/shakespeare.csv
|
77
78
|
- test/helper.rb
|
78
79
|
- test/test_buffer.rb
|