flat_out 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README.rdoc +39 -4
  2. data/lib/flat_out.rb +52 -6
  3. data/spec/flat_out_spec.rb +34 -1
  4. metadata +1 -1
data/README.rdoc CHANGED
@@ -88,7 +88,7 @@ Command:
88
88
  If the fld is longer than specified len, it is left justified and truncated.
89
89
 
90
90
  Example:
91
- # '123456789012'
91
+ # '123456789012'
92
92
  myline = FlatOut.new(12) # ' '
93
93
  myline.put(4, 2, 'ABCDEFG') # ' ABCD '
94
94
  myline.put(4, 2, 'ABCD') # ' ABCD '
@@ -131,13 +131,34 @@ Command:
131
131
  myline.put(-4.2, 2, 12.3) # ' 001230 '
132
132
  myline.put(-4.2, 2, 123456.789) # ' 345679 '
133
133
 
134
+ Entire record in an array:
135
+ To specify the entire record in a single array, you have to use option :len_fld or :fld_len,
136
+ and the array should contain the fields in strict sequence. Also see 'Working With Templates'.
137
+ example 1:
138
+ myline = FlatOut.new(21, :format => :len_fld)
139
+ val = [5, 'ABCD',
140
+ 5, 10,
141
+ 4.2, 10.23,
142
+ 3, 'EFG']
143
+ myline.put(val) # 'ABCD 000100010.23EFG '
144
+
145
+ example 2:
146
+ myline = FlatOut.new(21, :format => :fld_len)
147
+ val = ['ABCD', 5,
148
+ 10, 5,
149
+ 10.23, 4.2,
150
+ 'EFG', 3]
151
+ myline.put(val) # 'ABCD 000100010.23EFG '
152
+
153
+
134
154
  Command:
135
155
 
136
156
  myline.to_s
137
157
 
138
158
  Description:
139
159
  This will return the formatted fixed length record which you can write to a file.
140
- It will blank fill or truncate the output to the correct length.
160
+ It will blank fill or truncate the output to the correct length. Reset and put also
161
+ return myline.to_s.
141
162
 
142
163
  Command:
143
164
 
@@ -167,13 +188,20 @@ Command:
167
188
  == Working with Templates
168
189
 
169
190
  You can also specify a template during initialization, and then put values in the template
170
- with an array.
191
+ with an array. Templates can have length and positions as follows:
171
192
 
172
193
  example:
173
194
  f = FlatOut.new(18, :template => [[5,1],[5,6],[4.2,11]]) # '123456789012345678'
174
195
  val = ['ABCD',10,10.23]
175
196
  f.put(val) # 'ABCD 000100010.23 '
176
197
 
198
+ You can also skip the position specification if the fields are specified in strict sequence
199
+ in the template.
200
+ example:
201
+ f = FlatOut.new(18, :template => [5,5,4.2]) # '123456789012345678'
202
+ val = ['ABCD',10,10.23]
203
+ f.put(val) # 'ABCD 000100010.23 '
204
+
177
205
  == Full Cycle Example:
178
206
 
179
207
  myline = FlatOut.new(80)
@@ -196,8 +224,15 @@ Command:
196
224
  myline.put(30, 30, "END OF REPORT")
197
225
  puts myline.to_s
198
226
 
227
+ == Issues, Suggestions
228
+
229
+ * https://github.com/aksharma/flat_out/issues/
230
+ * or email me directly at (sharma.rubyonrails)
231
+ * this address ( @ )
232
+ * (sharmail_dot_com )
233
+
199
234
  == Contributing to flat_out
200
-
235
+
201
236
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
202
237
  * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
203
238
  * Fork the project.
data/lib/flat_out.rb CHANGED
@@ -1,14 +1,18 @@
1
1
  class FlatOut
2
+
3
+ #attr_accessor :flat_out, :flat_length, :base, :format, :template
4
+
2
5
  def initialize(rec_length, options={})
3
6
  self.reset(rec_length, options)
4
7
  end
5
8
 
6
9
  def reset(rec_length=@flat_length, options={})
7
- @flat_out = " " * rec_length
8
- @flat_length = rec_length
9
10
  @base = options[:base] ||= @base ||= 1
10
11
  @format = options[:format] ||= @format ||= :len_pos_fld
11
12
  @template = options[:template] ||= @template ||= []
13
+ @flat_length = rec_length
14
+ @flat_out = " " * rec_length
15
+ return @flat_out
12
16
  end
13
17
 
14
18
  def to_s
@@ -34,16 +38,45 @@ class FlatOut
34
38
  when :pos_fld_len then (pos = p1; fld = p2; len = p3)
35
39
  when :fld_pos_len then (fld = p1; pos = p2; len = p3)
36
40
  when :fld_len_pos then (fld = p1; len = p2; pos = p3)
41
+ when :fld_len then (fld = p1)
42
+ when :len_fld then (fld = p1)
37
43
  else (len = p1; pos = p2; fld = p3)
38
44
  end
39
45
  end
40
46
 
41
47
  case fld
42
48
  when Array
43
- fld.each_with_index do |field,idx|
44
- len = @template[idx][0]
45
- pos = @template[idx][1]
46
- put len, pos, field
49
+ if @template.size > 0 and @template[0].class == Array # :template => [[5,1],[5,6],[4.2,11]]
50
+ fld.each_with_index do |field,idx|
51
+ len = @template[idx][0]
52
+ pos = @template[idx][1]
53
+ put len, pos, field
54
+ end
55
+ elsif @template.size > 0 # :template => [5,5,4.2,3]
56
+ pos = @base
57
+ fld.each_with_index do |field, idx|
58
+ len = @template[idx]
59
+ put len, pos, field
60
+ pos = pos + real_len(len)
61
+ end
62
+ elsif @format == :fld_len # val = ['ABCD', 5, 10, 5]
63
+ @format = :len_pos_fld
64
+ pos = @base
65
+ fld.each_slice(2) do |arr|
66
+ field = arr[0]
67
+ len = arr[1]
68
+ put len, pos, field
69
+ pos = pos + real_len(len)
70
+ end
71
+ elsif @format == :len_fld # val = [5, 'ABCD', 4.2, 10.23]
72
+ @format = :len_pos_fld
73
+ pos = @base
74
+ fld.each_slice(2) do |arr|
75
+ len = arr[0]
76
+ field = arr[1]
77
+ put len, pos, field
78
+ pos = pos + real_len(len)
79
+ end
47
80
  end
48
81
  when String
49
82
  put_alpha len, pos, fld
@@ -56,6 +89,7 @@ class FlatOut
56
89
  put_integer len, pos, fld
57
90
  end
58
91
  end
92
+ return self.to_s
59
93
  end
60
94
 
61
95
  private
@@ -93,4 +127,16 @@ class FlatOut
93
127
  val = sprintf("%0.#{dec}f", fld)[-dec,dec]
94
128
  put_fld dec, pos, val
95
129
  end
130
+
131
+ def real_len(len)
132
+ return len if len.integer?
133
+
134
+ int = len.to_s.split(".")[0].to_i.abs
135
+ dec = len.to_s.split(".")[1].to_i
136
+ if len > 0
137
+ return int + 1 + dec
138
+ else
139
+ return int + dec
140
+ end
141
+ end
96
142
  end
@@ -48,6 +48,30 @@ describe "put exact length alpha with fld_pos_len format" do
48
48
  end
49
49
  end
50
50
 
51
+ describe "put whole record specified in an array with fld_len format" do
52
+ it "should build the format sequentially" do
53
+ f = FlatOut.new(21, :format => :fld_len)
54
+ val = ['ABCD', 5,
55
+ 10, 5,
56
+ 10.23, 4.2,
57
+ 'EFG', 3]
58
+ f.put(val)
59
+ f.to_s.should == 'ABCD 000100010.23EFG '
60
+ end
61
+ end
62
+
63
+ describe "put whole record specified in an array with len_fld format" do
64
+ it "should build the format sequentially" do
65
+ f = FlatOut.new(21, :format => :len_fld)
66
+ val = [5, 'ABCD',
67
+ 5, 10,
68
+ 4.2, 10.23,
69
+ 3, 'EFG']
70
+ f.put(val)
71
+ f.to_s.should == 'ABCD 000100010.23EFG '
72
+ end
73
+ end
74
+
51
75
  describe "put short length alpha" do
52
76
  it "should blank fill the trailing space" do
53
77
  f = FlatOut.new(6)
@@ -144,7 +168,7 @@ describe "put float with negative length" do
144
168
  end
145
169
  end
146
170
 
147
- describe "put with a template" do
171
+ describe "put with a template specifying len and pos" do
148
172
  it "should put multiple fields" do
149
173
  f = FlatOut.new(18, :template => [[5,1],[5,6],[4.2,11]])
150
174
  val = ['ABCD',10,10.23]
@@ -153,6 +177,15 @@ describe "put with a template" do
153
177
  end
154
178
  end
155
179
 
180
+ describe "put with a template specifying len only" do
181
+ it "should build the format sequentially" do
182
+ f = FlatOut.new(21, :template => [5,5,4.2,3])
183
+ val = ['ABCD',10,10.23,'EFG']
184
+ f.put(val)
185
+ f.to_s.should == 'ABCD 000100010.23EFG '
186
+ end
187
+ end
188
+
156
189
  describe "digits_only" do
157
190
  it "should remove non-digit characters" do
158
191
  FlatOut.digits_only('01(2)-3ABC4-5^678').should == "012345678"
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: flat_out
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.5
5
+ version: 0.0.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Anil Sharma