oddb2xml 2.1.6 → 2.1.7
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 +4 -4
- data/Gemfile.lock +5 -3
- data/History.txt +6 -0
- data/lib/oddb2xml/builder.rb +24 -17
- data/lib/oddb2xml/extractor.rb +6 -10
- data/lib/oddb2xml/version.rb +1 -1
- data/lib/oddb2xml/xml_definitions.rb +1 -0
- data/oddb2xml.gemspec +1 -1
- data/oddb2xml.xsd +47 -0
- data/spec/builder_spec.rb +29 -1
- data/spec/data/swissmedic_info.zip +0 -0
- data/spec/extractor_spec.rb +26 -8
- data/test_options.rb +1 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 899a0f8501e70e79d800f160bfd50b4fbf370100
|
4
|
+
data.tar.gz: 54f75e31226c4676ee2b7f1a4c7c893c104dba27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56dd104a5a3363d62de7ba797a1d5a20634365cf5282331a1c8c061561cdf4e0dedef81081af7c0c408522a0cf321ac240087dbd4031540da9e51c1964609e03
|
7
|
+
data.tar.gz: 370cdc20ba9bea205d03f97a44898c05ca46394eba0ded6003444f91ab2d8803be664ae1e55d9f6026f9271415ca22c2b4aed4246585a319a777b37882bd449c
|
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
oddb2xml (2.1.
|
4
|
+
oddb2xml (2.1.7)
|
5
5
|
archive-tar-minitar (~> 0.5.2)
|
6
6
|
mechanize (~> 2.5.1)
|
7
|
-
nokogiri
|
7
|
+
nokogiri
|
8
8
|
parslet (~> 1.7.0)
|
9
9
|
rubyXL (~> 3.3.1)
|
10
10
|
rubyzip (~> 1.1.3)
|
@@ -51,9 +51,11 @@ GEM
|
|
51
51
|
webrobots (~> 0.0, >= 0.0.9)
|
52
52
|
method_source (0.8.2)
|
53
53
|
mime-types (1.25.1)
|
54
|
+
mini_portile (0.6.2)
|
54
55
|
net-http-digest_auth (1.4)
|
55
56
|
net-http-persistent (2.9.4)
|
56
|
-
nokogiri (1.
|
57
|
+
nokogiri (1.6.6.2)
|
58
|
+
mini_portile (~> 0.6.0)
|
57
59
|
nori (2.3.0)
|
58
60
|
ntlm-http (0.1.1)
|
59
61
|
parslet (1.7.0)
|
data/History.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 2.1.7 / 15.06.2015
|
2
|
+
|
3
|
+
* Fixed option -o which did not produce any meaningful oddb_fi.xml
|
4
|
+
* Added KOMPENDIUM_PRODUCT to xsd file
|
5
|
+
* Added style for each KOMPENDIUM_PRODUCT
|
6
|
+
|
1
7
|
=== 2.1.6 / 10.06.2015
|
2
8
|
|
3
9
|
* Avoid error when Packungen.xlsx does not contain a name for a product (upstream error, missing Combizym, Dragées)
|
data/lib/oddb2xml/builder.rb
CHANGED
@@ -965,13 +965,14 @@ module Oddb2xml
|
|
965
965
|
'DT' => ''
|
966
966
|
) {
|
967
967
|
unless info[:name].empty?
|
968
|
-
xml.name
|
968
|
+
xml.name info[:name]
|
969
969
|
end
|
970
970
|
unless info[:owner].empty?
|
971
|
-
xml.owner
|
971
|
+
xml.owner info[:owner]
|
972
972
|
end
|
973
973
|
xml.monid info[:monid] unless info[:monid].empty?
|
974
|
-
xml.
|
974
|
+
xml.style { xml.cdata(info[:style]) } if info[:style]
|
975
|
+
xml.paragraph { xml.cdata(Nokogiri::HTML.fragment(info[:paragraph].to_html).to_html(:encoding => 'UTF-8')) } if info[:paragraph]
|
975
976
|
}
|
976
977
|
end
|
977
978
|
end
|
@@ -997,21 +998,27 @@ module Oddb2xml
|
|
997
998
|
@infos[lang].each_with_index do |info, i|
|
998
999
|
info_index[info[:monid]] = i
|
999
1000
|
end
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1001
|
+
# prod
|
1002
|
+
@products.each do |prod|
|
1003
|
+
next unless prod[:seq] and prod[:seq][:packages]
|
1004
|
+
seq = prod[:seq]
|
1005
|
+
prod[:seq][:packages].each {
|
1006
|
+
|phar, package|
|
1007
|
+
next unless package[:swissmedic_number8]
|
1008
|
+
m = /(\d{5})(\d{3})/.match(package[:swissmedic_number8])
|
1009
|
+
next unless m
|
1010
|
+
number = m[1].to_s
|
1011
|
+
idx = info_index[number]
|
1012
|
+
next unless idx
|
1013
|
+
xml.KP('DT' => '') {
|
1014
|
+
xml.MONID @infos[lang][idx][:monid]
|
1015
|
+
xml.PRDNO seq[:product_key] unless seq[:product_key].empty?
|
1016
|
+
# as orphans ?
|
1017
|
+
xml.DEL @orphans.include?(number) ? true : false
|
1018
|
+
}
|
1019
|
+
}
|
1020
|
+
end
|
1013
1021
|
end
|
1014
|
-
end
|
1015
1022
|
xml.RESULT {
|
1016
1023
|
xml.OK_ERROR 'OK'
|
1017
1024
|
xml.NBR_RECORD length
|
data/lib/oddb2xml/extractor.rb
CHANGED
@@ -354,25 +354,21 @@ module Oddb2xml
|
|
354
354
|
item[:refdata] = true,
|
355
355
|
item[:name] = (name = pac.title) ? name : ''
|
356
356
|
item[:owner] = (ownr = pac.authHolder) ? ownr : ''
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
if text = html.xpath("///div[@id='Section7750']/p").text
|
363
|
-
# 1 ~ 3 swissmedic number
|
364
|
-
if text =~ /(\d{5})[,\s]*(\d{5})?|(\d{5})[,\s]*(\d{5})?[,\s]*(\d{5})?/
|
357
|
+
item[:style] = Nokogiri::HTML.fragment(pac.style).to_html(:encoding => 'UTF-8')
|
358
|
+
html = Nokogiri::HTML.fragment(pac.content.force_encoding('UTF-8'))
|
359
|
+
item[:paragraph] = html
|
360
|
+
numbers = /(\d{5})[,\s]*(\d{5})?|(\d{5})[,\s]*(\d{5})?[,\s]*(\d{5})?/.match(html)
|
361
|
+
if numbers
|
365
362
|
[$1, $2, $3].compact.each do |n| # plural
|
366
363
|
item[:monid] = n
|
367
364
|
data[lang] << item
|
368
365
|
end
|
369
|
-
end
|
370
|
-
end
|
371
366
|
end
|
372
367
|
end
|
373
368
|
data
|
374
369
|
end
|
375
370
|
end
|
371
|
+
|
376
372
|
class EphaExtractor < Extractor
|
377
373
|
def initialize(str)
|
378
374
|
@io = StringIO.new(str)
|
data/lib/oddb2xml/version.rb
CHANGED
data/oddb2xml.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency 'rubyzip', '~> 1.1.3'
|
24
24
|
spec.add_dependency 'archive-tar-minitar', '~> 0.5.2'
|
25
25
|
spec.add_dependency 'mechanize', '~> 2.5.1'
|
26
|
-
spec.add_dependency 'nokogiri'
|
26
|
+
spec.add_dependency 'nokogiri'
|
27
27
|
spec.add_dependency 'savon', '~> 2.4.0'
|
28
28
|
spec.add_dependency 'spreadsheet', '~> 1.0.0'
|
29
29
|
spec.add_dependency 'rubyXL', '~> 3.3.1'
|
data/oddb2xml.xsd
CHANGED
@@ -1113,4 +1113,51 @@
|
|
1113
1113
|
</xs:restriction>
|
1114
1114
|
</xs:simpleType>
|
1115
1115
|
</xs:element>
|
1116
|
+
<xs:element name="KP">
|
1117
|
+
<xs:complexType>
|
1118
|
+
<xs:sequence>
|
1119
|
+
<xs:element name="MONID" type="xs:string" />
|
1120
|
+
<xs:element name="PRDNO" type="xs:string" />
|
1121
|
+
<xs:element name="DEL" type="xs:boolean" />
|
1122
|
+
</xs:sequence>
|
1123
|
+
<xs:attribute name="DT" use="required"/>
|
1124
|
+
</xs:complexType>
|
1125
|
+
</xs:element>
|
1126
|
+
<xs:element name="KOMPENDIUM_PRODUCT">
|
1127
|
+
<xs:complexType>
|
1128
|
+
<xs:sequence>
|
1129
|
+
<xs:element maxOccurs="unbounded" ref="ns1:KP"/>
|
1130
|
+
<xs:element ref="ns1:RESULT"/>
|
1131
|
+
</xs:sequence>
|
1132
|
+
<xs:attribute name="CREATION_DATETIME" use="required"/>
|
1133
|
+
<xs:attribute name="PROD_DATE" use="required"/>
|
1134
|
+
<xs:attribute name="VALID_DATE" use="required"/>
|
1135
|
+
</xs:complexType>
|
1136
|
+
</xs:element>
|
1137
|
+
|
1138
|
+
<xs:element name="KMP">
|
1139
|
+
<xs:complexType>
|
1140
|
+
<xs:sequence>
|
1141
|
+
<xs:element name="name" type="xs:string" />
|
1142
|
+
<xs:element name="owner" type="xs:string" />
|
1143
|
+
<xs:element name="monid" type="xs:string" />
|
1144
|
+
<xs:element name="style" type="xs:string" />
|
1145
|
+
<xs:element name="paragraph" type="xs:string" />
|
1146
|
+
</xs:sequence>
|
1147
|
+
<xs:attribute name="MONTYPE" use="required"/>
|
1148
|
+
<xs:attribute name="LANG" use="required"/>
|
1149
|
+
<xs:attribute name="DT" use="required"/>
|
1150
|
+
</xs:complexType>
|
1151
|
+
</xs:element>
|
1152
|
+
<xs:element name="KOMPENDIUM">
|
1153
|
+
<xs:complexType>
|
1154
|
+
<xs:sequence>
|
1155
|
+
<xs:element maxOccurs="unbounded" ref="ns1:KMP"/>
|
1156
|
+
<xs:element ref="ns1:RESULT"/>
|
1157
|
+
</xs:sequence>
|
1158
|
+
<xs:attribute name="CREATION_DATETIME" use="required"/>
|
1159
|
+
<xs:attribute name="PROD_DATE" use="required"/>
|
1160
|
+
<xs:attribute name="VALID_DATE" use="required"/>
|
1161
|
+
</xs:complexType>
|
1162
|
+
</xs:element>
|
1116
1163
|
</xs:schema>
|
data/spec/builder_spec.rb
CHANGED
@@ -32,7 +32,7 @@ def check_validation_via_xsd
|
|
32
32
|
@oddb2xml_xsd = File.expand_path(File.join(File.dirname(__FILE__), '..', 'oddb2xml.xsd'))
|
33
33
|
File.exists?(@oddb2xml_xsd).should eq true
|
34
34
|
files = Dir.glob('*.xml')
|
35
|
-
xsd = Nokogiri::XML::Schema(File.read(@oddb2xml_xsd))
|
35
|
+
xsd = Nokogiri::XML::Schema(File.read(@oddb2xml_xsd))
|
36
36
|
files.each{
|
37
37
|
|file|
|
38
38
|
$stderr.puts "Validating file #{file} with #{File.size(file)} bytes" if $VERBOSE
|
@@ -55,6 +55,34 @@ describe Oddb2xml::Builder do
|
|
55
55
|
after(:each) do
|
56
56
|
Dir.chdir @savedDir if @savedDir and File.directory?(@savedDir)
|
57
57
|
end
|
58
|
+
context 'fachinfo' do
|
59
|
+
let(:cli) do
|
60
|
+
opts = {}
|
61
|
+
@oddb_fi_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_fi.xml'))
|
62
|
+
@oddb_fi_product_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_fi_product.xml'))
|
63
|
+
options = Oddb2xml::Options.new
|
64
|
+
options.parser.parse!(['-o'])
|
65
|
+
Oddb2xml::Cli.new(options.opts)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should return produce a correct oddb_fi.xml' do
|
69
|
+
# res = buildr_capture(:stdout){ cli.run }
|
70
|
+
cli.run
|
71
|
+
File.exists?(@oddb_fi_xml).should eq true
|
72
|
+
inhalt = IO.read(@oddb_fi_xml)
|
73
|
+
/<KMP/.match(inhalt.to_s).to_s.should eq '<KMP'
|
74
|
+
/<style><!\[CDATA\[p{margin-top/.match(inhalt.to_s).to_s.should eq '<style><![CDATA[p{margin-top'
|
75
|
+
m = /<paragraph><!\[CDATA\[(.+)\n(.*)/.match(inhalt.to_s)
|
76
|
+
m[1].should eq '<?xml version="1.0" encoding="utf-8"?><div xmlns="http://www.w3.org/1999/xhtml">'
|
77
|
+
expected = '<p class="s2"> </p>'
|
78
|
+
m[2].should eq '<p class="s2"> </p>'
|
79
|
+
File.exists?(@oddb_fi_product_xml).should eq true
|
80
|
+
inhalt = IO.read(@oddb_fi_product_xml)
|
81
|
+
skip "Niklaus does not know how to create a valid oddb_fi_product.xml"
|
82
|
+
check_validation_via_xsd
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
58
86
|
context 'XSD-generation: ' do
|
59
87
|
let(:cli) do
|
60
88
|
opts = {}
|
Binary file
|
data/spec/extractor_spec.rb
CHANGED
@@ -62,10 +62,32 @@ describe Oddb2xml::MigelExtractor do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
describe Oddb2xml::SwissmedicInfoExtractor do
|
65
|
+
include ServerMockHelper
|
65
66
|
before(:each) do
|
66
|
-
|
67
|
+
setup_swissmedic_info_server_mock
|
68
|
+
@downloader = Oddb2xml::SwissmedicInfoDownloader.new
|
67
69
|
end
|
70
|
+
context 'builds fachfinfo' do
|
71
|
+
it {
|
72
|
+
xml = @downloader.download
|
73
|
+
@infos = Oddb2xml::SwissmedicInfoExtractor.new(xml).to_hash
|
74
|
+
expect(@infos.size).to eq(1)
|
75
|
+
erbiumcitrat = nil
|
76
|
+
@infos['de'].each{|info|
|
77
|
+
erbiumcitrat = info if /Erbiumcitrat/.match(info[:name])
|
78
|
+
}
|
79
|
+
expect(erbiumcitrat[:owner]).to eq('CBI Medical Products Vertriebs GmbH')
|
80
|
+
expect(erbiumcitrat[:paragraph].to_s).to match(/Packungen/)
|
81
|
+
expect(erbiumcitrat[:paragraph].to_s).to match(/Stand der Information/)
|
82
|
+
expect(erbiumcitrat[:paragraph].to_s).to match(/Zulassungsinhaberin/)
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
68
86
|
|
87
|
+
describe Oddb2xml::SwissmedicExtractor do
|
88
|
+
before(:each) do
|
89
|
+
setup_epha_atc_csv_mock
|
90
|
+
end
|
69
91
|
context 'when transfer.dat is empty' do
|
70
92
|
subject { Oddb2xml::SwissmedicInfoExtractor.new("") }
|
71
93
|
it { expect(subject.to_hash).to be_empty }
|
@@ -123,7 +145,6 @@ describe Oddb2xml::MedregbmExtractor do
|
|
123
145
|
end
|
124
146
|
|
125
147
|
describe Oddb2xml::ZurroseExtractor do
|
126
|
-
if false
|
127
148
|
context 'when transfer.dat is empty' do
|
128
149
|
subject { Oddb2xml::ZurroseExtractor.new("") }
|
129
150
|
it { expect(subject.to_hash).to be_empty }
|
@@ -200,11 +221,10 @@ if false
|
|
200
221
|
DAT
|
201
222
|
Oddb2xml::ZurroseExtractor.new(dat, true)
|
202
223
|
end
|
203
|
-
|
224
|
+
it { expect(subject.to_hash.keys.first).to eq("0000008807890") }
|
204
225
|
it "should set the correct SALECD cmut code" do expect(subject.to_hash.values.first[:cmut]).to eq("2") end
|
205
|
-
it "should set the correct SALECD description" do expect(subject.to_hash.values.first[:description]).to
|
206
|
-
end
|
207
|
-
end
|
226
|
+
it "should set the correct SALECD description" do expect(subject.to_hash.values.first[:description]).to match(/Ethacridin lactat 1.+ 100ml/) end
|
227
|
+
end
|
208
228
|
context 'when parsing examples' do
|
209
229
|
subject do
|
210
230
|
filename = File.expand_path(File.join(__FILE__, '..', 'data', 'zurrose_transfer.dat'))
|
@@ -228,6 +248,4 @@ end
|
|
228
248
|
|
229
249
|
end
|
230
250
|
|
231
|
-
|
232
|
-
|
233
251
|
end
|
data/test_options.rb
CHANGED
@@ -56,6 +56,7 @@ unless 'localhost.localdomain'.eql?(Socket.gethostbyname(Socket.gethostname).fir
|
|
56
56
|
test_one_call('oddb2xml --append')
|
57
57
|
end
|
58
58
|
test_one_call('oddb2xml -t md -c tar.gz')
|
59
|
+
test_one_call('oddb2xml -o')
|
59
60
|
test_one_call('oddb2xml -f xml')
|
60
61
|
test_one_call('oddb2xml -f dat')
|
61
62
|
test_one_call('oddb2xml -t md')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oddb2xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yasuhiro Asaka, Zeno R.R. Davatz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: nokogiri
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: savon
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|