efo_nelfo 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/Guardfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +46 -0
- data/Rakefile +8 -0
- data/efo_nelfo.gemspec +27 -0
- data/lib/efo_nelfo/array.rb +10 -0
- data/lib/efo_nelfo/attribute_assignment.rb +13 -0
- data/lib/efo_nelfo/errors.rb +4 -0
- data/lib/efo_nelfo/foo.rb +26 -0
- data/lib/efo_nelfo/post_type.rb +51 -0
- data/lib/efo_nelfo/property.rb +132 -0
- data/lib/efo_nelfo/reader/csv.rb +67 -0
- data/lib/efo_nelfo/v40/order/line.rb +38 -0
- data/lib/efo_nelfo/v40/order/order.rb +102 -0
- data/lib/efo_nelfo/v40/order/text.rb +22 -0
- data/lib/efo_nelfo/version.rb +3 -0
- data/lib/efo_nelfo.rb +35 -0
- data/spec/csv_writer_spec.rb +51 -0
- data/spec/efo_nelfo_spec.rb +114 -0
- data/spec/property_spec.rb +125 -0
- data/spec/samples/B028579.594.csv +2 -0
- data/spec/samples/B028579.595.csv +4 -0
- data/spec/samples/B028579.596.csv +9 -0
- data/spec/samples/B028579.597.csv +17 -0
- data/spec/samples/B123.V3.csv +2 -0
- data/spec/samples/B650517.030.csv +4 -0
- data/spec/samples/B650517.031.csv +2 -0
- data/spec/samples/B650517.032.csv +3 -0
- data/spec/samples/V4_varefil.csv +3139 -0
- data/spec/spec_helper.rb +6 -0
- metadata +173 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe EfoNelfo::V40::Order do
|
5
|
+
let(:order) { EfoNelfo::V40::Order.new buyer_id: '123', customer_id: '456' }
|
6
|
+
let(:csv) { order.to_csv }
|
7
|
+
|
8
|
+
describe "to_a" do
|
9
|
+
|
10
|
+
it "returns an array" do
|
11
|
+
order.to_a.size.must_equal 1
|
12
|
+
end
|
13
|
+
|
14
|
+
it "includes the lines" do
|
15
|
+
order.add EfoNelfo::V40::Order::Line.new
|
16
|
+
order.add EfoNelfo::V40::Order::Line.new
|
17
|
+
order.to_a.size.must_equal 3
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "to_csv" do
|
23
|
+
before do
|
24
|
+
order.add EfoNelfo::V40::Order::Line.new(order_number: 'foo', item_name: 'Ware')
|
25
|
+
order.add EfoNelfo::V40::Order::Text.new text: 'haha'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "includes standard fields" do
|
29
|
+
csv.must_match /;EFONELFO;/
|
30
|
+
csv.must_match /;4.0;/
|
31
|
+
csv.must_match /;123;/
|
32
|
+
end
|
33
|
+
|
34
|
+
it "can be parsed" do
|
35
|
+
o = EfoNelfo.parse(csv)
|
36
|
+
o.must_be_instance_of EfoNelfo::V40::Order
|
37
|
+
o.lines.first.text.must_be_instance_of EfoNelfo::V40::Order::Text
|
38
|
+
end
|
39
|
+
|
40
|
+
it "adds order lines" do
|
41
|
+
order.add EfoNelfo::V40::Order::Line.new(order_number: 'foo', item_name: 'Ware')
|
42
|
+
csv.must_match /Ware/
|
43
|
+
end
|
44
|
+
|
45
|
+
it "adds text to order line" do
|
46
|
+
csv.must_match /haha/
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
# helper method that returns full path to csv files
|
5
|
+
def csv(filename)
|
6
|
+
File.expand_path("../samples/#{filename}", __FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe EfoNelfo do
|
10
|
+
|
11
|
+
describe "properties" do
|
12
|
+
it "is accessible as alias" do
|
13
|
+
order = EfoNelfo::V40::Order.new
|
14
|
+
order.buyer_id = "123"
|
15
|
+
order.KjøpersId.must_equal "123"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "can update the variable using the alias" do
|
19
|
+
order = EfoNelfo::V40::Order.new
|
20
|
+
order.KjøpersId = "foo"
|
21
|
+
order.buyer_id.must_equal "foo"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has custom setters" do
|
25
|
+
EfoNelfo::V40::Order.new(delivery_date: "20110402").delivery_date.must_be_kind_of Date
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".parse" do
|
31
|
+
|
32
|
+
it "parses CSV and does the same as .load" do
|
33
|
+
filename = csv('B650517.032.csv')
|
34
|
+
parsed = EfoNelfo.parse File.read(filename)
|
35
|
+
loaded = EfoNelfo.load filename
|
36
|
+
parsed.source.must_equal loaded.source
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
describe ".load" do
|
42
|
+
|
43
|
+
describe "when passing in invalid file" do
|
44
|
+
it "raises an exception" do
|
45
|
+
lambda { EfoNelfo.load 'foo' }.must_raise Errno::ENOENT
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "passing a Order file" do
|
50
|
+
|
51
|
+
it "uses the correct version" do
|
52
|
+
lambda { EfoNelfo.load(csv('B123.v3.csv')) }.must_raise EfoNelfo::UnsupportedPostType
|
53
|
+
end
|
54
|
+
|
55
|
+
it "parses the file and returns an Order" do
|
56
|
+
EfoNelfo.load(csv('B650517.032.csv')).must_be_instance_of EfoNelfo::V40::Order
|
57
|
+
end
|
58
|
+
|
59
|
+
it "the order contains order information" do
|
60
|
+
order = EfoNelfo.load(csv('B650517.032.csv'))
|
61
|
+
order.post_type.must_equal 'BH'
|
62
|
+
order.post_type_human.must_equal 'Bestilling Hodepost'
|
63
|
+
order.format.must_equal 'EFONELFO'
|
64
|
+
order.version.must_equal '4.0'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "the order contains orderlines" do
|
68
|
+
order = EfoNelfo.load(csv('B650517.032.csv'))
|
69
|
+
|
70
|
+
line = order.lines.first
|
71
|
+
line.must_be_instance_of EfoNelfo::V40::Order::Line
|
72
|
+
|
73
|
+
line.post_type.must_equal 'BL'
|
74
|
+
line.post_type_human.must_equal 'Bestilling vareLinjepost'
|
75
|
+
|
76
|
+
line.index.must_equal 1
|
77
|
+
line.order_number.must_equal '1465'
|
78
|
+
line.item_count.must_equal 200
|
79
|
+
line.price_unit.must_equal "EA"
|
80
|
+
line.buyer_item_number.must_be_nil
|
81
|
+
line.delivery_date.must_equal Date.new(2010, 6, 1)
|
82
|
+
line.buyer_ref.must_be_nil
|
83
|
+
line.splitable.must_equal true
|
84
|
+
line.replacable.must_equal true
|
85
|
+
|
86
|
+
line.item_type.must_equal 1
|
87
|
+
line.item_number.must_equal '8000502'
|
88
|
+
line.item_name.must_equal '200L OSO STD BEREDER SUPER S'
|
89
|
+
line.item_description.must_be_nil
|
90
|
+
end
|
91
|
+
|
92
|
+
it "adds text to orderline" do
|
93
|
+
order = EfoNelfo.load(csv('B650517.032.csv'))
|
94
|
+
line = order.lines.first
|
95
|
+
line.text.to_s.must_equal "Her er litt fritekst"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "stores the contents file in the Order object" do
|
99
|
+
filename = csv('B650517.032.csv')
|
100
|
+
order = EfoNelfo.load(filename)
|
101
|
+
order.source.must_equal File.read(filename)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# Loads all files in the samples directory
|
106
|
+
%w(B028579.594.csv B028579.596.csv B650517.031.csv B028579.595.csv B028579.597.csv B650517.030.csv B650517.032.csv).each do |file|
|
107
|
+
it "can load #{file}" do
|
108
|
+
EfoNelfo.load(csv(file)).must_be_instance_of EfoNelfo::V40::Order
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe EfoNelfo::Property do
|
5
|
+
|
6
|
+
class Foo
|
7
|
+
include EfoNelfo::Property
|
8
|
+
property :foo, alias: "Føbar", limit: 3, default: 'I am foo'
|
9
|
+
property :bar
|
10
|
+
property :date, type: :date
|
11
|
+
property :number, type: :integer
|
12
|
+
property :doable, type: :boolean, default: false
|
13
|
+
property :immutable, read_only: true, default: 'NO'
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:obj) { Foo.new }
|
17
|
+
|
18
|
+
it "raises an error if trying to add duplicate property" do
|
19
|
+
lambda {
|
20
|
+
class Bar
|
21
|
+
include EfoNelfo::Property
|
22
|
+
property :foo
|
23
|
+
property :foo
|
24
|
+
end
|
25
|
+
}.must_raise EfoNelfo::DuplicateProperty
|
26
|
+
end
|
27
|
+
|
28
|
+
it "adds a getter and setter for foo" do
|
29
|
+
obj.foo = 'Test'
|
30
|
+
obj.foo.must_equal 'Test'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "adds an alias getter and setter for foo" do
|
34
|
+
obj.foo = 'Test'
|
35
|
+
obj.Føbar.must_equal 'Test'
|
36
|
+
obj.Føbar = 'Hacked'
|
37
|
+
obj.Føbar.must_equal 'Hacked'
|
38
|
+
obj.foo.must_equal 'Hacked'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "assigns default values" do
|
42
|
+
obj.bar.must_be_nil
|
43
|
+
obj.foo.must_equal 'I am foo'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "can be assigned nil values" do
|
47
|
+
obj.number = nil
|
48
|
+
obj.number.must_be_nil
|
49
|
+
end
|
50
|
+
|
51
|
+
it "readonly attributes cannot be changed" do
|
52
|
+
lambda { obj.immutable = 'test' }.must_raise NoMethodError
|
53
|
+
obj.immutable.must_equal 'NO'
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "property types" do
|
57
|
+
describe ":date" do
|
58
|
+
it "converts strings to dates" do
|
59
|
+
obj.date = "20100504"
|
60
|
+
obj.date.must_be_kind_of Date
|
61
|
+
end
|
62
|
+
|
63
|
+
it "accepts a Date" do
|
64
|
+
obj.date = Date.new 2010, 5, 4
|
65
|
+
obj.date.must_be_kind_of Date
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
it "handles :integer" do
|
71
|
+
obj.number = "2"
|
72
|
+
obj.number.must_equal 2
|
73
|
+
end
|
74
|
+
|
75
|
+
describe ":boolean" do
|
76
|
+
it "returns true when assigning blank string" do
|
77
|
+
obj.doable = ''
|
78
|
+
obj.doable?.must_equal true
|
79
|
+
end
|
80
|
+
|
81
|
+
it "returns true when assigning nil" do
|
82
|
+
obj.doable = nil
|
83
|
+
obj.doable?.must_equal true
|
84
|
+
end
|
85
|
+
|
86
|
+
it "returns true when assigning 'J'" do
|
87
|
+
obj.doable = 'J'
|
88
|
+
obj.doable?.must_equal true
|
89
|
+
end
|
90
|
+
|
91
|
+
it "returns false" do
|
92
|
+
obj.doable = false
|
93
|
+
obj.doable?.must_equal false
|
94
|
+
|
95
|
+
obj.doable = 'N'
|
96
|
+
obj.doable?.must_equal false
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
describe ".properties" do
|
105
|
+
let(:props) { Foo.properties }
|
106
|
+
|
107
|
+
it "includes the properties" do
|
108
|
+
props[:foo].must_be_kind_of Hash
|
109
|
+
end
|
110
|
+
|
111
|
+
it "includes the property options" do
|
112
|
+
props[:foo][:limit].must_equal 3
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#to_a" do
|
117
|
+
it "returns array of all attributes in correct order" do
|
118
|
+
obj.date = Date.new 2012, 5, 30
|
119
|
+
obj.number = 3
|
120
|
+
obj.doable = true
|
121
|
+
obj.to_a.must_equal ["I am foo", nil, "20120530", 3, "J", "NO"]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
@@ -0,0 +1,4 @@
|
|
1
|
+
BH;EFONELFO;4.0;;NO950349875MVA;2113;28579;;;;;;;;;;;;2113;;;;20100615;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
BL;1;2113;1;2215316;75 x 2,6 x 3000mm sort PP r�r;;3000;MTR;;20100615;;;
|
3
|
+
BL;2;2113;1;5002202;12 x 1.0mm kobberr�r f/kap.lod;;3000;MTR;;20100615;;;
|
4
|
+
BL;3;2113;1;5002203;15 x 1.0mm kobberr�r f/kap.lod;;3000;MTR;;20100615;;;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
BH;EFONELFO;4.0;;NO950349875MVA;2116;28579;;;;;;;;;;LAGER;;2116/LAGER;;;;20100617;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
BL;1;2116;1;5030026;15 mm 1/1 bend m/1 muffe 5001A;;5000;EA;;20100617;;;
|
3
|
+
BL;2;2116;1;5030213;12 mm 1/1 bend m/2 muffer;;5000;EA;;20100617;;;
|
4
|
+
BL;3;2116;1;5030216;15 mm 1/1 bend m/2 muffer;;5000;EA;;20100617;;;
|
5
|
+
BL;4;2116;1;5030219;18 mm 1/1 bend m/2 muffer;;2000;EA;;20100617;;;
|
6
|
+
BL;5;2116;1;5034253;22 x 18 mm overg.nipl. 5243;;1000;EA;;20100617;;;
|
7
|
+
BL;6;2116;1;4516183;FALU SNAP ENK 10-16 MM HVIT;;5000;EA;;20100617;;;
|
8
|
+
BL;7;2116;1;4516273;FALU SNAP ENK 18-22 MM HVIT;;1000;EA;;20100617;;;
|
9
|
+
BL;8;2116;1;4516271;FALU SNAP DOB 18-22 MM 40 CC;;1000;EA;;20100617;;;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
BH;EFONELFO;4.0;;NO950349875MVA;2124;28579;;;;;;;;;;;;2124;;;;20100621;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
BL;1;2124;1;2215334;110 mm x 45� sort PP bend;;3000;EA;;20100621;;;
|
3
|
+
BL;2;2124;1;2215338;110 mm x 88� sort PP bend;;3000;EA;;20100621;;;
|
4
|
+
BL;3;2124;1;2215337;75 mm x 88� sort PP bend;;3000;EA;;20100621;;;
|
5
|
+
BL;4;2124;1;2215328;75 mm x 15� sort PP bend;;3000;EA;;20100621;;;
|
6
|
+
BL;5;2124;1;2215331;75 mm x 30� sort PP bend;;3000;EA;;20100621;;;
|
7
|
+
BL;6;2124;1;2215333;75 mm x 45� sort PP bend;;3000;EA;;20100621;;;
|
8
|
+
BL;7;2124;1;2215324;75 mm sort PP dobbeltmuffe;;3000;EA;;20100621;;;
|
9
|
+
BL;8;2124;1;2215325;110 mm sort PP dobbeltmuffe;;3000;EA;;20100621;;;
|
10
|
+
BL;9;2124;1;2215326;75 mm sort PP l�pemuffe Wafix;;3000;EA;;20100621;;;
|
11
|
+
BL;10;2124;1;2214523;32 mm x 15' PP-HT bend hvit;;3000;EA;;20100621;;;
|
12
|
+
BL;11;2124;1;2214527;32 mm x 30' PP-HT bend hvit;;3000;EA;;20100621;;;
|
13
|
+
BL;12;2124;1;2214534;32 mm x 45' PP-HT bend hvit;;3000;EA;;20100621;;;
|
14
|
+
BL;13;2124;1;2214512;32 mm PP-HT l�pemuffe hvit;;3000;EA;;20100621;;;
|
15
|
+
BL;14;2124;1;2214502;32 mm PP-HT dobbelmuffe hvit;;3000;EA;;20100621;;;
|
16
|
+
BL;15;2124;1;2214553;32 x 32 mm x 45' PP-HT gren;;1000;EA;;20100621;;;
|
17
|
+
BL;16;2124;1;5110093;15x1/2" Q&E veggboks M6 enkel;;3000;EA;;20100621;;;
|
@@ -0,0 +1,4 @@
|
|
1
|
+
BH;EFONELFO;4.0;;NO986692002MVA;1464;650517;;;5000;;5000;;;;;lager;;1464/5000/lager;;;;20100601;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
BL;1;1464;1;5118157;25 MM ROTH SKAPGJENNOMF�RING;;2000;EA;;20100601;;;
|
3
|
+
BL;2;1464;1;5118207;ROTH ENKEL KLAMMER 25MM;;5000;EA;;20100601;;;
|
4
|
+
BL;3;1464;1;5118214;ROTH KLAMMER DOBBEL 25 MM;;5000;EA;;20100601;;;
|