efo_nelfo 0.0.7 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Guardfile +2 -1
- data/efo_nelfo.gemspec +1 -0
- data/lib/efo_nelfo/collection.rb +44 -0
- data/lib/efo_nelfo/errors.rb +4 -2
- data/lib/efo_nelfo/has_many.rb +70 -0
- data/lib/efo_nelfo/post_head_type.rb +30 -0
- data/lib/efo_nelfo/post_type.rb +26 -23
- data/lib/efo_nelfo/property.rb +18 -1
- data/lib/efo_nelfo/reader/csv.rb +1 -1
- data/lib/efo_nelfo/v40/{order/order.rb → bh.rb} +13 -45
- data/lib/efo_nelfo/v40/bl.rb +30 -0
- data/lib/efo_nelfo/v40/bt.rb +15 -0
- data/lib/efo_nelfo/v40/va.rb +11 -0
- data/lib/efo_nelfo/v40/vh.rb +24 -0
- data/lib/efo_nelfo/v40/vl.rb +34 -0
- data/lib/efo_nelfo/v40/vx.rb +9 -0
- data/lib/efo_nelfo/version.rb +1 -1
- data/lib/efo_nelfo.rb +10 -7
- data/spec/collection_spec.rb +68 -0
- data/spec/csv_writer_spec.rb +11 -11
- data/spec/efo_nelfo_spec.rb +76 -18
- data/spec/post_type_spec.rb +63 -0
- data/spec/property_spec.rb +14 -0
- data/spec/samples/rabatt.csv +1234 -0
- data/spec/samples/varefil_eksempel.csv +10 -0
- data/spec/samples/varer.csv +75429 -0
- data/spec/samples/varer_small.csv +10 -0
- data/spec/spec_helper.rb +7 -1
- metadata +39 -8
- data/lib/efo_nelfo/array.rb +0 -25
- data/lib/efo_nelfo/attribute_assignment.rb +0 -13
- data/lib/efo_nelfo/v40/order/line.rb +0 -50
- data/lib/efo_nelfo/v40/order/text.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c4b4dce00c7c566c8cf0866f02cc7560a5bd3c4
|
4
|
+
data.tar.gz: 1e1bcc1e132c347c94d82ccc265bedc4cb8b4407
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe36c958173bbfc4ac87379b730d73c12721af0d0663f5bffdf527ac6b7aeffa2740eb78fa066764a62d60d89a23d3a933abf98f1d07f1496234fc6465a25cee
|
7
|
+
data.tar.gz: 96743647440ed7561e5b9df4670a50fa98e8e7a78c00cf9c452a25200c4f6e5880e5cf0adfd17c237d43f8a1455174a109ae4d591816817ea01270d4ab571298
|
data/.gitignore
CHANGED
data/Guardfile
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
guard 'minitest' do
|
5
5
|
watch(%r|^spec/(.*)_spec\.rb|)
|
6
|
-
watch(%r
|
6
|
+
watch(%r{^lib/(.*)\.rb}) { "spec" }
|
7
|
+
#watch(%r|^lib/(.*)([^/]+)\.rb|) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
7
8
|
watch(%r|^spec/spec_helper\.rb|) { "spec" }
|
8
9
|
end
|
data/efo_nelfo.gemspec
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module EfoNelfo
|
4
|
+
|
5
|
+
class Collection
|
6
|
+
include Enumerable
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
attr_reader :owner, :post_type
|
10
|
+
|
11
|
+
def_delegators :@list, :[], :each, :last, :size, :empty?
|
12
|
+
|
13
|
+
def initialize(owner, post_type)
|
14
|
+
@owner = owner
|
15
|
+
@post_type = post_type
|
16
|
+
@list = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def <<(obj)
|
20
|
+
obj = post_type_class.new(obj) if obj.is_a? Hash
|
21
|
+
raise EfoNelfo::InvalidPostType if obj.nil? || (obj.is_a?(EfoNelfo::PostType) && obj.post_type != post_type)
|
22
|
+
|
23
|
+
# Set the index if the post has an index property
|
24
|
+
obj.index = size + 1 if obj.has_property?(:index)
|
25
|
+
|
26
|
+
@list << obj
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_a
|
30
|
+
map(&:to_a).flatten(1)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
attr_reader :list
|
35
|
+
|
36
|
+
def post_type_class
|
37
|
+
Kernel.const_get("EfoNelfo::V#{owner.class.version_from_class}::#{post_type}")
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
data/lib/efo_nelfo/errors.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module EfoNelfo
|
2
|
-
|
3
|
-
|
2
|
+
InvalidPostType = Class.new(StandardError)
|
3
|
+
UnsupportedPostType = Class.new(StandardError)
|
4
|
+
DuplicateProperty = Class.new(StandardError)
|
5
|
+
UnknownPropertyOption = Class.new(StandardError)
|
4
6
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module EfoNelfo
|
2
|
+
|
3
|
+
module HasMany
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.send :extend, ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
def find_association(post_type)
|
10
|
+
send self.class.association(post_type) if has_association?(post_type)
|
11
|
+
end
|
12
|
+
|
13
|
+
def has_association?(post_type)
|
14
|
+
!self.class.association(post_type).nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def associations
|
18
|
+
self.class.associations
|
19
|
+
end
|
20
|
+
|
21
|
+
def add(post)
|
22
|
+
find_association(post) << post
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_a
|
26
|
+
[ super ] + associations_array
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def associations_array
|
32
|
+
if associations
|
33
|
+
associations.keys.map { |name| find_association(name).to_a }.reject(&:empty?).flatten(1)
|
34
|
+
else
|
35
|
+
[]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module ClassMethods
|
40
|
+
|
41
|
+
def has_many(name, options)
|
42
|
+
post_type = options[:post_type]
|
43
|
+
|
44
|
+
@associations ||= {}
|
45
|
+
@associations[post_type] = name
|
46
|
+
|
47
|
+
define_method name do
|
48
|
+
instance_variable_get("@#{name}") || instance_variable_set("@#{name}", EfoNelfo::Collection.new(self, post_type))
|
49
|
+
end
|
50
|
+
|
51
|
+
define_method "#{name}=" do |values|
|
52
|
+
instance_variable_set "@#{name}", EfoNelfo::Collection.new(self, post_type)
|
53
|
+
values.each { |item| instance_variable_get("@#{name}") << item } if values
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def associations
|
59
|
+
@associations
|
60
|
+
end
|
61
|
+
|
62
|
+
def association(post_type)
|
63
|
+
type = post_type.is_a?(EfoNelfo::PostType) ? post_type.post_type : post_type.to_s.upcase
|
64
|
+
@associations[type]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module EfoNelfo
|
2
|
+
module PostHeadType
|
3
|
+
attr_accessor :source
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.send :property, :post_type, alias: :PostType, limit: 2, default: base.post_type
|
7
|
+
base.send :property, :format, alias: :Format, limit: 8, default: 'EFONELFO'
|
8
|
+
base.send :property, :version, alias: :Versjon, limit: 3, default: base.version
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(post_type)
|
12
|
+
if has_association? post_type
|
13
|
+
find_association(post_type) << post_type
|
14
|
+
else
|
15
|
+
if lines.any?
|
16
|
+
lines.last.find_association(post_type) << post_type
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_csv
|
22
|
+
CSV.generate EfoNelfo::Reader::CSV::CSV_OPTIONS do |csv|
|
23
|
+
to_a.each do |row|
|
24
|
+
csv << row unless row.empty?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
data/lib/efo_nelfo/post_type.rb
CHANGED
@@ -2,48 +2,51 @@ module EfoNelfo
|
|
2
2
|
|
3
3
|
class PostType
|
4
4
|
include EfoNelfo::Property
|
5
|
-
|
6
|
-
attr_reader :post_type
|
7
|
-
|
8
|
-
@modules = []
|
5
|
+
include EfoNelfo::HasMany
|
9
6
|
|
10
7
|
class << self
|
11
|
-
def inherited(klass)
|
12
|
-
@modules << klass
|
13
|
-
end
|
14
8
|
|
15
|
-
def for(type, version
|
16
|
-
|
9
|
+
def for(type, version)
|
10
|
+
klass = "EfoNelfo::V#{version_to_namespace(version)}::#{type}"
|
11
|
+
const_get(klass) rescue nil
|
17
12
|
end
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
self::POST_TYPES.keys.include?(post_type)
|
24
|
-
end
|
14
|
+
# Converts version to module version name
|
15
|
+
# Example: version_to_namespace("4.2") # => "42"
|
16
|
+
def version_to_namespace(version)
|
17
|
+
version.gsub('.', '')
|
25
18
|
end
|
26
19
|
|
27
20
|
# Extracts version number from class namespace.
|
28
21
|
# Example: EfoNelfo::V41::Some::Class.version # => "4.1"
|
29
22
|
def version
|
30
|
-
(
|
23
|
+
(version_from_class.to_f / 10).to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def version_from_class
|
27
|
+
self.to_s.match(/::V(?<version>\d+)::/)[:version]
|
28
|
+
end
|
29
|
+
|
30
|
+
def post_type
|
31
|
+
name.split(/::/).last
|
32
|
+
end
|
33
|
+
|
34
|
+
def from(hash)
|
35
|
+
self.for(hash[:post_type], hash[:version]).new(hash)
|
31
36
|
end
|
32
37
|
|
33
38
|
end
|
34
39
|
|
35
40
|
def initialize(*args)
|
36
|
-
initialize_attributes
|
37
|
-
@post_type = self.class::POST_TYPES.keys.first
|
38
|
-
@version = self.class.version
|
41
|
+
initialize_attributes(*args)
|
39
42
|
end
|
40
43
|
|
41
|
-
|
42
|
-
|
44
|
+
def post_type
|
45
|
+
self.class.post_type
|
43
46
|
end
|
44
47
|
|
45
|
-
def
|
46
|
-
self.class
|
48
|
+
def version
|
49
|
+
self.class.version
|
47
50
|
end
|
48
51
|
|
49
52
|
end
|
data/lib/efo_nelfo/property.rb
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
module EfoNelfo
|
2
2
|
|
3
3
|
module Property
|
4
|
-
include EfoNelfo::AttributeAssignment
|
5
4
|
|
6
5
|
def self.included(base)
|
7
6
|
base.send :extend, ClassMethods
|
8
7
|
end
|
9
8
|
|
9
|
+
def initialize_attributes(*args)
|
10
|
+
if args && args.first.is_a?(Hash)
|
11
|
+
args.first.each do |attr, value|
|
12
|
+
send "#{attr}=", value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
10
17
|
def attributes
|
11
18
|
@attributes ||= initialize_default_attributes
|
12
19
|
end
|
@@ -15,6 +22,10 @@ module EfoNelfo
|
|
15
22
|
self.class.properties
|
16
23
|
end
|
17
24
|
|
25
|
+
def has_property?(property)
|
26
|
+
properties.include? property
|
27
|
+
end
|
28
|
+
|
18
29
|
def to_a
|
19
30
|
properties.keys.map { |prop| formatted_for_csv(prop) }
|
20
31
|
end
|
@@ -76,6 +87,7 @@ module EfoNelfo
|
|
76
87
|
# - alias Norwegian alias name for the attribute
|
77
88
|
#
|
78
89
|
def property(name, options={})
|
90
|
+
|
79
91
|
options = {
|
80
92
|
type: :string,
|
81
93
|
required: false,
|
@@ -83,6 +95,11 @@ module EfoNelfo
|
|
83
95
|
|
84
96
|
name = name.to_sym
|
85
97
|
|
98
|
+
# ensure all options are valid
|
99
|
+
valid_options = [:type, :required, :limit, :read_only, :alias, :default]
|
100
|
+
invalid_options = options.keys - valid_options
|
101
|
+
raise EfoNelfo::UnknownPropertyOption.new("Invalid option for #{name}: #{invalid_options.join(',')}") if invalid_options.any?
|
102
|
+
|
86
103
|
# Store property info in @properties
|
87
104
|
raise EfoNelfo::DuplicateProperty if properties.has_key?(name)
|
88
105
|
properties[name] = options
|
data/lib/efo_nelfo/reader/csv.rb
CHANGED
@@ -33,7 +33,7 @@ module EfoNelfo
|
|
33
33
|
# Read rest of the file and add them to the head
|
34
34
|
csv.each do |row|
|
35
35
|
# Find the correct posttype module for given posttype and version
|
36
|
-
klass = EfoNelfo::PostType.for row[0]
|
36
|
+
klass = EfoNelfo::PostType.for row[0], head.version
|
37
37
|
next if klass.nil?
|
38
38
|
|
39
39
|
line = initialize_object_with_properties klass, row
|
@@ -1,19 +1,9 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
module EfoNelfo
|
3
2
|
module V40
|
4
|
-
class
|
5
|
-
|
6
|
-
'BH' => 'Bestilling Hodepost',
|
7
|
-
'IH' => 'Forespørsel Hodepost'
|
8
|
-
}
|
9
|
-
|
10
|
-
attr_reader :lines
|
11
|
-
attr_accessor :source
|
3
|
+
class BH < EfoNelfo::PostType
|
4
|
+
include PostHeadType
|
12
5
|
|
13
6
|
# It's important to list the property in the same order as specified in the specs
|
14
|
-
property :post_type, alias: :PostType, limit: 2, default: 'BH'
|
15
|
-
property :format, alias: :Format, limit: 8, default: 'EFONELFO'
|
16
|
-
property :version, alias: :Versjon, limit: 3, default: version
|
17
7
|
property :seller_id, alias: :SelgersId, limit: 14
|
18
8
|
property :buyer_id, alias: :KjøpersId, limit: 14, required: true
|
19
9
|
property :order_number, alias: :BestNr, limit: 10, required: true
|
@@ -60,40 +50,18 @@ module EfoNelfo
|
|
60
50
|
property :seller_office, alias: :SPostSted, limit: 35
|
61
51
|
property :seller_country, alias: :SLandK, limit: 2
|
62
52
|
|
63
|
-
|
64
|
-
@lines = EfoNelfo::Array.new
|
65
|
-
super
|
66
|
-
end
|
53
|
+
has_many :lines, post_type: "BL"
|
67
54
|
|
68
|
-
def add(post_type)
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
def lines=(values)
|
80
|
-
@lines = EfoNelfo::Array.new
|
81
|
-
values.each do |item|
|
82
|
-
add item
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def to_a
|
87
|
-
[ super ] + lines.to_a
|
88
|
-
end
|
89
|
-
|
90
|
-
def to_csv
|
91
|
-
CSV.generate EfoNelfo::Reader::CSV::CSV_OPTIONS do |csv|
|
92
|
-
to_a.each do |row|
|
93
|
-
csv << row unless row.empty?
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
55
|
+
# def add(post_type)
|
56
|
+
# case
|
57
|
+
# when post_type.is_a?(BL)
|
58
|
+
# add_order_line(post_type)
|
59
|
+
# when post_type.is_a?(BT)
|
60
|
+
# add_text_to_order_line(post_type)
|
61
|
+
# when post_type.is_a?(Hash)
|
62
|
+
# add_order_line(EfoNelfo::V40::BL.new(post_type))
|
63
|
+
# end
|
64
|
+
# end
|
97
65
|
|
98
66
|
private
|
99
67
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module EfoNelfo
|
2
|
+
module V40
|
3
|
+
class BL < EfoNelfo::PostType
|
4
|
+
|
5
|
+
# It's important to list the property in the same order as specified in the specs
|
6
|
+
property :post_type, alias: :PostType, limit: 2, default: post_type, required: true
|
7
|
+
property :index, alias: :LinjeNr, limit: 4, type: :integer
|
8
|
+
property :order_number, alias: :BestNr, limit: 10, required: true
|
9
|
+
property :item_type, alias: :VareMrk, limit: 1, required: true, type: :integer
|
10
|
+
property :item_number, alias: :VareNr, limit: 14, required: true
|
11
|
+
property :item_name, alias: :VaBetg, limit: 30, required: true
|
12
|
+
property :item_description, alias: :VaBetg2, limit: 30
|
13
|
+
property :item_count, alias: :Ant, limit: 9, required: true, type: :integer
|
14
|
+
property :price_unit, alias: :PrisEnhet, limit: 3, required: true
|
15
|
+
property :buyer_item_number, alias: :KVareNr, limit: 25
|
16
|
+
property :delivery_date, alias: :LevDato, type: :date
|
17
|
+
property :buyer_ref, alias: :KjøpersRef, limit: 25
|
18
|
+
property :splitable, alias: :DelLev, type: :boolean, default: true
|
19
|
+
property :replacable, alias: :AltKode, type: :boolean, default: true
|
20
|
+
|
21
|
+
has_many :text, post_type: "BT"
|
22
|
+
|
23
|
+
def format_item_count
|
24
|
+
item_count ? item_count * 100 : nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module EfoNelfo
|
2
|
+
module V40
|
3
|
+
class BT < EfoNelfo::PostType
|
4
|
+
|
5
|
+
# It's important to list the property in the same order as specified in the specs
|
6
|
+
property :post_type, alias: :PostType, limit: 2, default: post_type, required: true
|
7
|
+
property :text, alias: :FriTekst, limit: 30
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
text
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module EfoNelfo
|
2
|
+
module V40
|
3
|
+
class VA < PostType
|
4
|
+
property :post_type, alias: :PostType, limit: 2, required: true, default: post_type
|
5
|
+
property :product_type, alias: :VareMrk, limit: 1, type: :integer, required: true
|
6
|
+
property :product_number, alias: :VareNr, limit: 14, required: true
|
7
|
+
property :type, alias: :VaType, limit: 1, required: true
|
8
|
+
property :sales_package, alias: :SalgsPakning, limit: 9, type: :integer
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module EfoNelfo
|
2
|
+
module V40
|
3
|
+
class VH < EfoNelfo::PostType
|
4
|
+
include PostHeadType
|
5
|
+
|
6
|
+
property :seller_id, alias: :SelgersId, limit: 14, required: true
|
7
|
+
property :buyer_id, alias: :KjøpersId, limit: 14
|
8
|
+
property :customer_id, alias: :KundeNr, limit: 10
|
9
|
+
property :from_date, alias: :FraDato, limit: 8, type: :date
|
10
|
+
property :to_date, alias: :TilDato, limit: 8, type: :date
|
11
|
+
property :currency, alias: :Valuta, limit: 3, required: true
|
12
|
+
property :contract_id, alias: :AvtaleId, limit: 10
|
13
|
+
property :seller_name, alias: :SFirmaNavn, limit: 35, required: true
|
14
|
+
property :seller_address1, alias: :SAdr1, limit: 35
|
15
|
+
property :seller_address2, alias: :SAdr2, limit: 35
|
16
|
+
property :seller_zip, alias: :SPostNr, limit: 9, required: true
|
17
|
+
property :seller_office, alias: :SPostSted, limit: 35, required: true
|
18
|
+
property :seller_country, alias: :SLandK, limit: 2
|
19
|
+
property :price_type, alias: :PrisType, limit: 1
|
20
|
+
|
21
|
+
has_many :lines, post_type: 'VL'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module EfoNelfo
|
2
|
+
module V40
|
3
|
+
class VL < EfoNelfo::PostType
|
4
|
+
property :post_type, alias: :PostType, limit: 2, default: post_type, required: true
|
5
|
+
property :product_type, alias: :VareMrk, limit: 1, type: :integer, required: true
|
6
|
+
property :product_number, alias: :VareNr, limit: 14, required: true
|
7
|
+
property :name, alias: :VaBetg, limit: 30, required: true
|
8
|
+
property :description, alias: :VaBetg2, limit: 30
|
9
|
+
property :unit, alias: :MåleEnhet, limit: 1, type: :integer, required: true
|
10
|
+
property :price_unit, alias: :PrisEnhet, limit: 3, required: true
|
11
|
+
property :price_unit_desc, alias: :PrisEnhetTxt, limit: 8
|
12
|
+
property :price, alias: :Pris, limit: 10, type: :integer, required: true
|
13
|
+
property :amount, alias: :Mengde, limit: 9, type: :integer, required: true
|
14
|
+
property :price_date, alias: :PrisDato, limit: 8, type: :date, required: true
|
15
|
+
property :status, alias: :Status, limit: 1, type: :integer, required: true
|
16
|
+
property :block_number, alias: :BlokkNummer, limit: 6, type: :integer
|
17
|
+
property :discount_group, alias: :RabattGruppe, limit: 14
|
18
|
+
property :fabrication, alias: :Fabrikat, limit: 10
|
19
|
+
property :type, alias: :Type, limit: 10
|
20
|
+
property :stocked, alias: :Lagerført, type: :boolean
|
21
|
+
property :sales_package, alias: :SalgsPakning, limit: 9, type: :integer
|
22
|
+
property :discount, alias: :Rabatt, limit: 4, type: :integer
|
23
|
+
property :price_type, alias: :Pristype, limit: 1
|
24
|
+
|
25
|
+
has_many :info, post_type: "VX"
|
26
|
+
has_many :alternatives, post_type: "VA"
|
27
|
+
|
28
|
+
def nrf_id
|
29
|
+
product_type == 4 ? product_number : nil
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module EfoNelfo
|
2
|
+
module V40
|
3
|
+
class VX < EfoNelfo::PostType
|
4
|
+
property :post_type, alias: :PostType, limit: 2, default: post_type
|
5
|
+
property :field, alias: :FeltId, limit: 10, required: true
|
6
|
+
property :value, alias: :Verdi, limit: 70, required: true
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
data/lib/efo_nelfo/version.rb
CHANGED
data/lib/efo_nelfo.rb
CHANGED
@@ -3,15 +3,20 @@
|
|
3
3
|
# Common stuff
|
4
4
|
require 'efo_nelfo/version'
|
5
5
|
require 'efo_nelfo/errors'
|
6
|
-
require 'efo_nelfo/array'
|
7
|
-
require 'efo_nelfo/attribute_assignment'
|
8
6
|
require 'efo_nelfo/property'
|
7
|
+
require 'efo_nelfo/collection'
|
8
|
+
require 'efo_nelfo/has_many'
|
9
9
|
require 'efo_nelfo/post_type'
|
10
|
+
require 'efo_nelfo/post_head_type'
|
10
11
|
|
11
12
|
# EfoNelfo v4.0 modules
|
12
|
-
require 'efo_nelfo/v40/
|
13
|
-
require 'efo_nelfo/v40/
|
14
|
-
require 'efo_nelfo/v40/
|
13
|
+
require 'efo_nelfo/v40/bh'
|
14
|
+
require 'efo_nelfo/v40/bl'
|
15
|
+
require 'efo_nelfo/v40/bt'
|
16
|
+
require 'efo_nelfo/v40/vh'
|
17
|
+
require 'efo_nelfo/v40/vl'
|
18
|
+
require 'efo_nelfo/v40/vx'
|
19
|
+
require 'efo_nelfo/v40/va'
|
15
20
|
|
16
21
|
# Reader modules (import)
|
17
22
|
require 'efo_nelfo/reader/csv'
|
@@ -30,6 +35,4 @@ module EfoNelfo
|
|
30
35
|
|
31
36
|
end
|
32
37
|
|
33
|
-
|
34
38
|
end
|
35
|
-
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe EfoNelfo::Collection do
|
4
|
+
Owner = Class.new do
|
5
|
+
def self.version_from_class
|
6
|
+
'21'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:owner) { Owner.new }
|
11
|
+
let(:array) { EfoNelfo::Collection.new owner, "BT" }
|
12
|
+
|
13
|
+
it "accepts owner and post_type arguments" do
|
14
|
+
array.owner.must_equal owner
|
15
|
+
array.post_type.must_equal "BT"
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "<<" do
|
19
|
+
module EfoNelfo
|
20
|
+
module V21
|
21
|
+
class MyType < EfoNelfo::PostType
|
22
|
+
property :whatever
|
23
|
+
property :version
|
24
|
+
end
|
25
|
+
|
26
|
+
class BT < EfoNelfo::PostType
|
27
|
+
property :post_type
|
28
|
+
property :whatever
|
29
|
+
property :version
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "passing a hash" do
|
35
|
+
let(:hash) {
|
36
|
+
{ post_type: "BT", version: "2.1", whatever: 'blah' }
|
37
|
+
}
|
38
|
+
|
39
|
+
it "accepts a valid hash" do
|
40
|
+
array << hash
|
41
|
+
array.size.must_equal 1
|
42
|
+
end
|
43
|
+
|
44
|
+
it "converts the hash into a post type" do
|
45
|
+
array << hash
|
46
|
+
array[0].must_be_instance_of EfoNelfo::V21::BT
|
47
|
+
array[0].whatever.must_equal 'blah'
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "passing a PostType object" do
|
53
|
+
let(:obj) { EfoNelfo::V21::MyType.new }
|
54
|
+
|
55
|
+
it "accepts a valid posttype" do
|
56
|
+
def obj.post_type; 'BT'; end
|
57
|
+
array << obj
|
58
|
+
array.must_include obj
|
59
|
+
end
|
60
|
+
|
61
|
+
it "raises an error if the object being added is of wrong type" do
|
62
|
+
def obj.post_type; 'BH'; end
|
63
|
+
lambda { array << obj }.must_raise(EfoNelfo::InvalidPostType)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|