openils-mapper 0.8.2 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/edi/edi2json.rb +46 -19
- data/lib/edi/mapper.rb +61 -20
- data/lib/openils/mapper.rb +1 -1
- data/test/map_spec.rb +5 -3
- data/test/openils_map_spec.rb +3 -2
- metadata +2 -2
data/lib/edi/edi2json.rb
CHANGED
@@ -9,22 +9,39 @@ class Collection
|
|
9
9
|
result = {}
|
10
10
|
|
11
11
|
self.each { |child|
|
12
|
+
if self[child.name].length > 1 and result[child.name].nil?
|
13
|
+
result[child.name] = []
|
14
|
+
end
|
12
15
|
if child.is_a?(Collection)
|
16
|
+
# Data elements first
|
13
17
|
hash = child.to_hash
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
result[self.sg_name] = segments
|
18
|
+
unless hash.empty?
|
19
|
+
if result[child.name].is_a?(Array)
|
20
|
+
result[child.name] << hash
|
21
|
+
else
|
22
|
+
result[child.name] = hash
|
23
|
+
end
|
21
24
|
end
|
22
25
|
else
|
23
26
|
unless child.value.nil?
|
24
|
-
result[child.name]
|
27
|
+
if result[child.name].is_a?(Array)
|
28
|
+
result[child.name] << child.value
|
29
|
+
else
|
30
|
+
result[child.name] = child.value
|
31
|
+
end
|
25
32
|
end
|
26
33
|
end
|
27
34
|
}
|
35
|
+
|
36
|
+
# Segment groups last
|
37
|
+
if self.respond_to?(:children) and (self.children.empty? == false)
|
38
|
+
segments = []
|
39
|
+
self.children.each { |segment|
|
40
|
+
segments << [segment.name, segment.to_hash]
|
41
|
+
}
|
42
|
+
result[self.sg_name] = segments
|
43
|
+
end
|
44
|
+
|
28
45
|
result
|
29
46
|
end
|
30
47
|
|
@@ -40,14 +57,18 @@ class Interchange
|
|
40
57
|
|
41
58
|
messages = []
|
42
59
|
self.each { |message|
|
43
|
-
messages <<
|
60
|
+
messages << {message.name => message.to_hash}
|
44
61
|
}
|
45
62
|
|
46
63
|
{
|
47
|
-
'UNA'
|
48
|
-
'
|
49
|
-
'
|
50
|
-
'
|
64
|
+
'UNA' => self.una.to_hash,
|
65
|
+
'sender' => self.header.cS002.d0004,
|
66
|
+
'sender_qual' => self.header.cS002.d0007,
|
67
|
+
'recipient' => self.header.cS003.d0010,
|
68
|
+
'recipient_qual' => self.header.cS003.d0007,
|
69
|
+
'header' => [self.header.name, self.header.to_hash],
|
70
|
+
'body' => messages,
|
71
|
+
'trailer' => [self.trailer.name, self.trailer.to_hash]
|
51
72
|
}
|
52
73
|
end
|
53
74
|
|
@@ -57,20 +78,26 @@ class Message
|
|
57
78
|
|
58
79
|
def to_hash
|
59
80
|
segments = []
|
60
|
-
|
81
|
+
segments << [self.header.name, self.header.to_hash]
|
61
82
|
self.find_all { |segment|
|
62
83
|
segment.level < 2
|
63
84
|
}.each { |segment|
|
64
85
|
segments << [segment.name, segment.to_hash]
|
65
86
|
}
|
66
87
|
segments << [self.trailer.name, self.trailer.to_hash]
|
67
|
-
|
68
|
-
'header' => [self.header.name, self.header.to_hash],
|
69
|
-
'body' => segments,
|
70
|
-
'trailer' => [self.trailer.name, self.trailer.to_hash]
|
71
|
-
}
|
88
|
+
segments
|
72
89
|
end
|
73
90
|
|
74
91
|
end
|
75
92
|
|
93
|
+
class E::UNA
|
94
|
+
def to_hash
|
95
|
+
result = {}
|
96
|
+
[:ce_sep,:de_sep,:decimal_sign,:esc_char,:rep_sep,:seg_term].each { |field|
|
97
|
+
result[field.to_s] = self.send(field).chr
|
98
|
+
}
|
99
|
+
result
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
76
103
|
end
|
data/lib/edi/mapper.rb
CHANGED
@@ -22,14 +22,14 @@ module EDI::E
|
|
22
22
|
class Mapper
|
23
23
|
extend Forwardable
|
24
24
|
|
25
|
-
attr :message
|
25
|
+
attr :message, :ic
|
26
26
|
attr_accessor :defaults
|
27
|
-
def_delegators :@ic, :charset, :empty?, :groups_created, :header,
|
28
|
-
:illegal_charset_pattern, :inspect, :is_iedi?, :messages_created,
|
29
|
-
:output_mode, :output_mode=, :show_una, :show_una=, :syntax, :to_s,
|
30
|
-
:to_xml, :to_xml_header, :to_xml_trailer, :trailer, :una, :validate,
|
31
|
-
:version
|
32
|
-
|
27
|
+
# def_delegators :@ic, :charset, :empty?, :groups_created, :header,
|
28
|
+
# :illegal_charset_pattern, :inspect, :is_iedi?, :messages_created,
|
29
|
+
# :output_mode, :output_mode=, :show_una, :show_una=, :syntax, :to_s,
|
30
|
+
# :to_xml, :to_xml_header, :to_xml_trailer, :trailer, :una, :validate,
|
31
|
+
# :version
|
32
|
+
|
33
33
|
class << self
|
34
34
|
def defaults
|
35
35
|
@defaults || {}
|
@@ -106,19 +106,46 @@ module EDI::E
|
|
106
106
|
struct['msg_opts'].each_pair { |k,v| json_msg_opts[k.to_sym] = v }
|
107
107
|
end
|
108
108
|
|
109
|
-
result = self.new(
|
110
|
-
|
109
|
+
result = self.new(ic_opts.merge(json_opts))
|
110
|
+
|
111
|
+
['header','trailer'].each { |envseg|
|
112
|
+
if struct[envseg]
|
113
|
+
target = result.send(envseg.to_sym)
|
114
|
+
struct[envseg].last.each_pair { |de,val|
|
115
|
+
if val.is_a?(Hash)
|
116
|
+
val.each_pair { |cde,sval|
|
117
|
+
target[de][0][cde][0].value = sval
|
118
|
+
}
|
119
|
+
else
|
120
|
+
target[de][0].value = val
|
121
|
+
end
|
122
|
+
}
|
123
|
+
end
|
124
|
+
}
|
125
|
+
|
126
|
+
struct['body'].each { |msg_def|
|
127
|
+
msg_def.each_pair { |msg_type, msg_body|
|
128
|
+
if unh = msg_body.find { |s| s[0] == 'UNH' }
|
129
|
+
version_info = unh[1]['S009']
|
130
|
+
json_msg_opts[:resp_agency] = version_info['0051']
|
131
|
+
json_msg_opts[:version] = version_info['0052']
|
132
|
+
json_msg_opts[:release] = version_info['0054']
|
133
|
+
end
|
134
|
+
result.add_message(msg_type, json_msg_opts)
|
135
|
+
result.add(msg_body)
|
136
|
+
}
|
137
|
+
}
|
111
138
|
result.finalize
|
112
139
|
end
|
113
140
|
|
114
|
-
def initialize(
|
141
|
+
def initialize(ic_opts = {})
|
115
142
|
# Bug in edi4r 0.9 -- sometimes :recipient is used; sometimes :recip. It doesn't
|
116
143
|
# work. We'll override it.
|
117
144
|
local_ic_opts = ic_opts.reject { |k,v| [:sender,:sender_qual,:recipient,:recipient_qual].include?(k) }
|
118
145
|
@ic = EDI::E::Interchange.new(local_ic_opts || {})
|
119
146
|
|
120
147
|
# Apply any envelope defaults.
|
121
|
-
['
|
148
|
+
['UNB','UNZ'].each { |seg|
|
122
149
|
seg_defs = self.class.defaults[seg]
|
123
150
|
if seg_defs
|
124
151
|
seg_defs.each_pair { |cde,defs|
|
@@ -136,7 +163,9 @@ module EDI::E
|
|
136
163
|
@ic.header.cS002.d0007 = ic_opts[:sender_qual] unless ic_opts[:sender_qual].nil?
|
137
164
|
@ic.header.cS003.d0010 = ic_opts[:recipient] unless ic_opts[:recipient].nil?
|
138
165
|
@ic.header.cS003.d0007 = ic_opts[:recipient_qual] unless ic_opts[:recipient_qual].nil?
|
139
|
-
|
166
|
+
end
|
167
|
+
|
168
|
+
def add_message(msg_type, msg_opts = {})
|
140
169
|
@message = @ic.new_message( { :msg_type => msg_type, :version => 'D', :release => '96A', :resp_agency => 'UN' }.merge(msg_opts || {}) )
|
141
170
|
@ic.add(@message,false)
|
142
171
|
end
|
@@ -166,16 +195,26 @@ module EDI::E
|
|
166
195
|
@ic.to_s
|
167
196
|
end
|
168
197
|
|
198
|
+
def method_missing(sym, *args)
|
199
|
+
if @ic.respond_to?(sym)
|
200
|
+
@ic.send(sym, *args)
|
201
|
+
else
|
202
|
+
super(sym, *args)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
169
206
|
private
|
170
207
|
def add_segment(seg_name, value)
|
171
208
|
if seg_name =~ /^[A-Z]{3}$/
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
209
|
+
if seg_name !~ /^UN[HT]$/
|
210
|
+
seg = @message.new_segment(seg_name)
|
211
|
+
@message.add(seg)
|
212
|
+
default = self.class.defaults[seg_name]
|
213
|
+
data = default.nil? ? value : default.merge(value)
|
214
|
+
data.each_pair { |de,val|
|
215
|
+
add_element(seg,de,val,default)
|
216
|
+
}
|
217
|
+
end
|
179
218
|
else
|
180
219
|
apply_mapping(seg_name, value)
|
181
220
|
end
|
@@ -184,7 +223,9 @@ module EDI::E
|
|
184
223
|
def add_element(parent, de, value, default)
|
185
224
|
default = default[de] unless default.nil?
|
186
225
|
|
187
|
-
if
|
226
|
+
if de =~ /^SG[0-9]+$/
|
227
|
+
value.each { |v| self.add(*v) }
|
228
|
+
elsif value.is_a?(Hash)
|
188
229
|
new_parent = parent.send("c#{de}")
|
189
230
|
data = default.nil? ? value : default.merge(value)
|
190
231
|
data.each_pair { |k,v| add_element(new_parent,k,v,default) }
|
data/lib/openils/mapper.rb
CHANGED
data/test/map_spec.rb
CHANGED
@@ -5,7 +5,8 @@ require 'edi/edi2json'
|
|
5
5
|
describe EDI::E::Mapper do
|
6
6
|
|
7
7
|
before(:each) do
|
8
|
-
@map = EDI::E::Mapper.new
|
8
|
+
@map = EDI::E::Mapper.new
|
9
|
+
@map.add_message('ORDERS')
|
9
10
|
end
|
10
11
|
|
11
12
|
it "should chunk text" do
|
@@ -42,7 +43,8 @@ describe EDI::E::Mapper do
|
|
42
43
|
end
|
43
44
|
|
44
45
|
it "should properly fill in interchange envelope defaults" do
|
45
|
-
map = EDI::E::Mapper.new(
|
46
|
+
map = EDI::E::Mapper.new({:sender => '123456', :recipient => '654321'})
|
47
|
+
map.add_message('ORDERS')
|
46
48
|
map.to_s.should =~ /UNA:\+\.\? 'UNB\+UNOB:3\+123456\+654321\+[0-9]{6}:[0-9]{4}\+1'UNH\+1\+ORDERS:D:96A:UN'UNT\+2\+1'UNZ\+1\+1'/
|
47
49
|
end
|
48
50
|
|
@@ -112,7 +114,7 @@ describe EDI::E::Mapper do
|
|
112
114
|
}
|
113
115
|
# Can't compare everything because of timestamping, so we'll just compare
|
114
116
|
# the bodies for a high degree of confidence
|
115
|
-
interchange.to_hash['body'].should == [
|
117
|
+
interchange.to_hash['body'].should == [{"ORDERS"=>[["UNH", {"S009"=>{"0052"=>"D", "0054"=>"96A", "0065"=>"ORDERS", "0051"=>"UN"}, "0062"=>"1"}], ["BGM", {"1225"=>"9", "C002"=>{"1001"=>"220"}, "1004"=>"2"}], ["DTM", {"C507"=>{"2379"=>"102", "2380"=>"20090331", "2005"=>"137"}}], ["NAD", {"C080"=>{"3036"=>[]}, "C058"=>{"3124"=>[]}, "C059"=>{"3042"=>[]}, "C082"=>{"3039"=>"3472205", "3055"=>"91"}, "SG2"=>[["RFF", {"C506"=>{"1153"=>"API", "1154"=>"3472205 0001"}}]], "3035"=>"BY"}], ["NAD", {"C080"=>{"3036"=>[]}, "C058"=>{"3124"=>[]}, "C059"=>{"3042"=>[]}, "C082"=>{"3039"=>"3472205", "3055"=>"31B"}, "SG2"=>[["RFF", {"C506"=>{"1153"=>"API", "1154"=>"3472205 0001"}}]], "3035"=>"BY"}], ["NAD", {"C080"=>{"3036"=>[]}, "C058"=>{"3124"=>[]}, "C059"=>{"3042"=>[]}, "C082"=>{"3039"=>"1556150", "3055"=>"31B"}, "3035"=>"SU"}], ["NAD", {"C080"=>{"3036"=>[]}, "C058"=>{"3124"=>[]}, "C059"=>{"3042"=>[]}, "C082"=>{"3039"=>"1556150", "3055"=>"91"}, "SG2"=>[["RFF", {"C506"=>{"1153"=>"IA", "1154"=>"1865"}}]], "3035"=>"SU"}], ["CUX", {"C504"=>[{"6345"=>"USD", "6347"=>"2", "6343"=>"9"}]}], ["LIN", {"SG25"=>[["PIA", {"C212"=>[{"7140"=>"03-0010837", "7143"=>"SA"}], "4347"=>"5"}], ["IMD", {"C273"=>{"7008"=>["Discernment"]}, "7077"=>"F", "7081"=>"BTI"}], ["IMD", {"C273"=>{"7008"=>["Concord Records,"]}, "7077"=>"F", "7081"=>"BPU"}], ["IMD", {"C273"=>{"7008"=>["1986."]}, "7077"=>"F", "7081"=>"BPD"}], ["IMD", {"C273"=>{"7008"=>["1 sound disc :"]}, "7077"=>"F", "7081"=>"BPH"}], ["QTY", {"C186"=>{"6060"=>2, "6063"=>"21"}}], ["PRI", {"C509"=>{"5125"=>"AAB", "5118"=>35.95}}], ["RFF", {"C506"=>{"1153"=>"LI", "1154"=>"2/1"}}]], "1082"=>1}], ["LIN", {"SG25"=>[["PIA", {"C212"=>[{"7140"=>"03-0010840", "7143"=>"SA"}], "4347"=>"5"}], ["IMD", {"C273"=>{"7008"=>["The inner source"]}, "7077"=>"F", "7081"=>"BTI"}], ["IMD", {"C273"=>{"7008"=>["Duke, George, 1946-"]}, "7077"=>"F", "7081"=>"BAU"}], ["IMD", {"C273"=>{"7008"=>["MPS Records,"]}, "7077"=>"F", "7081"=>"BPU"}], ["IMD", {"C273"=>{"7008"=>["1973."]}, "7077"=>"F", "7081"=>"BPD"}], ["IMD", {"C273"=>{"7008"=>["2 sound discs :"]}, "7077"=>"F", "7081"=>"BPH"}], ["QTY", {"C186"=>{"6060"=>1, "6063"=>"21"}}], ["PRI", {"C509"=>{"5125"=>"AAB", "5118"=>28.95}}], ["RFF", {"C506"=>{"1153"=>"LI", "1154"=>"2/2"}}]], "1082"=>2}], ["UNS", {"0081"=>"S"}], ["CNT", {"C270"=>{"6069"=>"2", "6066"=>2}}], ["UNT", {"0074"=>33, "0062"=>"1"}]]}]
|
116
118
|
end
|
117
119
|
|
118
120
|
end
|
data/test/openils_map_spec.rb
CHANGED
@@ -3,7 +3,8 @@ require 'openils/mapper'
|
|
3
3
|
describe OpenILS::Mapper do
|
4
4
|
|
5
5
|
before(:each) do
|
6
|
-
@map = OpenILS::Mapper.new
|
6
|
+
@map = OpenILS::Mapper.new
|
7
|
+
@map.add_message('ORDERS')
|
7
8
|
end
|
8
9
|
|
9
10
|
it "should add both qualified and unqualified buyer/vendor fields" do
|
@@ -32,7 +33,7 @@ describe OpenILS::Mapper do
|
|
32
33
|
|
33
34
|
it "should create a message from high-level JEDI input" do
|
34
35
|
json = File.read(File.join(File.dirname(__FILE__), 'test_po.json'))
|
35
|
-
@map = OpenILS::Mapper.from_json(%{{ "
|
36
|
+
@map = OpenILS::Mapper.from_json(%{{ "body": [{ "ORDERS": #{json}}], "sender": "123456", "recipient": {"id": "999999999", "id-qualifier": "1"}}})
|
36
37
|
@map.message.to_s.should == "UNH+1+ORDERS:D:96A:UN'BGM+220+2+9'DTM+137:20090331:102'NAD+BY+3472205::91'RFF+API:3472205 0001'NAD+BY+3472205::31B'RFF+API:3472205 0001'NAD+SU+1556150::31B'NAD+SU+1556150::91'RFF+IA:1865'CUX+2:USD:9'LIN+1'PIA+5+03-0010837:SA'IMD+F+BTI+:::Discernment'IMD+F+BPU+:::Concord Records,'IMD+F+BPD+:::1986.'IMD+F+BPH+:::1 sound disc ?:'QTY+21:2'PRI+AAB:35.95'RFF+LI:2/1'LIN+2'PIA+5+03-0010840:SA'IMD+F+BTI+:::The inner source'IMD+F+BAU+:::Duke, George, 1946-'IMD+F+BPU+:::MPS Records,'IMD+F+BPD+:::1973.'IMD+F+BPH+:::2 sound discs ?:'QTY+21:1'PRI+AAB:28.95'RFF+LI:2/2'UNS+S'CNT+2:2'UNT+33+1'"
|
37
38
|
@map.header.cS002.to_s.should == "123456:31B"
|
38
39
|
@map.header.cS003.to_s.should == "999999999:1"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openils-mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael B. Klein
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-03 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|