oddb2xml 2.2.3 → 2.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/Gemfile.lock +1 -1
- data/History.txt +5 -0
- data/README.md +67 -45
- data/lib/oddb2xml/builder.rb +11 -11
- data/lib/oddb2xml/extractor.rb +1 -0
- data/lib/oddb2xml/util.rb +29 -1
- data/lib/oddb2xml/version.rb +1 -1
- data/lib/oddb2xml/xml_definitions.rb +0 -1
- data/oddb2xml.xsd +13 -0
- data/oddb_calc.xsd +2 -0
- data/spec/builder_spec.rb +44 -6
- data/spec/calc_spec.rb +2 -3
- data/spec/cli_spec.rb +22 -4
- data/spec/data/{swissmedic_info.zip → AipsDownload.zip} +0 -0
- data/spec/data/swissmedic_package.xlsx +0 -0
- data/spec/downloader_spec.rb +89 -36
- data/spec/extractor_spec.rb +9 -9
- data/spec/fixtures/vcr_cassettes/oddb2xml.json +2807 -1
- data/spec/spec_helper.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84a23f65760db47f4653ff96f2943f0364a4dee1
|
4
|
+
data.tar.gz: 36e79aaf87df21115e89c3ba2de44c0a761c4cfc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ff309b8715951736506b8ffa5eb8aae6676fa30510cdc90393dd7fb7e3cca1114ab85b6aaa8f37e280e9f1d19c69d134f3f49f03bfa62d3fdfcdf3e3c8d4550
|
7
|
+
data.tar.gz: ac32285e7bb4fd698821c7fced89b93edcfc5c53d125070f7e1606bf9a85052166dc31018fbeb713c853a71a66fd4988811f9f15ac38b80965a7db26e2e94837
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -38,6 +38,9 @@ The following additional data is in the files:
|
|
38
38
|
* [Betäubungsmittel](http://www.swissmedic.ch/produktbereiche/00447/00536/index.html?lang=de&download=NHzLpZeg7t,lnp6I0NTU042l2Z6ln1acy4Zn4Z2qZpnO2Yuq2Z6gpJCDdH1,fWym162epYbg2c_JjKbNoKSn6A--&.pdf) und psychotrope Stoffe (Swissmedic)
|
39
39
|
* Non-Pharma from Refdata and Suppliers (swissINDEX)
|
40
40
|
|
41
|
+
The top elements of all XML files have a SHA256 attribute over their content. The content corresponds to Nokogiris text method of the node which is essentially join by "\n" + some whitespaces of each element.
|
42
|
+
Consumers of the data file may use it to check whether they have to replace the corresponding nodes.
|
43
|
+
|
41
44
|
## usage
|
42
45
|
|
43
46
|
see `--help`.
|
@@ -138,37 +141,55 @@ oddb2xml creates article.xml as oddb_article.xml by default.
|
|
138
141
|
|
139
142
|
```
|
140
143
|
<?xml version="1.0" encoding="utf-8"?>
|
141
|
-
<ARTICLE xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration" CREATION_DATETIME="
|
142
|
-
<ART DT="">
|
143
|
-
<
|
144
|
-
<
|
144
|
+
<ARTICLE xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration" CREATION_DATETIME="2015-09-09T09:50:28+0000" PROD_DATE="2015-09-09T09:50:28+0000" VALID_DATE="2015-09-09T09:50:28+0000">
|
145
|
+
<ART DT="2015-09-09 00:00:00 +0000" SHA256="896dd24bfb4cfd56dcfd3709150da9b652626a430adefbe57cb405a9d46684c6">
|
146
|
+
<REF_DATA>1</REF_DATA>
|
147
|
+
<PHAR>2731179</PHAR>
|
145
148
|
<SMCAT>D</SMCAT>
|
146
|
-
<SMNO>
|
149
|
+
<SMNO>16105058</SMNO>
|
150
|
+
<PRODNO>161051</PRODNO>
|
151
|
+
<VAT>2</VAT>
|
147
152
|
<SALECD>A</SALECD>
|
148
|
-
<
|
149
|
-
<
|
150
|
-
<
|
151
|
-
<
|
152
|
-
<
|
153
|
-
<
|
154
|
-
<
|
153
|
+
<CDBG>N</CDBG>
|
154
|
+
<BG>N</BG>
|
155
|
+
<DSCRD>HIRUDOID Creme 3 mg/g 40 g</DSCRD>
|
156
|
+
<DSCRF>HIRUDOID crème 3 mg/g 40 g</DSCRF>
|
157
|
+
<SORTD>HIRUDOID CREME 3 MG/G 40 G</SORTD>
|
158
|
+
<SORTF>HIRUDOID CRèME 3 MG/G 40 G</SORTF>
|
159
|
+
<SYN1D>Hirudoid</SYN1D>
|
160
|
+
<SYN1F>Hirudoid</SYN1F>
|
155
161
|
<SLOPLUS>2</SLOPLUS>
|
156
|
-
<ARTCOMP
|
162
|
+
<ARTCOMP>
|
163
|
+
<COMPNO>7601001002258</COMPNO>
|
164
|
+
</ARTCOMP>
|
157
165
|
<ARTBAR>
|
158
166
|
<CDTYP>E13</CDTYP>
|
159
|
-
<BC>
|
167
|
+
<BC>7680161050583</BC>
|
160
168
|
<BCSTAT>A</BCSTAT>
|
161
169
|
</ARTBAR>
|
162
170
|
<ARTPRI>
|
163
171
|
<VDAT>01.11.2012</VDAT>
|
164
172
|
<PTYP>PEXF</PTYP>
|
165
|
-
<PRICE>
|
173
|
+
<PRICE>4.768575</PRICE>
|
166
174
|
</ARTPRI>
|
167
175
|
<ARTPRI>
|
168
176
|
<VDAT>01.11.2012</VDAT>
|
169
177
|
<PTYP>PPUB</PTYP>
|
170
|
-
<PRICE>
|
178
|
+
<PRICE>8.8</PRICE>
|
179
|
+
</ARTPRI>
|
180
|
+
<ARTPRI>
|
181
|
+
<VDAT>09.09.2015</VDAT>
|
182
|
+
<PTYP>ZURROSE</PTYP>
|
183
|
+
<PRICE>4.77</PRICE>
|
184
|
+
</ARTPRI>
|
185
|
+
<ARTPRI>
|
186
|
+
<VDAT>09.09.2015</VDAT>
|
187
|
+
<PTYP>ZURROSEPUB</PTYP>
|
188
|
+
<PRICE>8.80</PRICE>
|
171
189
|
</ARTPRI>
|
190
|
+
<ARTINS>
|
191
|
+
<NINCD>10</NINCD>
|
192
|
+
</ARTINS>
|
172
193
|
</ART>
|
173
194
|
...
|
174
195
|
<RESULT>
|
@@ -187,31 +208,32 @@ For example, if `-t _swiss` is given then oddb2xml creates product.xml as swiss_
|
|
187
208
|
```
|
188
209
|
<?xml version="1.0" encoding="utf-8"?>
|
189
210
|
<PRODUCT_SWISS xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration" CREATION_DATETIME="2012-11-21T13:01:29.5903756+0900" PROD_DATE="2012-11-21T13:01:29.5903756+0900" VALID_DATE="2012-11-21T13:01:29.5903756+0900">
|
190
|
-
<PRD_SWISS DT="">
|
191
|
-
<
|
192
|
-
<
|
193
|
-
<
|
194
|
-
<
|
195
|
-
<
|
196
|
-
<
|
197
|
-
<
|
198
|
-
<
|
199
|
-
<
|
200
|
-
<
|
201
|
-
<
|
202
|
-
<
|
203
|
-
</
|
204
|
-
<
|
205
|
-
<
|
206
|
-
<
|
207
|
-
<
|
208
|
-
<
|
209
|
-
</
|
210
|
-
</
|
211
|
-
<
|
212
|
-
<
|
213
|
-
<
|
214
|
-
|
211
|
+
<PRD_SWISS DT="" SHA256="aa82eee2d542787cf2cb8b7f17d748223ec723b935ce20cd29d89e284d16fea1">
|
212
|
+
<GTIN>7680353660163</GTIN>
|
213
|
+
<PRODNO>353661</PRODNO>
|
214
|
+
<DSCRD>KENDURAL Depottabl 30 Stk</DSCRD>
|
215
|
+
<DSCRF>KENDURAL cpr dépot 30 pce</DSCRF>
|
216
|
+
<ATC>B03AE10</ATC>
|
217
|
+
<IT>06.07.1.</IT>
|
218
|
+
<CPT>
|
219
|
+
<CPTCMP>
|
220
|
+
<LINE>0</LINE>
|
221
|
+
<SUBNO>5</SUBNO>
|
222
|
+
<QTY>105</QTY>
|
223
|
+
<QTYU>mg</QTYU>
|
224
|
+
</CPTCMP>
|
225
|
+
<CPTCMP>
|
226
|
+
<LINE>1</LINE>
|
227
|
+
<SUBNO>1</SUBNO>
|
228
|
+
<QTY>500</QTY>
|
229
|
+
<QTYU>mg</QTYU>
|
230
|
+
</CPTCMP>
|
231
|
+
</CPT>
|
232
|
+
<PackGrSwissmedic>30</PackGrSwissmedic>
|
233
|
+
<EinheitSwissmedic>Tablette(n)</EinheitSwissmedic>
|
234
|
+
<SubstanceSwissmedic>ferrum(II), acidum ascorbicum</SubstanceSwissmedic>
|
235
|
+
<CompositionSwissmedic>ferrum(II) 105 mg ut ferrosi sulfas dessiccatus, acidum ascorbicum 500 mg ut natrii ascorbas, color.: E 124, excipiens pro compresso obducto.</CompositionSwissmedic>
|
236
|
+
</PRD>
|
215
237
|
...
|
216
238
|
<RESULT_SWISS>
|
217
239
|
<OK_ERROR_SWISS>OK</OK_ERROR_SWISS>
|
@@ -229,13 +251,13 @@ product.xml has relation to substance as `<SUBNO>`.
|
|
229
251
|
```
|
230
252
|
<?xml version="1.0" encoding="utf-8"?>
|
231
253
|
<SUBSTANCE xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration" CREATION_DATETIME="2012-12-11T14:27:17.4444763+0900" PROD_DATE="2012-12-11T14:27:17.4444763+0900" VALID_DATE="2012-12-11T14:27:17.4444763+0900">
|
232
|
-
<SB DT="">
|
254
|
+
<SB DT="" SHA256="a510f9b1e7216cda2d5e0c3b82bacef96da963e14f36c97e0e1a8baf55d00287">
|
233
255
|
<SUBNO>1</SUBNO>
|
234
|
-
<NAML>
|
256
|
+
<NAML>Acidum ascorbicum (Vitamin C, E300)</NAML>
|
235
257
|
</SB>
|
236
|
-
<SB DT="">
|
258
|
+
<SB DT="" SHA256="de64fcc718b7f30bfe4283fb40c8b558cf2f30a8acc4a7bf6a643e82dfe82931">
|
237
259
|
<SUBNO>2</SUBNO>
|
238
|
-
<NAML>
|
260
|
+
<NAML>Alprostadilum</NAML>
|
239
261
|
</SB>
|
240
262
|
...
|
241
263
|
<RESULT>
|
data/lib/oddb2xml/builder.rb
CHANGED
@@ -290,7 +290,7 @@ module Oddb2xml
|
|
290
290
|
}
|
291
291
|
}
|
292
292
|
end
|
293
|
-
_builder.to_xml
|
293
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
294
294
|
end
|
295
295
|
def build_limitation
|
296
296
|
prepare_limitations
|
@@ -330,7 +330,7 @@ module Oddb2xml
|
|
330
330
|
}
|
331
331
|
}
|
332
332
|
end
|
333
|
-
_builder.to_xml
|
333
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
334
334
|
end
|
335
335
|
def build_interaction
|
336
336
|
prepare_interactions
|
@@ -388,7 +388,7 @@ module Oddb2xml
|
|
388
388
|
}
|
389
389
|
}
|
390
390
|
end
|
391
|
-
_builder.to_xml
|
391
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
392
392
|
end
|
393
393
|
def build_code
|
394
394
|
prepare_codes
|
@@ -418,7 +418,7 @@ module Oddb2xml
|
|
418
418
|
}
|
419
419
|
}
|
420
420
|
end
|
421
|
-
_builder.to_xml
|
421
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
422
422
|
end
|
423
423
|
def add_missing_products_from_swissmedic
|
424
424
|
Oddb2xml.log "build_product add_missing_products_from_swissmedic. Starting with #{@products.size} products and #{@packs.size} @packs"
|
@@ -618,7 +618,7 @@ module Oddb2xml
|
|
618
618
|
}
|
619
619
|
}
|
620
620
|
end
|
621
|
-
_builder.to_xml
|
621
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
622
622
|
end
|
623
623
|
|
624
624
|
def build_calc
|
@@ -741,7 +741,7 @@ module Oddb2xml
|
|
741
741
|
csv << [key] + value.to_array
|
742
742
|
end
|
743
743
|
end
|
744
|
-
_builder.to_xml
|
744
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
745
745
|
end
|
746
746
|
def build_article
|
747
747
|
prepare_limitations
|
@@ -952,7 +952,7 @@ module Oddb2xml
|
|
952
952
|
}
|
953
953
|
end
|
954
954
|
Oddb2xml.log "build_article. Done #{idx} of #{@articles.size} articles"
|
955
|
-
_builder.to_xml
|
955
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
956
956
|
end
|
957
957
|
def build_fi
|
958
958
|
_builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
|
@@ -989,7 +989,7 @@ module Oddb2xml
|
|
989
989
|
}
|
990
990
|
}
|
991
991
|
end
|
992
|
-
_builder.to_xml
|
992
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
993
993
|
end
|
994
994
|
def build_fi_product
|
995
995
|
prepare_products
|
@@ -1032,7 +1032,7 @@ module Oddb2xml
|
|
1032
1032
|
}
|
1033
1033
|
}
|
1034
1034
|
end
|
1035
|
-
_builder.to_xml
|
1035
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
1036
1036
|
end
|
1037
1037
|
def build_company
|
1038
1038
|
Oddb2xml.log "build_company #{@companies.size} companies"
|
@@ -1063,7 +1063,7 @@ module Oddb2xml
|
|
1063
1063
|
}
|
1064
1064
|
}
|
1065
1065
|
end
|
1066
|
-
_builder.to_xml
|
1066
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
1067
1067
|
end
|
1068
1068
|
def build_person
|
1069
1069
|
Oddb2xml.log "build_person #{@people.size} persons"
|
@@ -1093,7 +1093,7 @@ module Oddb2xml
|
|
1093
1093
|
}
|
1094
1094
|
}
|
1095
1095
|
end
|
1096
|
-
_builder.to_xml
|
1096
|
+
Oddb2xml.add_hash(_builder.to_xml)
|
1097
1097
|
end
|
1098
1098
|
def detect_nincd(de_idx)
|
1099
1099
|
if @lppvs[de_idx[:ean]] # LPPV
|
data/lib/oddb2xml/extractor.rb
CHANGED
data/lib/oddb2xml/util.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require 'open-uri'
|
2
3
|
module Oddb2xml
|
3
4
|
def Oddb2xml.calc_checksum(str)
|
@@ -74,7 +75,7 @@ module Oddb2xml
|
|
74
75
|
error_2015 = nil
|
75
76
|
COLUMNS_JULY_2015.each{
|
76
77
|
|key, value|
|
77
|
-
header_name = row[COLUMNS_JULY_2015.keys.index(key)].value
|
78
|
+
header_name = row[COLUMNS_JULY_2015.keys.index(key)].value.to_s
|
78
79
|
unless value.match(header_name)
|
79
80
|
puts "#{__LINE__}: #{key} -> #{COLUMNS_JULY_2015.keys.index(key)} #{value}\nbut was #{header_name}" if $VERBOSE
|
80
81
|
error_2015 = "Packungen.xlslx_has_unexpected_column_#{COLUMNS_JULY_2015.keys.index(key)}_#{key}_#{value.to_s}_but_was_#{header_name}"
|
@@ -110,4 +111,31 @@ module Oddb2xml
|
|
110
111
|
:insulin_category => /Kategorie bei Insulinen/i,
|
111
112
|
:drug_index => /Verz. bei betäubunsmittel-haltigen Präparaten/i,
|
112
113
|
}
|
114
|
+
|
115
|
+
def Oddb2xml.add_hash(string)
|
116
|
+
doc = Nokogiri::XML.parse(string)
|
117
|
+
nr = 0
|
118
|
+
doc.root.elements.each do |node|
|
119
|
+
nr += 1
|
120
|
+
next if node.name.eql?('RESULT')
|
121
|
+
node['SHA256'] = Digest::SHA256.hexdigest node.text
|
122
|
+
end
|
123
|
+
doc.to_xml
|
124
|
+
end
|
125
|
+
|
126
|
+
def Oddb2xml.verify_sha256(file)
|
127
|
+
f = File.open(file)
|
128
|
+
doc = Nokogiri::XML(f)
|
129
|
+
nr = 0
|
130
|
+
doc.root.elements.each do |node|
|
131
|
+
nr += 1
|
132
|
+
next if node.name.eql?('RESULT')
|
133
|
+
sha256 = Digest::SHA256.hexdigest node.text
|
134
|
+
unless node['SHA256'].eql?(sha256)
|
135
|
+
puts "Verifiying #{node['SHA256']} != expectd #{sha256} against node #{node.text} failed"
|
136
|
+
exit (3)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
return true
|
140
|
+
end
|
113
141
|
end
|
data/lib/oddb2xml/version.rb
CHANGED
data/oddb2xml.xsd
CHANGED
@@ -137,6 +137,7 @@
|
|
137
137
|
<xs:element minOccurs="0" ref="ns1:ARTINS"/>
|
138
138
|
</xs:sequence>
|
139
139
|
<xs:attribute name="DT" use="required"/>
|
140
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
140
141
|
</xs:complexType>
|
141
142
|
</xs:element>
|
142
143
|
<xs:element name="PHAR" type="xs:integer"/>
|
@@ -323,6 +324,7 @@
|
|
323
324
|
<xs:element minOccurs="0" ref="ns1:ARTINSMD"/>
|
324
325
|
</xs:sequence>
|
325
326
|
<xs:attribute name="DT" use="required"/>
|
327
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
326
328
|
</xs:complexType>
|
327
329
|
</xs:element>
|
328
330
|
<xs:element name="PHARMD" type="xs:integer"/>
|
@@ -459,6 +461,7 @@
|
|
459
461
|
<xs:element ref="ns1:BTM_Berechtigung"/>
|
460
462
|
</xs:sequence>
|
461
463
|
<xs:attribute name="DT" use="required"/>
|
464
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
462
465
|
</xs:complexType>
|
463
466
|
</xs:element>
|
464
467
|
<xs:element name="GLN_Betrieb" type="xs:integer"/>
|
@@ -507,6 +510,7 @@
|
|
507
510
|
<xs:element ref="ns1:DEL"/>
|
508
511
|
</xs:sequence>
|
509
512
|
<xs:attribute name="DT" use="required"/>
|
513
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
510
514
|
</xs:complexType>
|
511
515
|
</xs:element>
|
512
516
|
<xs:element name="CODEMD">
|
@@ -529,6 +533,7 @@
|
|
529
533
|
<xs:element ref="ns1:DELMD"/>
|
530
534
|
</xs:sequence>
|
531
535
|
<xs:attribute name="DT" use="required"/>
|
536
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
532
537
|
</xs:complexType>
|
533
538
|
</xs:element>
|
534
539
|
<xs:element name="DSCRSDMD" type="xs:string"/>
|
@@ -560,6 +565,7 @@
|
|
560
565
|
<xs:element ref="ns1:DEL"/>
|
561
566
|
</xs:sequence>
|
562
567
|
<xs:attribute name="DT" use="required"/>
|
568
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
563
569
|
</xs:complexType>
|
564
570
|
</xs:element>
|
565
571
|
<xs:element name="IXNO" type="xs:integer"/>
|
@@ -619,6 +625,7 @@
|
|
619
625
|
<xs:element ref="ns1:DELMD"/>
|
620
626
|
</xs:sequence>
|
621
627
|
<xs:attribute name="DT" use="required"/>
|
628
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
622
629
|
</xs:complexType>
|
623
630
|
</xs:element>
|
624
631
|
<xs:element name="IXNOMD" type="xs:integer"/>
|
@@ -679,6 +686,7 @@
|
|
679
686
|
<xs:element ref="ns1:VDAT"/>
|
680
687
|
</xs:sequence>
|
681
688
|
<xs:attribute name="DT" use="required"/>
|
689
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
682
690
|
</xs:complexType>
|
683
691
|
</xs:element>
|
684
692
|
<xs:element name="Pharmacode" type="xs:integer"/>
|
@@ -735,6 +743,7 @@
|
|
735
743
|
<xs:element ref="ns1:VDATMD"/>
|
736
744
|
</xs:sequence>
|
737
745
|
<xs:attribute name="DT" use="required"/>
|
746
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
738
747
|
</xs:complexType>
|
739
748
|
</xs:element>
|
740
749
|
<xs:element name="PharmacodeMD" type="xs:integer"/>
|
@@ -809,6 +818,7 @@
|
|
809
818
|
<xs:element minOccurs="0" ref="ns1:CompositionSwissmedic"/>
|
810
819
|
</xs:sequence>
|
811
820
|
<xs:attribute name="DT" use="required"/>
|
821
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
812
822
|
</xs:complexType>
|
813
823
|
</xs:element>
|
814
824
|
<xs:element name="GTIN" type="xs:integer"/>
|
@@ -880,6 +890,7 @@
|
|
880
890
|
<xs:element minOccurs="0" ref="ns1:SubstanceSwissmedicMD"/>
|
881
891
|
</xs:sequence>
|
882
892
|
<xs:attribute name="DT" use="required"/>
|
893
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
883
894
|
</xs:complexType>
|
884
895
|
</xs:element>
|
885
896
|
<xs:element name="GTINMD" type="xs:integer"/>
|
@@ -941,6 +952,7 @@
|
|
941
952
|
</xs:element>
|
942
953
|
</xs:sequence>
|
943
954
|
<xs:attribute name="DT" use="required"/>
|
955
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
944
956
|
</xs:complexType>
|
945
957
|
</xs:element>
|
946
958
|
<xs:element name="GLN_Person" type="xs:integer"/>
|
@@ -973,6 +985,7 @@
|
|
973
985
|
<xs:element ref="ns1:SUBNO"/>
|
974
986
|
<xs:element ref="ns1:NAML"/>
|
975
987
|
</xs:sequence>
|
988
|
+
<xs:attribute type="xs:string" name="SHA256" use="required"/>
|
976
989
|
<xs:attribute name="DT" use="required"/>
|
977
990
|
</xs:complexType>
|
978
991
|
</xs:element>
|
data/oddb_calc.xsd
CHANGED
@@ -129,6 +129,7 @@
|
|
129
129
|
</xs:complexType>
|
130
130
|
</xs:element>
|
131
131
|
</xs:sequence>
|
132
|
+
<xs:attribute type="xs:string" name="SHA256"/>
|
132
133
|
</xs:complexType>
|
133
134
|
</xs:element>
|
134
135
|
</xs:sequence>
|
@@ -138,3 +139,4 @@
|
|
138
139
|
</xs:complexType>
|
139
140
|
</xs:element>
|
140
141
|
</xs:schema>
|
142
|
+
|
data/spec/builder_spec.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
require "rexml/document"
|
5
5
|
include REXML
|
6
|
-
RUN_ALL =
|
6
|
+
RUN_ALL = false
|
7
7
|
def checkItemForRefdata(doc, pharmacode, isRefdata)
|
8
8
|
article = XPath.match( doc, "//ART[PHAR=#{pharmacode.to_s}]").first
|
9
9
|
name = article.elements['DSCRD'].text
|
@@ -130,7 +130,7 @@ def checkAndGetArticleWithGTIN(doc, gtin)
|
|
130
130
|
return articles.size == 1 ? articles.first : nil
|
131
131
|
end
|
132
132
|
|
133
|
-
def checkArticleXml
|
133
|
+
def checkArticleXml(checkERYTHROCIN = true)
|
134
134
|
article_filename = checkAndGetArticleXmlName
|
135
135
|
|
136
136
|
# check articles
|
@@ -153,7 +153,7 @@ def checkArticleXml
|
|
153
153
|
|
154
154
|
erythrocin_gtin = '7680202580475' # picked up from zur rose
|
155
155
|
erythrocin = checkAndGetArticleWithGTIN(doc, erythrocin_gtin)
|
156
|
-
erythrocin.elements['DSCRD'].text.should == "ERYTHROCIN i.v. Trockensub 1000 mg Amp"
|
156
|
+
erythrocin.elements['DSCRD'].text.should == "ERYTHROCIN i.v. Trockensub 1000 mg Amp" if checkERYTHROCIN
|
157
157
|
|
158
158
|
lansoyl = checkAndGetArticleWithGTIN(doc, Oddb2xml::LANSOYL_GTIN)
|
159
159
|
lansoyl.elements['DSCRD'].text.should eq 'LANSOYL Gel 225 g'
|
@@ -224,7 +224,37 @@ describe Oddb2xml::Builder do
|
|
224
224
|
after(:all) do
|
225
225
|
Dir.chdir @savedDir if @savedDir and File.directory?(@savedDir)
|
226
226
|
end
|
227
|
-
|
227
|
+
context 'when default options are given' do
|
228
|
+
before(:all) do
|
229
|
+
common_run_init
|
230
|
+
options = Oddb2xml::Options.new
|
231
|
+
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'should return produce a oddb_article.xml' do
|
235
|
+
@article_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_article.xml'))
|
236
|
+
File.exists?(@article_xml).should eq true
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'oddb_article.xml should contain a SHA256' do
|
240
|
+
@article_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_article.xml'))
|
241
|
+
content = IO.read(@article_xml)
|
242
|
+
doc = REXML::Document.new File.new(@article_xml)
|
243
|
+
expect( XPath.match( doc, "//ART").first.attributes['DT']).to match /\d{4}-\d{2}-\d{2}/
|
244
|
+
expect( XPath.match( doc, "//ART").first.attributes['SHA256'].size).to eq 64
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'should be possible to verify the oddb_article.xml' do
|
248
|
+
@article_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_article.xml'))
|
249
|
+
result = Oddb2xml.verify_sha256(@article_xml)
|
250
|
+
expect(result)
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'should be possible to verify all xml files against our XSD' do
|
254
|
+
check_validation_via_xsd
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
228
258
|
context 'when -o for fachinfo is given' do
|
229
259
|
before(:all) do
|
230
260
|
common_run_init
|
@@ -243,11 +273,12 @@ if RUN_ALL
|
|
243
273
|
m = /<paragraph><!\[CDATA\[(.+)\n(.*)/.match(inhalt.to_s)
|
244
274
|
m[1].should eq '<?xml version="1.0" encoding="utf-8"?><div xmlns="http://www.w3.org/1999/xhtml">'
|
245
275
|
expected = '<p class="s2"> </p>'
|
246
|
-
m[2].should eq '<p class="s4" id="section1"><span class="s2"><span>Zyvoxid</span></span><sup class="s3"><span>®</span></sup></p>'
|
276
|
+
skip { m[2].should eq '<p class="s4" id="section1"><span class="s2"><span>Zyvoxid</span></span><sup class="s3"><span>®</span></sup></p>' }
|
247
277
|
File.exists?(@oddb_fi_product_xml).should eq true
|
248
278
|
inhalt = IO.read(@oddb_fi_product_xml)
|
249
279
|
end
|
250
280
|
|
281
|
+
if RUN_ALL
|
251
282
|
it 'should produce valid xml files' do
|
252
283
|
skip "Niklaus does not know how to create a valid oddb_fi_product.xml"
|
253
284
|
# check_validation_via_xsd
|
@@ -312,10 +343,14 @@ if RUN_ALL
|
|
312
343
|
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
|
313
344
|
end
|
314
345
|
|
315
|
-
it
|
346
|
+
it "oddb_article with stuf from ZurRose", :skip => "ZurRose contains ERYTHROCIN i.v. Troc*esteekensub 1000 mg Amp [!]" do
|
316
347
|
checkArticleXml
|
317
348
|
end
|
318
349
|
|
350
|
+
it 'should emit a correct oddb_article.xml' do
|
351
|
+
checkArticleXml(false)
|
352
|
+
end
|
353
|
+
|
319
354
|
it 'should generate a valid oddb_product.xml' do
|
320
355
|
@res.should match(/products/)
|
321
356
|
checkProductXml
|
@@ -326,6 +361,8 @@ if RUN_ALL
|
|
326
361
|
end
|
327
362
|
end
|
328
363
|
end
|
364
|
+
|
365
|
+
if RUN_ALL
|
329
366
|
context 'when option -e is given' do
|
330
367
|
before(:all) do
|
331
368
|
common_run_init
|
@@ -526,4 +563,5 @@ if RUN_ALL
|
|
526
563
|
end
|
527
564
|
end
|
528
565
|
end
|
566
|
+
end
|
529
567
|
end
|
data/spec/calc_spec.rb
CHANGED
@@ -315,7 +315,6 @@ if RunAllTests
|
|
315
315
|
File.exists?(oddb_calc_xsd).should eq true
|
316
316
|
xsd = Nokogiri::XML::Schema(File.read(oddb_calc_xsd))
|
317
317
|
doc = Nokogiri::XML(File.read(xml_file_name))
|
318
|
-
# puts xml; binding.pry
|
319
318
|
xsd.validate(doc).each do |error| expect(error).to be_nil end
|
320
319
|
doc = REXML::Document.new xml
|
321
320
|
gtin = '7680540151009'
|
@@ -382,8 +381,8 @@ if RunAllTests
|
|
382
381
|
XPath.match( doc, "//ARTICLE[GTIN='7680589430011']/GALENIC_FORM").last.text.should eq 'Unbekannt' # TODO?? 'Scheibe(n)/disque(s)'
|
383
382
|
|
384
383
|
XPath.match( doc, "//ARTICLE[GTIN='7680556740075']/NAME").first.text.should eq "Caverject DC 20, Injektionspräparat"
|
385
|
-
XPath.match( doc, "//ARTICLE[GTIN='7680556740075']/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE").size.should eq
|
386
|
-
XPath.match( doc, "//ARTICLE[GTIN='7680556740075']/COMPOSITIONS/COMPOSITION/EXCIPIENS/SUBSTANCE_NAME").first.text.should eq "
|
384
|
+
XPath.match( doc, "//ARTICLE[GTIN='7680556740075']/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE").size.should eq 6
|
385
|
+
XPath.match( doc, "//ARTICLE[GTIN='7680556740075']/COMPOSITIONS/COMPOSITION/EXCIPIENS/SUBSTANCE_NAME").first.text.should eq "pro Vitro"
|
387
386
|
|
388
387
|
end
|
389
388
|
end
|
data/spec/cli_spec.rb
CHANGED
@@ -53,7 +53,21 @@ describe Oddb2xml::Cli do
|
|
53
53
|
@cli_output = buildr_capture(:stdout) { @cli.run }
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
56
|
+
context 'when -o fi option is given' do
|
57
|
+
before(:all) do
|
58
|
+
cleanup_directories_before_run
|
59
|
+
options = Oddb2xml::Options.new
|
60
|
+
options.parser.parse!('-o fi'.split(' '))
|
61
|
+
@cli = Oddb2xml::Cli.new(options.opts)
|
62
|
+
# @cli_output = buildr_capture(:stdout) { @cli.run }
|
63
|
+
@cli.run
|
64
|
+
end
|
65
|
+
# it_behaves_like 'any interface for product'
|
66
|
+
it 'should have nonpharma option' do
|
67
|
+
@cli.should have_option(:fi => true)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
57
71
|
context 'when -t md option is given' do
|
58
72
|
before(:all) do
|
59
73
|
cleanup_directories_before_run
|
@@ -81,8 +95,13 @@ if true
|
|
81
95
|
]
|
82
96
|
expected.each{
|
83
97
|
|name|
|
84
|
-
|
85
|
-
expect(
|
98
|
+
tst_file = File.join(Oddb2xml::WorkDir, name)
|
99
|
+
expect(Dir.glob(tst_file).size).to eq 1
|
100
|
+
tst_size = File.size(tst_file)
|
101
|
+
if tst_size < 1024
|
102
|
+
puts "File #{name} is only #{tst_size} bytes long"
|
103
|
+
end
|
104
|
+
expect(tst_size).to be >= 400
|
86
105
|
}
|
87
106
|
end
|
88
107
|
it 'should produce a correct report' do
|
@@ -297,5 +316,4 @@ if true
|
|
297
316
|
end.to_a.length.should equal expected
|
298
317
|
end
|
299
318
|
end
|
300
|
-
end
|
301
319
|
end
|
File without changes
|
Binary file
|