openils-mapper 0.8.2 → 0.9.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/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
|