fixed_width_parser 1.0.0

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/.rspec ADDED
@@ -0,0 +1,4 @@
1
+ --color
2
+ --format documentation
3
+ --backtrace
4
+ --debug
data/.rvmrc ADDED
@@ -0,0 +1,2 @@
1
+ rvm use ruby-1.8.7-p334@fixed-width-parser
2
+ rvm info
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source :gemcutter
2
+
3
+ group :development, :test do
4
+ gem 'ruby-debug'
5
+ gem 'guard'
6
+ gem 'rb-fsevent'
7
+ gem 'growl'
8
+ gem 'guard-rspec'
9
+ gem 'guard-shell'
10
+ end
11
+
12
+ # Specify your gem's dependencies in geonames_client.gemspec
13
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,52 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ fixed_width_parser (1.0.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ columnize (0.3.4)
10
+ diff-lcs (1.1.3)
11
+ gem-dandy (0.2.1)
12
+ trollop (= 1.16.2)
13
+ growl (1.0.3)
14
+ guard (0.6.3)
15
+ thor (~> 0.14.6)
16
+ guard-rspec (0.4.5)
17
+ guard (>= 0.4.0)
18
+ guard-shell (0.1.1)
19
+ guard (>= 0.2.0)
20
+ linecache (0.46)
21
+ rbx-require-relative (> 0.0.4)
22
+ rb-fsevent (0.4.3.1)
23
+ rbx-require-relative (0.0.5)
24
+ rspec (2.6.0)
25
+ rspec-core (~> 2.6.0)
26
+ rspec-expectations (~> 2.6.0)
27
+ rspec-mocks (~> 2.6.0)
28
+ rspec-core (2.6.4)
29
+ rspec-expectations (2.6.0)
30
+ diff-lcs (~> 1.1.2)
31
+ rspec-mocks (2.6.0)
32
+ ruby-debug (0.10.4)
33
+ columnize (>= 0.1)
34
+ ruby-debug-base (~> 0.10.4.0)
35
+ ruby-debug-base (0.10.4)
36
+ linecache (>= 0.3)
37
+ thor (0.14.6)
38
+ trollop (1.16.2)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ fixed_width_parser!
45
+ gem-dandy
46
+ growl
47
+ guard
48
+ guard-rspec
49
+ guard-shell
50
+ rb-fsevent
51
+ rspec
52
+ ruby-debug
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # guard 'shell' do
4
+ # watch( 'fixed_width_parser.rb' ) { |m| `ruby fixed_width_parser.rb` }
5
+ # end
6
+
7
+ guard 'rspec', :version => 2, :all_on_start => true, :all_after_pass => false, :cli => '--color --format doc' do
8
+ watch( %r{^spec/.+_spec\.rb$} )
9
+ watch( %r{^lib/(.+)\.rb$} ) { |m| "spec/lib/#{m[1]}_spec.rb" }
10
+ watch( 'spec/spec_helper.rb' ) { "spec" }
11
+ end
data/README.rdoc ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "fixed_width_parser/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "fixed_width_parser"
7
+ s.version = FixedWidthParser::VERSION
8
+ s.authors = ["C. Jason Harrelson"]
9
+ s.email = ["jason@lookforwardenterprises.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{}
12
+ s.description = %q{}
13
+
14
+ s.rubyforge_project = "fixed_width_parser"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ %w(
23
+ gem-dandy
24
+ rspec
25
+ ).each do |development_dependency|
26
+ s.add_development_dependency development_dependency
27
+ end
28
+
29
+ # s.add_runtime_dependency "rest-client"
30
+ end
@@ -0,0 +1,84 @@
1
+ module FixedWidthParser
2
+
3
+ def self.foreach( filepath, formats, options={} )
4
+ File.open( filepath, 'r' ) do |f|
5
+ f.each_line do |line|
6
+ line.chomp!
7
+ next if line.nil? || line.empty?
8
+
9
+ yield parse( line, formats, options )
10
+ end
11
+ end
12
+ end
13
+
14
+ def self.foreach_named( filepath, formats, options={} )
15
+ File.open( filepath, 'r' ) do |f|
16
+ f.each_line do |line|
17
+ line.chomp!
18
+ next if line.nil? || line.empty?
19
+
20
+ yield parse_named( line, formats, options )
21
+ end
22
+ end
23
+ end
24
+
25
+ def self.parse( line, formats, options={} )
26
+ raise 'Invalid format: expected an array of integers' unless formats.is_a?( Array )
27
+
28
+ regex = generate_regex( formats )
29
+
30
+ line.chomp!
31
+
32
+ parts = regex.match( line )[1..formats.size]
33
+
34
+ options[:rstrip] ? parts.map { |p| p.rstrip } : parts
35
+ end
36
+
37
+ def self.parse_named( line, formats, options={} )
38
+ unless formats.is_a?( Array )
39
+ unless formats.first.is_a?( Array ) #&& formats.first.size != 2
40
+ raise 'Invalid format: expected a hash-like array'
41
+ end
42
+ end
43
+
44
+ names = formats.collect { |name,length| name.to_s }
45
+ lengths = formats.collect { |name,length| length }
46
+ regex = generate_regex( lengths )
47
+
48
+ line.chomp!
49
+
50
+ parts = regex.match( line )[1..formats.size]
51
+ parts = options[:rstrip] ? parts.map { |p| p.rstrip } : parts
52
+
53
+ Hash[*(names.zip( parts ).flatten)]
54
+ end
55
+
56
+ private
57
+
58
+ def self.calculate_ranges( formats )
59
+ ranges = []
60
+ start = 0
61
+ _end = 0
62
+
63
+ formats.each do |length|
64
+ start = _end
65
+ _end = _end + length
66
+ ranges << (start.._end-1)
67
+ end
68
+
69
+ ranges
70
+ end
71
+
72
+ def self.generate_regex( formats )
73
+ regex = '^'
74
+
75
+ formats.each do |length|
76
+ regex << "(.{#{length}})"
77
+ end
78
+
79
+ regex << '$'
80
+
81
+ Regexp.new( regex )
82
+ end
83
+
84
+ end
@@ -0,0 +1,3 @@
1
+ module FixedWidthParser
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,8 @@
1
+ DOCUMENT 00014438P PLAT
2
+ PARTIES DYECK EW ADDN
3
+ PARTIES DHOMER STEPHEN M
4
+ PARTIES DHOMER REBECCA R
5
+ DOCUMENT 00023133P PLAT
6
+ PARTIES DJUSTIN J/V
7
+ PARTIES DFRAZIER BRIAN TR
8
+
@@ -0,0 +1,242 @@
1
+ require 'spec_helper'
2
+
3
+ describe FixedWidthParser do
4
+
5
+ let :fixed_width_file do
6
+ File.join File.dirname( __FILE__ ), '..', 'data', 'test.txt'
7
+ end
8
+
9
+ let :lengths_format do
10
+ [10,8,8,14]
11
+ end
12
+
13
+ let :named_lengths_format do
14
+ [
15
+ ['a', 10],
16
+ [:b, 8 ],
17
+ [:c, 8 ],
18
+ [:d, 14]
19
+ ]
20
+ end
21
+
22
+ let :line do
23
+ "DOCUMENT 00014438P PLAT "
24
+ end
25
+
26
+ context 'yielding the correct lines' do
27
+
28
+ context '.foreach' do
29
+
30
+ context 'when given a valid format' do
31
+
32
+ before :each do
33
+ @yielded_lines = []
34
+ end
35
+
36
+ let :yielded_lines do
37
+ @yielded_lines
38
+ end
39
+
40
+ context 'when rstrip is false' do
41
+
42
+ before :each do
43
+ FixedWidthParser.foreach( fixed_width_file,
44
+ lengths_format ) do |line|
45
+ @yielded_lines << line
46
+ end
47
+ end
48
+
49
+ it "should yield the correct number of lines" do
50
+ yielded_lines.size.should == 7
51
+ end
52
+
53
+ it "should yield each line correctly parsed" do
54
+ yielded_lines[0].should == ['DOCUMENT ', '00014438', 'P ', 'PLAT ']
55
+ end
56
+
57
+ end
58
+
59
+ context 'when rstrip is true' do
60
+
61
+ before :each do
62
+ FixedWidthParser.foreach( fixed_width_file,
63
+ lengths_format, :rstrip => true ) do |line|
64
+ @yielded_lines << line
65
+ end
66
+ end
67
+
68
+ it "should yield the correct number of lines" do
69
+ yielded_lines.size.should == 7
70
+ end
71
+
72
+ it "should yield each line correctly parsed" do
73
+ yielded_lines[0].should == ['DOCUMENT', '00014438', 'P', 'PLAT']
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+ context 'when given an invalid format' do
81
+
82
+ it "should raise an exception when the format is not an array of integers" do
83
+ lambda { FixedWidthParser.foreach( fixed_width_file, {} ) { |l| } }.should(
84
+ raise_error( RuntimeError, 'Invalid format: expected an array of integers' )
85
+ )
86
+ end
87
+
88
+ end
89
+
90
+ end
91
+
92
+ context '.foreach_named' do
93
+
94
+ context 'when given a valid format' do
95
+
96
+ before :each do
97
+ @yielded_lines = []
98
+ end
99
+
100
+ let :yielded_lines do
101
+ @yielded_lines
102
+ end
103
+
104
+ context 'when rstrip is false' do
105
+
106
+ before :each do
107
+ FixedWidthParser.foreach_named( fixed_width_file,
108
+ named_lengths_format ) do |line|
109
+ @yielded_lines << line
110
+ end
111
+ end
112
+
113
+ it "should yield the correct number of lines" do
114
+ yielded_lines.size.should == 7
115
+ end
116
+
117
+ it "should yield each line correctly parsed" do
118
+ yielded_lines[0].should == {
119
+ 'a', 'DOCUMENT ',
120
+ 'b', '00014438',
121
+ 'c', 'P ',
122
+ 'd', 'PLAT '
123
+ }
124
+ end
125
+
126
+ end
127
+
128
+ context 'when rstrip is true' do
129
+
130
+ before :each do
131
+ FixedWidthParser.foreach_named( fixed_width_file,
132
+ named_lengths_format, :rstrip => true ) do |line|
133
+ @yielded_lines << line
134
+ end
135
+ end
136
+
137
+ xit "should yield the correct number of lines" do
138
+ yielded_lines.size.should == 7
139
+ end
140
+
141
+ it "should yield each line correctly parsed" do
142
+ yielded_lines[0].should == {
143
+ 'a', 'DOCUMENT',
144
+ 'b', '00014438',
145
+ 'c', 'P',
146
+ 'd', 'PLAT'
147
+ }
148
+ end
149
+
150
+ end
151
+
152
+ end
153
+
154
+ context 'when given an invalid format' do
155
+
156
+ xit "should raise an exception when the format is an array of integers" do
157
+ lambda { FixedWidthParser.foreach_named( fixed_width_file, lengths_format ) { |l| } }.should(
158
+ raise_error( RuntimeError, 'Invalid format: expected a hash-like array' )
159
+ )
160
+ end
161
+
162
+ it "should raise an exception when the format is a hash" do
163
+ lambda { FixedWidthParser.foreach_named( fixed_width_file, {} ) { |l| } }.should(
164
+ raise_error( RuntimeError, 'Invalid format: expected a hash-like array' )
165
+ )
166
+ end
167
+
168
+ end
169
+
170
+ end
171
+
172
+ end
173
+
174
+ context '.parse' do
175
+
176
+ context 'when rstrip is false' do
177
+
178
+ subject { FixedWidthParser.parse( line, lengths_format ) }
179
+
180
+ it { should == ['DOCUMENT ', '00014438', 'P ', 'PLAT '] }
181
+
182
+ end
183
+
184
+ context 'when rstrip is true' do
185
+
186
+ subject { FixedWidthParser.parse( line, lengths_format, :rstrip => true ) }
187
+
188
+ it { should == ['DOCUMENT', '00014438', 'P', 'PLAT'] }
189
+
190
+ end
191
+
192
+ end
193
+
194
+ context '.parse_named' do
195
+
196
+ context 'when rstrip is false' do
197
+
198
+ subject { FixedWidthParser.parse_named( line, named_lengths_format ) }
199
+
200
+ it { should == {
201
+ 'a', 'DOCUMENT ',
202
+ 'b', '00014438',
203
+ 'c', 'P ',
204
+ 'd', 'PLAT '
205
+ }
206
+ }
207
+
208
+ end
209
+
210
+ context 'when rstrip is true' do
211
+
212
+ subject { FixedWidthParser.parse_named( line, named_lengths_format, :rstrip => true ) }
213
+
214
+ it { should == {
215
+ 'a', 'DOCUMENT',
216
+ 'b', '00014438',
217
+ 'c', 'P',
218
+ 'd', 'PLAT'
219
+ }
220
+ }
221
+
222
+ end
223
+
224
+ end
225
+
226
+ context 'calculating ranges from lengths' do
227
+
228
+ it "should return the correct ranges" do
229
+ FixedWidthParser.send( :calculate_ranges, lengths_format ).should == [(0..9), (10..17), (18..25), (26..39)]
230
+ end
231
+
232
+ end
233
+
234
+ context 'generating a regex from lengths' do
235
+
236
+ it "should return the correct regex" do
237
+ FixedWidthParser.send( :generate_regex, lengths_format ).should == /^(.{10})(.{8})(.{8})(.{14})$/
238
+ end
239
+
240
+ end
241
+
242
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'fixed_width_parser'
5
+
6
+ RSpec.configure do |config|
7
+
8
+ config.mock_with :rspec
9
+
10
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fixed_width_parser
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
+ platform: ruby
12
+ authors:
13
+ - C. Jason Harrelson
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-11-08 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: gem-dandy
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rspec
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ description: ""
50
+ email:
51
+ - jason@lookforwardenterprises.com
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ extra_rdoc_files: []
57
+
58
+ files:
59
+ - .rspec
60
+ - .rvmrc
61
+ - Gemfile
62
+ - Gemfile.lock
63
+ - Guardfile
64
+ - README.rdoc
65
+ - Rakefile
66
+ - fixed_width_parser.gemspec
67
+ - lib/fixed_width_parser.rb
68
+ - lib/fixed_width_parser/version.rb
69
+ - spec/data/test.txt
70
+ - spec/lib/fixed_width_parser_spec.rb
71
+ - spec/spec_helper.rb
72
+ has_rdoc: true
73
+ homepage: ""
74
+ licenses: []
75
+
76
+ post_install_message:
77
+ rdoc_options: []
78
+
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ hash: 3
96
+ segments:
97
+ - 0
98
+ version: "0"
99
+ requirements: []
100
+
101
+ rubyforge_project: fixed_width_parser
102
+ rubygems_version: 1.6.0
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: ""
106
+ test_files:
107
+ - spec/data/test.txt
108
+ - spec/lib/fixed_width_parser_spec.rb
109
+ - spec/spec_helper.rb