parse_me 0.0.2 → 0.0.3

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.
data/README.md CHANGED
@@ -7,7 +7,6 @@ The `parse_me` gem aims to provide an easy to use plain text parser. Currently o
7
7
  last_name: { required: true, length: 50 },
8
8
  age: { numeric: :integer },
9
9
  email: { required: true, email: true},
10
- last_seen: { date: "YYYY-MM-DD" }
11
10
  }
12
11
 
13
12
  options = {
@@ -15,7 +14,7 @@ The `parse_me` gem aims to provide an easy to use plain text parser. Currently o
15
14
  field_delimiter: "|"
16
15
  }
17
16
 
18
- result = ParseMe::VarWidthParser.parse(source_string, rules, options)
17
+ result = ParseMe::VarWidthParser.new.parse(source_string, rules, options)
19
18
  result.each do |record|
20
19
  record.valid? # => Runs the validations specified in rules, returns true if all pass
21
20
  record.attributes # => Returns a Hash with the parsed attributes, using rules' keys
data/lib/parse_me.rb CHANGED
@@ -1,8 +1,9 @@
1
- require "parse_me/version"
2
- require "parse_me/fixed_width_parser"
3
- require "parse_me/var_width_parser"
4
- require "parse_me/parsed_object"
5
- require "parse_me/transformations"
6
-
7
1
  module ParseMe
2
+ autoload :VERSION, "parse_me/version"
3
+ autoload :FixedWidthParser, "parse_me/fixed_width_parser"
4
+ autoload :VarWidthParser, "parse_me/var_width_parser"
5
+ autoload :ParsedObject, "parse_me/parsed_object"
6
+ autoload :Transformations, "parse_me/transformations"
7
+ autoload :Validations, "parse_me/validations"
8
+ autoload :InputSplitting, "parse_me/input_splitting"
8
9
  end
@@ -1,11 +1,5 @@
1
- require 'parse_me/parsed_object'
2
- require 'parse_me/input_splitting'
3
- require 'parse_me/input_splitting/fixed'
4
- require 'parse_me/input_splitting/var'
5
-
6
1
  module ParseMe
7
2
  class FixedWidthParser
8
- extend InputSplitting::Fixed
9
3
  include InputSplitting::Fixed
10
4
  end
11
5
  end
@@ -1,7 +1,7 @@
1
- require 'parse_me/input_splitting/fixed'
2
- require 'parse_me/input_splitting/var'
3
-
4
1
  module ParseMe
5
2
  module InputSplitting
3
+ autoload :Common, "parse_me/input_splitting/common"
4
+ autoload :Fixed, "parse_me/input_splitting/fixed"
5
+ autoload :Var, "parse_me/input_splitting/var"
6
6
  end
7
7
  end
@@ -0,0 +1,7 @@
1
+ module ParseMe
2
+ module InputSplitting
3
+ module Common
4
+
5
+ end
6
+ end
7
+ end
@@ -1,9 +1,10 @@
1
- require 'parse_me/input_splitting/fixed/labels'
2
- require 'parse_me/input_splitting/fixed/base'
3
-
4
1
  module ParseMe
5
2
  module InputSplitting
6
3
  module Fixed
4
+
5
+ autoload :Base, "parse_me/input_splitting/fixed/base"
6
+ autoload :Labels, "parse_me/input_splitting/fixed/labels"
7
+
7
8
  def self.included(base)
8
9
  base.instance_eval do
9
10
  include Base
@@ -11,13 +12,6 @@ module ParseMe
11
12
  end
12
13
  end
13
14
 
14
- def self.extended(base)
15
- base.instance_eval do
16
- extend Base
17
- extend Labels
18
- end
19
- end
20
-
21
15
  def parse source, rules, options = {}
22
16
  @options = options
23
17
  @options[:labeled_rows] ||= false
@@ -25,7 +25,7 @@ module ParseMe
25
25
 
26
26
  # Splits the input into lines, uses the file width for this.
27
27
  def split_input
28
- @split_input ||= @source.delete("\n").scan(/.{#{file_width}}/)
28
+ @split_input ||= @source.delete(@options[:row_delimiter].to_s).scan(/.{#{file_width}}/)
29
29
  end
30
30
 
31
31
  # Gets the list of attributes specified in @rules. Can optionally retrieve them from a labeled set of rules, the optional label argument should be supplied when the labeled_rows option is set.
@@ -0,0 +1,27 @@
1
+ module ParseMe
2
+ module InputSplitting
3
+ module Var
4
+
5
+ autoload :Base, "parse_me/input_splitting/var/base"
6
+
7
+ def self.included(base)
8
+ base.instance_eval do
9
+ include Base
10
+ end
11
+ end
12
+
13
+ def parse source, rules, options = {}
14
+ @options = options
15
+ @options[:row_delimiter] ||= "\n"
16
+ @options[:field_delimiter] ||= "|"
17
+
18
+ @rules = rules
19
+ @source = source
20
+
21
+ collection.map do |record|
22
+ ParsedObject.new(record, @rules)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module ParseMe
2
+ module InputSplitting
3
+ module Var
4
+ module Base
5
+ def collection
6
+ split_input.map do |encoded_record|
7
+ member(encoded_record)
8
+ end
9
+ end
10
+
11
+ def member encoded_record
12
+ decoded_record = encoded_record.split(@options[:field_delimiter])
13
+ Hash[attributes.zip decoded_record]
14
+ end
15
+
16
+ def split_input
17
+ @split_input ||= @source.split(@options[:row_delimiter])
18
+ end
19
+
20
+ def attributes
21
+ @rules.keys
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,6 +1,3 @@
1
- require 'parse_me/transformations'
2
- require 'parse_me/validations'
3
-
4
1
  module ParseMe
5
2
  class ParsedObject
6
3
  include ParseMe::Validations
@@ -27,7 +24,9 @@ module ParseMe
27
24
  end
28
25
 
29
26
  def validation_rules
30
- @validation_rules ||= ParseMe::Validations.public_instance_methods
27
+ @validation_rules ||= ParseMe::Validations.public_instance_methods.map do |m|
28
+ m.to_s.gsub("_validation", "").to_sym
29
+ end
31
30
  end
32
31
 
33
32
  def apply_transformations
@@ -50,9 +49,10 @@ module ParseMe
50
49
  end
51
50
  end
52
51
 
53
- def validate(attr, validation, val)
54
- unless method(validation).call(@attributes[attr], val)
55
- add_error("#{validation} validation failed for '#{attr}' => '#{val}'")
52
+ def validate(attr, validation_name, val)
53
+ validation_method = "#{validation_name}_validation"
54
+ unless method(validation_method).call(@attributes[attr], val)
55
+ add_error("#{validation_name} validation failed for '#{attr}' => '#{val}'")
56
56
  end
57
57
  end
58
58
 
@@ -1,7 +1,7 @@
1
1
  module ParseMe
2
2
  module Transformations
3
3
  def ghost_decimal_scale(input, rule_value)
4
- raise Exception("ghost_decimal_scale should be able to ve converted to int") unless (val = rule_value.to_i)
4
+ raise Exception("ghost_decimal_scale should be able to be converted to int") unless (val = rule_value.to_i)
5
5
 
6
6
  input.to_f / (10**val)
7
7
  end
@@ -1,11 +1,21 @@
1
1
  module ParseMe
2
2
  module Validations
3
- def length input, rule_value
3
+ def length_validation input, rule_value
4
4
  input.to_s.length <= rule_value.to_i
5
5
  end
6
6
 
7
- def required input, rule_value
7
+ def required_validation input, rule_value
8
8
  (not rule_value) || ((!input.nil?) && (input.to_s.strip.length > 0))
9
9
  end
10
+
11
+ def numeric_validation input, rule_value
12
+ regex_pattern = /^-?\d*\.?\d+$/
13
+ input === regex_pattern
14
+ end
15
+
16
+ def email_validation input, rule_value
17
+ regex_pattern = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
18
+ input === regex_pattern
19
+ end
10
20
  end
11
21
  end
@@ -1,6 +1,5 @@
1
- require 'parse_me/parsed_object'
2
-
3
1
  module ParseMe
4
2
  class VarWidthParser
3
+ include InputSplitting::Var
5
4
  end
6
5
  end
@@ -1,3 +1,3 @@
1
1
  module ParseMe
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -17,13 +17,6 @@ describe 'FixedWidthParser' do
17
17
  before :each do
18
18
  class Dummy; include ParseMe::InputSplitting::Fixed; end
19
19
  @dummy = Dummy.new
20
-
21
- subject.public_instance_methods.each do |pim|
22
- subject.module_eval do
23
- module_function pim
24
- public pim
25
- end
26
- end
27
20
  end
28
21
 
29
22
  it 'should be defined' do
@@ -33,7 +26,7 @@ describe 'FixedWidthParser' do
33
26
  describe 'parse' do
34
27
 
35
28
  it 'should define the parse method' do
36
- subject.method(:parse).should be
29
+ subject.public_instance_method(:parse).should be
37
30
  end
38
31
 
39
32
  describe 'test case 1' do
@@ -15,7 +15,7 @@ describe 'FixedWidthParser' do
15
15
  {name: 'Lorem Ipsum', last_name: 'Dolor sit amet'},
16
16
  {name: 'Foo', last_name: 'Bar'}
17
17
  ]
18
- @result = subject.parse(@source, @rules)
18
+ @result = subject.new.parse(@source, @rules)
19
19
  end
20
20
 
21
21
  it 'should return an array' do
@@ -0,0 +1,16 @@
1
+ require './spec/spec_helper'
2
+ require "./lib/parse_me"
3
+
4
+ describe 'Fixed' do
5
+ subject {ParseMe::InputSplitting::Common}
6
+
7
+ before :each do
8
+ class Dummy; include ParseMe::InputSplitting::Common; end
9
+ @dummy = Dummy.new
10
+ end
11
+
12
+ it 'should be defined' do
13
+ should be
14
+ end
15
+
16
+ end
@@ -96,6 +96,18 @@ describe 'ParsedObject' do
96
96
  @inv = ParseMe::FixedWidthParser.new.parse(@inv_source, @rules)
97
97
  end
98
98
 
99
+ it "should have a valid first name" do
100
+ @inv[2].first.should eq("John")
101
+ end
102
+
103
+ it "should have a valid second name" do
104
+ @inv[2].second.should eq("Doe")
105
+ end
106
+
107
+ it "should have an empty third name" do
108
+ @inv[2].third.should eq("")
109
+ end
110
+
99
111
  it "should have it's fourth record invalid" do
100
112
  @inv[2].valid?.should be(false)
101
113
  end
@@ -18,7 +18,7 @@ describe 'Validations' do
18
18
 
19
19
  describe 'length' do
20
20
  it 'should be' do
21
- subject.method(:length).should be
21
+ subject.method(:length_validation).should be
22
22
  end
23
23
 
24
24
  describe 'proper input' do
@@ -27,49 +27,49 @@ describe 'Validations' do
27
27
  end
28
28
 
29
29
  it 'should be truthy with length 25' do
30
- subject.length(@input, 25).should be(true)
30
+ subject.length_validation(@input, 25).should be(true)
31
31
  end
32
32
 
33
33
  it 'should be falsy with length 24' do
34
- subject.length(@input, 24).should be(false)
34
+ subject.length_validation(@input, 24).should be(false)
35
35
  end
36
36
 
37
37
  it 'should be truthy with length 35' do
38
- subject.length(@input, 35).should be(true)
38
+ subject.length_validation(@input, 35).should be(true)
39
39
  end
40
40
  end
41
41
  end
42
42
 
43
43
  describe 'required' do
44
44
  it 'should be' do
45
- subject.method(:required).should be
45
+ subject.method(:required_validation).should be
46
46
  end
47
47
 
48
48
  describe 'true' do
49
49
  it 'should be truthy with a regular string' do
50
- subject.required('FooBar', true).should be(true)
50
+ subject.required_validation('FooBar', true).should be(true)
51
51
  end
52
52
 
53
53
  it 'should be falsy with a whitespace only string' do
54
- subject.required(' ', true).should be(false)
54
+ subject.required_validation(' ', true).should be(false)
55
55
  end
56
56
 
57
57
  it 'should be falsy with an empty string' do
58
- subject.required('', true).should be(false)
58
+ subject.required_validation('', true).should be(false)
59
59
  end
60
60
  end
61
61
 
62
62
  describe 'false' do
63
63
  it 'should be truthy with a regular string' do
64
- subject.required('FooBar', false).should be(true)
64
+ subject.required_validation('FooBar', false).should be(true)
65
65
  end
66
66
 
67
67
  it 'should be truthy with a whitespace only string' do
68
- subject.required(' ', false).should be(true)
68
+ subject.required_validation(' ', false).should be(true)
69
69
  end
70
70
 
71
71
  it 'should be truthy with an empty string' do
72
- subject.required('', false).should be(true)
72
+ subject.required_validation('', false).should be(true)
73
73
  end
74
74
  end
75
75
  end
@@ -0,0 +1,349 @@
1
+ require './spec/spec_helper'
2
+ require "./lib/parse_me"
3
+
4
+ describe "VarWidthParser" do
5
+ subject {ParseMe::VarWidthParser}
6
+
7
+ describe "InputSplitting" do
8
+ subject {ParseMe::InputSplitting}
9
+
10
+ it "should be defined" do
11
+ should be
12
+ end
13
+
14
+ describe "Var" do
15
+ subject {ParseMe::InputSplitting::Var}
16
+
17
+ before :each do
18
+ class Dummy; include ParseMe::InputSplitting::Var; end
19
+ @dummy = Dummy.new
20
+ end
21
+
22
+ it "should be defined" do
23
+ should be
24
+ end
25
+
26
+ describe "attributes" do
27
+
28
+ it "should be defined" do
29
+ @dummy.method(:attributes).should be
30
+ end
31
+
32
+ it "should return the attributes collection" do
33
+ @dummy.instance_eval do
34
+ @rules = {name: {}, last_name: {}, age: {}, power: {}}
35
+ end
36
+ @dummy.attributes.should eq([:name, :last_name, :age, :power])
37
+ end
38
+
39
+ end
40
+
41
+ describe "split_input" do
42
+
43
+ it "should be defined" do
44
+ @dummy.method(:split_input).should be
45
+ end
46
+
47
+ it "should split in break line characters" do
48
+ @dummy.instance_eval do
49
+ @source = "First Line\nSecond Line\nThird Line"
50
+ @options = {row_delimiter: "\n"}
51
+ end
52
+ @dummy.split_input.should eq(["First Line", "Second Line", "Third Line"])
53
+ end
54
+
55
+ it "should split in NL character combinations" do
56
+ @dummy.instance_eval do
57
+ @source = "First LineNLSecond LineNLThird Line"
58
+ @options = {row_delimiter: "NL"}
59
+ end
60
+ @dummy.split_input.should eq(["First Line", "Second Line", "Third Line"])
61
+ end
62
+ end
63
+
64
+ describe "parse" do
65
+
66
+ it "should define the parse method" do
67
+ subject.public_instance_method(:parse).should be
68
+ end
69
+
70
+ describe "test case 1" do
71
+ before :each do
72
+ @source = "Lorem Ipsum|Dolor sit amet\nFoo|Bar"
73
+ @rules = {
74
+ name: {required: true, length: 15},
75
+ last_name: {required: true, length: 20}
76
+ }
77
+ test_rules = @rules
78
+ test_source = @source
79
+ @dummy.instance_eval do
80
+ @source = test_source
81
+ @rules = test_rules
82
+ @options = {row_delimiter: "\n", field_delimiter: "|"}
83
+ end
84
+ end
85
+
86
+ it "should properly split the input" do
87
+ @dummy.split_input.should eq([
88
+ "Lorem Ipsum|Dolor sit amet",
89
+ "Foo|Bar"
90
+ ])
91
+ end
92
+
93
+ it "should parse valid attributes" do
94
+ @dummy.attributes.should eq([:name, :last_name])
95
+ end
96
+
97
+ describe "member" do
98
+ it "should create a valid attributes hash for first string" do
99
+ @dummy.member(@dummy.split_input[0]).should eq({
100
+ name: "Lorem Ipsum",
101
+ last_name: "Dolor sit amet"
102
+ })
103
+ end
104
+
105
+ it "should create a valid attributes hash for second string" do
106
+ @dummy.member(@dummy.split_input[1]).should eq({
107
+ name: "Foo",
108
+ last_name: "Bar"
109
+ })
110
+ end
111
+ end
112
+
113
+ describe "collection" do
114
+ it "should map a valid collection of members" do
115
+ @dummy.collection.should eq([
116
+ {
117
+ name: "Lorem Ipsum",
118
+ last_name: "Dolor sit amet"
119
+ },
120
+ {
121
+ name: "Foo",
122
+ last_name: "Bar"
123
+ }
124
+ ])
125
+ end
126
+ end
127
+ end
128
+
129
+ #describe 'test case 2 (labeled rows)' do
130
+ #before :each do
131
+ #@source = '0Lorem Ipsum Dolor sit amet '
132
+ #@source += '1Foo Bar Baz '
133
+ #@rules = {
134
+ #"0" => {
135
+ #name: {required: true, length: 15},
136
+ #last_name: {required: true, length: 20}
137
+ #},
138
+ #"1" => {
139
+ #first: {required: true, length: 15},
140
+ #second: {required: true, length: 10},
141
+ #third: {required: true, length: 10}
142
+ #}
143
+ #}
144
+ #test_rules = @rules
145
+ #test_source = @source
146
+ #@dummy.instance_eval do
147
+ #@source = test_source
148
+ #@rules = test_rules
149
+ #@options = {labeled_rows: true}
150
+ #end
151
+ #end
152
+
153
+ #it 'should have a 72 characters long source' do
154
+ #@source.length.should eq(72)
155
+ #end
156
+
157
+ #it 'should properly get length rules' do
158
+ #@dummy.get_length_rules.should eq([15,20,15,10,10])
159
+ #end
160
+
161
+ #it 'should acknowledge valid length rules' do
162
+ #@dummy.valid_length_rules?.should be
163
+ #end
164
+
165
+ #it 'should have labeled rows' do
166
+ #@dummy.labeled_rows?.should be
167
+ #end
168
+
169
+ #it 'should have labels 0 and 1' do
170
+ #@dummy.labels.should eq(['0','1'])
171
+ #end
172
+
173
+ #it 'should have label_lengths equal to 1 and 1' do
174
+ #@dummy.label_lengths.should eq([1,1])
175
+ #end
176
+
177
+ #it 'should have label_length equal to 1' do
178
+ #@dummy.label_length.should eq(1)
179
+ #end
180
+
181
+ #it 'should have a width of 36' do
182
+ #@dummy.file_width.should eq(36)
183
+ #end
184
+
185
+ #it 'should properly split the input' do
186
+ #@dummy.split_input.should eq([
187
+ #'0Lorem Ipsum Dolor sit amet ',
188
+ #'1Foo Bar Baz '
189
+ #])
190
+ #end
191
+
192
+ #it 'should create a proper unpack pattern for label "0"' do
193
+ #@dummy.unpack_pattern('0').should eq('A1A15A20')
194
+ #end
195
+
196
+ #it 'should create a proper unpack pattern for label "1"' do
197
+ #@dummy.unpack_pattern('1').should eq('A1A15A10A10')
198
+ #end
199
+
200
+ #describe 'label_for' do
201
+ #it 'should fetch the label of the first string' do
202
+ #@dummy.label_for(@dummy.split_input[0]).should eq('0')
203
+ #end
204
+
205
+ #it 'should fetch the label of the second string' do
206
+ #@dummy.label_for(@dummy.split_input[1]).should eq('1')
207
+ #end
208
+ #end
209
+
210
+ #describe 'labeled_member' do
211
+ #it 'should create a proper attributes hash for first string' do
212
+ #str = @dummy.split_input[0]
213
+ #label = @dummy.label_for str
214
+ #@dummy.labeled_member(str, label).should eq({
215
+ #name: 'Lorem Ipsum',
216
+ #last_name: 'Dolor sit amet',
217
+ #__label: '0'
218
+ #})
219
+ #end
220
+
221
+ #it 'should create a proper attributes hash for second string' do
222
+ #str = @dummy.split_input[1]
223
+ #label = @dummy.label_for str
224
+ #@dummy.labeled_member(str, label).should eq({
225
+ #first: 'Foo',
226
+ #second: 'Bar',
227
+ #third: 'Baz',
228
+ #__label: '1'
229
+ #})
230
+ #end
231
+ #end
232
+
233
+ #describe 'attributes' do
234
+ #it 'should parse valid attributes for first label' do
235
+ #@dummy.attributes('0').should eq([:name, :last_name])
236
+ #end
237
+
238
+ #it 'should parse valid attributes for second label' do
239
+ #@dummy.attributes('1').should eq([:first, :second, :third])
240
+ #end
241
+ #end
242
+
243
+ #describe 'collection' do
244
+ #it 'should map a valid collection of members' do
245
+ #@dummy.collection.should eq([
246
+ #{
247
+ #name: 'Lorem Ipsum',
248
+ #last_name: 'Dolor sit amet',
249
+ #__label: '0'
250
+ #},
251
+ #{
252
+ #first: 'Foo',
253
+ #second: 'Bar',
254
+ #third: 'Baz',
255
+ #__label: '1'
256
+ #}
257
+ #])
258
+ #end
259
+ #end
260
+
261
+ #end
262
+
263
+ #describe 'test case 4' do
264
+ #before :each do
265
+ #@source = "Lorem Ipsum Dolor sit amet \nFoo Bar \n"
266
+ #@rules = {
267
+ #name: {required: true, length: 15},
268
+ #last_name: {required: true, length: 20}
269
+ #}
270
+ #test_rules = @rules
271
+ #test_source = @source
272
+ #@dummy.instance_eval do
273
+ #@source = test_source
274
+ #@rules = test_rules
275
+ #@options = {}
276
+ #end
277
+ #end
278
+
279
+ #it 'should have a 72 characters long source' do
280
+ #@source.length.should eq(72)
281
+ #end
282
+
283
+ #it 'should properly get length rules' do
284
+ #@dummy.get_length_rules.should eq([15,20])
285
+ #end
286
+
287
+ #it 'should acknowledge valid length rules' do
288
+ #@dummy.valid_length_rules?.should be_true
289
+ #end
290
+
291
+ #it 'should have NO labeled rows' do
292
+ #@dummy.labeled_rows?.should be_false
293
+ #end
294
+
295
+ #it 'should have a width of 35' do
296
+ #@dummy.file_width.should eq(35)
297
+ #end
298
+
299
+ #it 'should properly split the input' do
300
+ #@dummy.split_input.should eq([
301
+ #'Lorem Ipsum Dolor sit amet ',
302
+ #'Foo Bar '
303
+ #])
304
+ #end
305
+
306
+ #it 'should create a proper unpack pattern' do
307
+ #@dummy.unpack_pattern.should eq('A15A20')
308
+ #end
309
+
310
+ #it 'should parse valid attributes' do
311
+ #@dummy.attributes.should eq([:name, :last_name])
312
+ #end
313
+
314
+ #describe 'member' do
315
+ #it 'should create a valid attributes hash for first string' do
316
+ #@dummy.member(@dummy.split_input[0]).should eq({
317
+ #name: 'Lorem Ipsum',
318
+ #last_name: 'Dolor sit amet'
319
+ #})
320
+ #end
321
+
322
+ #it 'should create a valid attributes hash for second string' do
323
+ #@dummy.member(@dummy.split_input[1]).should eq({
324
+ #name: 'Foo',
325
+ #last_name: 'Bar'
326
+ #})
327
+ #end
328
+ #end
329
+
330
+ #describe 'collection' do
331
+ #it 'should map a valid collection of members' do
332
+ #@dummy.collection.should eq([
333
+ #{
334
+ #name: 'Lorem Ipsum',
335
+ #last_name: 'Dolor sit amet'
336
+ #},
337
+ #{
338
+ #name: 'Foo',
339
+ #last_name: 'Bar'
340
+ #}
341
+ #])
342
+ #end
343
+ #end
344
+ #end
345
+ end
346
+ end
347
+
348
+ end
349
+ end
@@ -0,0 +1,52 @@
1
+ require "./spec/spec_helper"
2
+ require "./lib/parse_me"
3
+
4
+ describe "VarWidthParser" do
5
+ subject {ParseMe::VarWidthParser}
6
+
7
+ describe 'Test case 1' do
8
+ before :each do
9
+ @source = "Lorem Ipsum|Dolor sit amet|23|lorem@dolor.com\n"
10
+ @source+= "Foo|Bar|34|foo@bar.com"
11
+ @rules = {
12
+ name: {required: true, length: 15},
13
+ last_name: {required: true, length: 20},
14
+ age: {required: true, length: 3, numeric: true},
15
+ email: {required: true, email: true}
16
+ }
17
+ @attributes = [
18
+ {
19
+ name: "Lorem Ipsum",
20
+ last_name: "Dolor sit amet",
21
+ age: "23",
22
+ email: "lorem@dolor.com"
23
+ },
24
+ {
25
+ name: "Foo",
26
+ last_name: "Bar",
27
+ age: "34",
28
+ email: "foo@bar.com"
29
+ }
30
+ ]
31
+ @result = subject.new.parse(@source, @rules)
32
+ end
33
+
34
+ it "should return an array" do
35
+ @result.class.should eq(Array)
36
+ end
37
+
38
+ it "should properly parse attributes for record with index 0" do
39
+ @result[0].name.should eq(@attributes[0][:name])
40
+ @result[0].last_name.should eq(@attributes[0][:last_name])
41
+ @result[0].age.should eq(@attributes[0][:age])
42
+ @result[0].email.should eq(@attributes[0][:email])
43
+ end
44
+
45
+ it "should properly parse attributes for record with index 1" do
46
+ @result[1].name.should eq(@attributes[1][:name])
47
+ @result[1].last_name.should eq(@attributes[1][:last_name])
48
+ @result[1].age.should eq(@attributes[1][:age])
49
+ @result[1].email.should eq(@attributes[1][:email])
50
+ end
51
+ end
52
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parse_me
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-06 00:00:00.000000000 Z
12
+ date: 2013-04-25 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Plain text file parser
15
15
  email:
@@ -28,10 +28,12 @@ files:
28
28
  - lib/parse_me.rb
29
29
  - lib/parse_me/fixed_width_parser.rb
30
30
  - lib/parse_me/input_splitting.rb
31
+ - lib/parse_me/input_splitting/common.rb
31
32
  - lib/parse_me/input_splitting/fixed.rb
32
33
  - lib/parse_me/input_splitting/fixed/base.rb
33
34
  - lib/parse_me/input_splitting/fixed/labels.rb
34
35
  - lib/parse_me/input_splitting/var.rb
36
+ - lib/parse_me/input_splitting/var/base.rb
35
37
  - lib/parse_me/parsed_object.rb
36
38
  - lib/parse_me/transformations.rb
37
39
  - lib/parse_me/validations.rb
@@ -40,6 +42,7 @@ files:
40
42
  - parse_me.gemspec
41
43
  - spec/fixed_width/input_splitting_spec.rb
42
44
  - spec/fixed_width/parser_spec.rb
45
+ - spec/input_splitting/common_spec.rb
43
46
  - spec/namespace_spec.rb
44
47
  - spec/parsed_object/parsed_object_spec.rb
45
48
  - spec/spec_helper.rb
@@ -47,6 +50,8 @@ files:
47
50
  - spec/validation/basic_spec.rb
48
51
  - spec/validation/date_spec.rb
49
52
  - spec/validation/numeric_spec.rb
53
+ - spec/var_width/input_splitting_spec.rb
54
+ - spec/var_width/parser_spec.rb
50
55
  homepage: https://github.com/sergelerator/parse_me
51
56
  licenses: []
52
57
  post_install_message:
@@ -61,7 +66,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
61
66
  version: '0'
62
67
  segments:
63
68
  - 0
64
- hash: 1587971647518469554
69
+ hash: 961821889
65
70
  required_rubygems_version: !ruby/object:Gem::Requirement
66
71
  none: false
67
72
  requirements:
@@ -70,10 +75,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
75
  version: '0'
71
76
  segments:
72
77
  - 0
73
- hash: 1587971647518469554
78
+ hash: 961821889
74
79
  requirements: []
75
80
  rubyforge_project:
76
- rubygems_version: 1.8.24
81
+ rubygems_version: 1.8.25
77
82
  signing_key:
78
83
  specification_version: 3
79
84
  summary: Parse your fixed or variable width plain text files using your own custom
@@ -81,6 +86,7 @@ summary: Parse your fixed or variable width plain text files using your own cust
81
86
  test_files:
82
87
  - spec/fixed_width/input_splitting_spec.rb
83
88
  - spec/fixed_width/parser_spec.rb
89
+ - spec/input_splitting/common_spec.rb
84
90
  - spec/namespace_spec.rb
85
91
  - spec/parsed_object/parsed_object_spec.rb
86
92
  - spec/spec_helper.rb
@@ -88,3 +94,5 @@ test_files:
88
94
  - spec/validation/basic_spec.rb
89
95
  - spec/validation/date_spec.rb
90
96
  - spec/validation/numeric_spec.rb
97
+ - spec/var_width/input_splitting_spec.rb
98
+ - spec/var_width/parser_spec.rb