ascii_data 0.0.6
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/.autotest +1 -0
- data/.gitignore +5 -0
- data/Gemfile +8 -0
- data/Rakefile +2 -0
- data/ascii_data.gemspec +21 -0
- data/lib/ascii_data.rb +3 -0
- data/lib/ascii_data/version.rb +3 -0
- data/lib/ascii_data_row.rb +84 -0
- data/spec/.rspec +1 -0
- data/spec/ascii_data_row_spec.rb +90 -0
- data/spec/spec_helper.rb +2 -0
- metadata +56 -0
data/.autotest
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'autotest/bundler'
|
data/Gemfile
ADDED
data/Rakefile
ADDED
data/ascii_data.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "ascii_data/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "ascii_data"
|
7
|
+
s.version = AsciiData::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["David Santoro"]
|
10
|
+
s.email = ["soulnafein@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Little library for importing ascii data files}
|
13
|
+
s.description = %q{Just browse the specs and check it out}
|
14
|
+
|
15
|
+
s.rubyforge_project = "ascii_data"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
data/lib/ascii_data.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'iconv'
|
3
|
+
|
4
|
+
class AsciiDataRow
|
5
|
+
class << self
|
6
|
+
attr_reader :fields_definitions
|
7
|
+
|
8
|
+
def fields_definitions
|
9
|
+
@fields_definitions ||= {}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.field(name, range, type, options={})
|
14
|
+
options[:format] ||= '%d/%m/%Y'
|
15
|
+
fields_definitions[name] = FieldDefinition.new(type, range, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.create_from(ascii_row)
|
19
|
+
self.new(ascii_row)
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(ascii_row)
|
23
|
+
@fields = {}
|
24
|
+
@ascii_row = remove_invalid_utf8_bytes(ascii_row)
|
25
|
+
self.class.fields_definitions.each_pair do |name, definition|
|
26
|
+
@fields[name] = get_value_for_field_definition(definition)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def fields
|
31
|
+
@fields
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def remove_invalid_utf8_bytes(a_string)
|
36
|
+
@ic ||= Iconv.new('UTF-8//IGNORE', 'UTF-8')
|
37
|
+
@ic.iconv(a_string)
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_value_for_field_definition(definition)
|
41
|
+
text_value = @ascii_row.slice(definition.range.min, definition.range.max).strip
|
42
|
+
|
43
|
+
case definition.type
|
44
|
+
when :string
|
45
|
+
text_value
|
46
|
+
when :int
|
47
|
+
text_value.empty? ? nil : text_value.to_i
|
48
|
+
when :float
|
49
|
+
text_value.empty? ? nil : text_value.to_f
|
50
|
+
when :date
|
51
|
+
text_value.empty? ? nil : parse_date(text_value, definition.options[:format])
|
52
|
+
when :bool
|
53
|
+
text_value == '1'
|
54
|
+
else
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def parse_date(text_value, format)
|
60
|
+
if format == "%Y/%m/%d"
|
61
|
+
year = text_value[0..3].to_i
|
62
|
+
month = text_value[5..6].to_i
|
63
|
+
day = text_value[8..9].to_i
|
64
|
+
Time.utc(year, month, day)
|
65
|
+
elsif format == "%d/%m/%Y"
|
66
|
+
day = text_value[0..1].to_i
|
67
|
+
month = text_value[3..4].to_i
|
68
|
+
year = text_value[6..9].to_i
|
69
|
+
Time.utc(year, month, day)
|
70
|
+
else
|
71
|
+
Time.strptime(text_value, format)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class FieldDefinition
|
77
|
+
attr_reader :type, :range, :options
|
78
|
+
|
79
|
+
def initialize(type, range, options)
|
80
|
+
@type = type
|
81
|
+
@range = Range.new(range.min-1, range.max-1)
|
82
|
+
@options = options
|
83
|
+
end
|
84
|
+
end
|
data/spec/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe AsciiDataRow do
|
4
|
+
context "when parsing a ascii data row" do
|
5
|
+
# 1-5 5 CLHB CAP Vehicle Identification Number
|
6
|
+
# 6-15 10 CLHB Technical Data Date (dd/mm/yyyy)
|
7
|
+
# 16-18 3 CL B Insurance Group 1
|
8
|
+
# 19-21 3 B Insurance Group 2
|
9
|
+
# 22-31 10 CLHB Kerb Weight (kg) (Dry Weight for BIKES)
|
10
|
+
# 32-41 10 CLHB Length (mm)
|
11
|
+
# 42-53 10 CLHB Width (mm)
|
12
|
+
ASCII_LINE = %q{4404201/01/2010 13 1035 3657 1627.23}
|
13
|
+
|
14
|
+
it "should load strings in a certain ranges" do
|
15
|
+
class RowA < AsciiDataRow
|
16
|
+
field :vehicle_id_number, 1..5, :string
|
17
|
+
end
|
18
|
+
|
19
|
+
row = RowA.create_from(ASCII_LINE)
|
20
|
+
|
21
|
+
row.fields[:vehicle_id_number].should == "44042"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should trim spaces at the beginning and the end of string values" do
|
25
|
+
class RowB < AsciiDataRow
|
26
|
+
field :kerb_weight_as_text, 22..31, :string
|
27
|
+
end
|
28
|
+
|
29
|
+
row = RowB.create_from(ASCII_LINE)
|
30
|
+
|
31
|
+
row.fields[:kerb_weight_as_text].should == "1035"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should parse integers correctly" do
|
35
|
+
class RowC < AsciiDataRow
|
36
|
+
field :insurance_group_1, 16..18, :int
|
37
|
+
field :insurance_group_2, 19..21, :int
|
38
|
+
field :kerb_weight, 22..31, :int
|
39
|
+
end
|
40
|
+
|
41
|
+
row = RowC.create_from(ASCII_LINE)
|
42
|
+
|
43
|
+
row.fields[:insurance_group_1].should == 13
|
44
|
+
row.fields[:insurance_group_2].should be_nil
|
45
|
+
row.fields[:kerb_weight].should == 1035
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should parse floats correctly" do
|
49
|
+
class RowD < AsciiDataRow
|
50
|
+
field :width, 42..54, :float
|
51
|
+
end
|
52
|
+
|
53
|
+
row = RowD.create_from(ASCII_LINE)
|
54
|
+
|
55
|
+
row.fields[:width].should == 1627.23
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should parse bools correctly" do
|
59
|
+
class RowE < AsciiDataRow
|
60
|
+
field :flag_1, 3..3, :bool
|
61
|
+
field :flag_2, 5..5, :bool
|
62
|
+
end
|
63
|
+
|
64
|
+
row = RowE.create_from(" 1 0")
|
65
|
+
|
66
|
+
row.fields[:flag_1].should be_true
|
67
|
+
row.fields[:flag_2].should be_false
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should parse dates correctly" do
|
71
|
+
class RowF < AsciiDataRow
|
72
|
+
field :date_1, 3..12, :date
|
73
|
+
end
|
74
|
+
|
75
|
+
row = RowF.create_from(" 12/03/2012")
|
76
|
+
|
77
|
+
row.fields[:date_1].should == Time.utc(2012, 3, 12)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should accept different date formats" do
|
81
|
+
class RowF < AsciiDataRow
|
82
|
+
field :date_1, 3..12, :date, :format => '%Y/%m/%d'
|
83
|
+
end
|
84
|
+
|
85
|
+
row = RowF.create_from(" 2012/03/12")
|
86
|
+
|
87
|
+
row.fields[:date_1].should == Time.utc(2012, 3, 12)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ascii_data
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- David Santoro
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-10-06 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Just browse the specs and check it out
|
15
|
+
email:
|
16
|
+
- soulnafein@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .autotest
|
22
|
+
- .gitignore
|
23
|
+
- Gemfile
|
24
|
+
- Rakefile
|
25
|
+
- ascii_data.gemspec
|
26
|
+
- lib/ascii_data.rb
|
27
|
+
- lib/ascii_data/version.rb
|
28
|
+
- lib/ascii_data_row.rb
|
29
|
+
- spec/.rspec
|
30
|
+
- spec/ascii_data_row_spec.rb
|
31
|
+
- spec/spec_helper.rb
|
32
|
+
homepage: ''
|
33
|
+
licenses: []
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
requirements: []
|
51
|
+
rubyforge_project: ascii_data
|
52
|
+
rubygems_version: 1.8.10
|
53
|
+
signing_key:
|
54
|
+
specification_version: 3
|
55
|
+
summary: Little library for importing ascii data files
|
56
|
+
test_files: []
|