oddb2xml 2.1.9 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/Gemfile.lock +1 -1
- data/History.txt +5 -0
- data/lib/oddb2xml/builder.rb +59 -48
- data/lib/oddb2xml/cli.rb +28 -10
- data/lib/oddb2xml/downloader.rb +1 -1
- data/lib/oddb2xml/extractor.rb +17 -25
- data/lib/oddb2xml/version.rb +1 -1
- data/oddb2xml.gemspec +1 -0
- data/spec/builder_spec.rb +16 -12
- data/spec/cli_spec.rb +11 -0
- data/spec/downloader_spec.rb +0 -1
- data/spec/extractor_spec.rb +19 -17
- data/spec/spec_helper.rb +8 -8
- metadata +44 -44
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YjkyNzQ2MmMwZWY1NmM3MTIzNDBjZDA4MDUzMWU2YjllYTk4ZWYwNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
N2NhOTk0MWY5OTJjMGIwYjExYTUyNjQ4NzBmZTdmYmRmMDE4NGNkNw==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YjE0ZGU0MTlhNDhlODQ3MzU2ZGFkNDZmMTc5OTgwNzI3MTY4MDdmMjU1ZTZh
|
10
|
+
NjMyYmU3NmI2ZjQyMThkYjE3YjRkNzZkNWVmZGQ2ZTVlYjljNjY0YzM3NzNh
|
11
|
+
YTdiNmIwMmQzNjE3OWNjMjA1OTY0ZTUyODUxOTlkNzkxYmMzM2Y=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YWQyZTY3ZDU2ZWNhZWZkZjBkNjcyZWM2Yzg0MDViMzFhZTY0OTMyYjQ5MGNk
|
14
|
+
MzVhNTUxMzc0YzZiZjc3MDVmYTIwMWM0ZWY3MTEyNmE1MzhmNDhkOWNlODAx
|
15
|
+
MGY2ZWRkMmQ5M2ZhZjM0NTkwOWVmYTY5M2ZmOTkyNDEyMWVkOTY=
|
data/Gemfile.lock
CHANGED
data/History.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
=== 2.2.0 / 24.06.2015
|
2
|
+
|
3
|
+
* Use FixNum instead of String for EAN-keys into hashes
|
4
|
+
* Improved speed (oddb2xml -e takes now less than 1 hour here)
|
5
|
+
|
1
6
|
=== 2.1.9 / 24.06.2015
|
2
7
|
|
3
8
|
* Force version of rubyntlm to 0.5.0. Still warning: already initialized constant Net::NTLM::VERSION::MAJOR, but no error
|
data/lib/oddb2xml/builder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'nokogiri'
|
4
4
|
require 'oddb2xml/util'
|
@@ -98,9 +98,9 @@ module Oddb2xml
|
|
98
98
|
end
|
99
99
|
# add
|
100
100
|
@migel.values.compact.each do |migel|
|
101
|
-
next
|
101
|
+
next unless migel[:pharmacode]
|
102
102
|
entry = {
|
103
|
-
:ean => migel[:ean],
|
103
|
+
:ean => migel[:ean].to_i,
|
104
104
|
:pharmacode => migel[:pharmacode],
|
105
105
|
:stat_date => '',
|
106
106
|
:desc_de => migel[:desc_de],
|
@@ -120,7 +120,6 @@ module Oddb2xml
|
|
120
120
|
@infos_zur_rose.each{
|
121
121
|
|ean13, info|
|
122
122
|
nrItems += 1
|
123
|
-
Oddb2xml.log("prepare_articles: nrItems #{nrItems} nrAdded #{nrAdded} prices. Total #{@articles.size}") if nrItems % 100 == 0
|
124
123
|
pharmacode = info[:pharmacode]
|
125
124
|
if @pharmacode[pharmacode]
|
126
125
|
@pharmacode[pharmacode][:price] = info[:price]
|
@@ -129,7 +128,8 @@ module Oddb2xml
|
|
129
128
|
end
|
130
129
|
obj = {}
|
131
130
|
found = false
|
132
|
-
existing = @refdata.values.find{ |x| x[:ean].eql? ean13 }
|
131
|
+
# existing = @refdata.values.find{ |x| x[:ean].eql? ean13 }
|
132
|
+
existing = @refdata[ean13]
|
133
133
|
if existing
|
134
134
|
found = true
|
135
135
|
existing[:price] = info[:price]
|
@@ -190,7 +190,7 @@ module Oddb2xml
|
|
190
190
|
end
|
191
191
|
# ID is no longer fixed TAG (swissmedicNo8, swissmedicNo5, pharmacode)
|
192
192
|
# limitation.xml needs all duplicate entries by this keys.
|
193
|
-
limitations.uniq! {|lim| lim[:id] + lim[:code] + lim[:type] }
|
193
|
+
limitations.uniq! { |lim| lim[:id].to_s + lim[:code] + lim[:type] }
|
194
194
|
@limitations = limitations.sort_by {|lim| lim[:code] }
|
195
195
|
Oddb2xml.log("prepare_limitations done. Total #{@limitations.size} from #{@items.size} items")
|
196
196
|
end
|
@@ -217,9 +217,10 @@ module Oddb2xml
|
|
217
217
|
end
|
218
218
|
def prepare_products
|
219
219
|
unless @products
|
220
|
-
@products =
|
220
|
+
@products = {}
|
221
221
|
@refdata.each_pair do |ean13, item|
|
222
222
|
next if item and item.is_a?(Hash) and item[:atc_code] and /^Q/i.match(item[:atc_code])
|
223
|
+
next if item[:prodno] and @products[item[:prodno]]
|
223
224
|
obj = {
|
224
225
|
:seq => @items[ean13] ? @items[ean13] : @items[item[:ean]],
|
225
226
|
:pac => nil,
|
@@ -233,13 +234,13 @@ module Oddb2xml
|
|
233
234
|
:comp => '',
|
234
235
|
}
|
235
236
|
if obj[:ean] # via EAN-Code
|
236
|
-
obj[:no8] = obj[:ean][4..11]
|
237
|
+
obj[:no8] = obj[:ean].to_s[4..11]
|
237
238
|
end
|
238
239
|
if obj[:no8] and ppac = @packs[obj[:no8].intern] and # Packungen.xls
|
239
240
|
!ppac[:is_tier]
|
240
241
|
# If RefData does not have EAN
|
241
|
-
if obj[:ean].nil?
|
242
|
-
obj[:ean] = ppac[:ean].
|
242
|
+
if obj[:ean].nil?
|
243
|
+
obj[:ean] = ppac[:ean].to_i
|
243
244
|
end
|
244
245
|
# If RefData dose not have ATC-Code
|
245
246
|
if obj[:atc].nil? or obj[:atc].empty?
|
@@ -251,8 +252,12 @@ module Oddb2xml
|
|
251
252
|
obj[:sub] = ppac[:substance_swissmedic]
|
252
253
|
obj[:comp] = ppac[:composition_swissmedic]
|
253
254
|
end
|
254
|
-
if obj[:ean][0..3] == '7680'
|
255
|
-
|
255
|
+
if obj[:ean].to_s[0..3] == '7680'
|
256
|
+
if item[:prodno]
|
257
|
+
@products[item[:prodno]] = obj
|
258
|
+
else
|
259
|
+
@products[ean13] = obj
|
260
|
+
end
|
256
261
|
end
|
257
262
|
end
|
258
263
|
end
|
@@ -416,11 +421,11 @@ module Oddb2xml
|
|
416
421
|
_builder.to_xml
|
417
422
|
end
|
418
423
|
def add_missing_products_from_swissmedic
|
419
|
-
Oddb2xml.log "build_product add_missing_products_from_swissmedic. Starting"
|
424
|
+
Oddb2xml.log "build_product add_missing_products_from_swissmedic. Starting with #{@products.size} products and #{@packs.size} @packs"
|
420
425
|
ean13_to_product = {}
|
421
426
|
@products.each{
|
422
|
-
|obj|
|
423
|
-
ean13_to_product[
|
427
|
+
|ean13, obj|
|
428
|
+
ean13_to_product[ean13] = obj
|
424
429
|
}
|
425
430
|
ausgabe = File.open(File.join(WorkDir, 'missing_in_refdata.txt'), 'w+')
|
426
431
|
size_old = ean13_to_product.size
|
@@ -428,12 +433,13 @@ module Oddb2xml
|
|
428
433
|
Oddb2xml.log "build_product add_missing_products_from_swissmedic. Imported #{size_old} ean13_to_product from @products. Checking #{@packs.size} @packs"
|
429
434
|
@packs.each_with_index {
|
430
435
|
|de_idx, i|
|
431
|
-
|
436
|
+
ean = de_idx[1][:ean].to_i
|
437
|
+
next if @refdata[ean]
|
432
438
|
list_code = de_idx[1][:list_code]
|
433
439
|
next if list_code and /Tierarzneimittel/.match(list_code)
|
434
|
-
ean13_to_product[
|
440
|
+
ean13_to_product[ean] = de_idx[1]
|
435
441
|
@missing << de_idx[1]
|
436
|
-
ausgabe.puts "#{
|
442
|
+
ausgabe.puts "#{ean},#{de_idx[1][:sequence_name]}"
|
437
443
|
}
|
438
444
|
corrected_size = ean13_to_product.size
|
439
445
|
Oddb2xml.log "build_product add_missing_products_from_swissmedic. Added #{(corrected_size - size_old)} corrected_size #{corrected_size} size_old #{size_old} ean13_to_product."
|
@@ -449,18 +455,28 @@ module Oddb2xml
|
|
449
455
|
_builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
|
450
456
|
xml.doc.tag_suffix = @tag_suffix
|
451
457
|
datetime = Time.new.strftime('%FT%T%z')
|
458
|
+
emitted = []
|
452
459
|
xml.PRODUCT(XML_OPTIONS) {
|
453
460
|
list = []
|
454
461
|
length = 0
|
455
462
|
@missing.each do |obj|
|
456
463
|
next if /^Q/i.match(obj[:atc])
|
464
|
+
if obj[:prodno]
|
465
|
+
next if emitted.index(obj[:prodno])
|
466
|
+
emitted << obj[:prodno]
|
467
|
+
end
|
457
468
|
length += 1
|
458
469
|
xml.PRD('DT' => obj[:last_change]) {
|
459
|
-
ean = obj[:ean].
|
470
|
+
ean = obj[:ean].to_i
|
460
471
|
xml.GTIN ean
|
461
472
|
xml.PRODNO obj[:prodno] if obj[:prodno]
|
462
|
-
|
463
|
-
|
473
|
+
if refdata = @refdata[ean]
|
474
|
+
xml.DSCRD refdata[:desc_de]
|
475
|
+
xml.DSCRF refdata[:desc_fr]
|
476
|
+
else
|
477
|
+
xml.DSCRD obj[:sequence_name] if obj[:sequence_name]
|
478
|
+
xml.DSCRF obj[:sequence_name] if obj[:sequence_name]
|
479
|
+
end
|
464
480
|
xml.ATC obj[:atc_code] if obj[:atc_code] and !obj[:atc_code].empty?
|
465
481
|
xml.IT obj[:ith_swissmedic] if obj[:ith_swissmedic]
|
466
482
|
xml.CPT
|
@@ -470,30 +486,25 @@ module Oddb2xml
|
|
470
486
|
xml.CompositionSwissmedic obj[:composition_swissmedic] if obj[:composition_swissmedic]
|
471
487
|
}
|
472
488
|
end
|
473
|
-
@products.sort! { |a,b| a[:ean] <=> b[:ean] }
|
474
|
-
@products.each do |obj|
|
489
|
+
# @products.sort! { |a,b| a[:ean] <=> b[:ean] }
|
490
|
+
@products.each do |ean13, obj|
|
475
491
|
next if /^Q/i.match(obj[:atc])
|
476
492
|
seq = obj[:seq]
|
477
493
|
length += 1
|
478
494
|
xml.PRD('DT' => obj[:last_change]) {
|
479
|
-
ean = obj[:ean]
|
495
|
+
ean = obj[:ean]
|
480
496
|
xml.GTIN ean
|
481
|
-
ppac = ((_ppac = @packs[ean[4..11].intern] and !_ppac[:is_tier]) ? _ppac : {})
|
497
|
+
ppac = ((_ppac = @packs[ean.to_s[4..11].intern] and !_ppac[:is_tier]) ? _ppac : {})
|
482
498
|
unless ppac
|
483
499
|
ppac = @packs.find{|pac| pac.ean == ean }.first
|
484
500
|
end
|
485
501
|
xml.PRODNO ppac[:prodno] if ppac[:prodno] and !ppac[:prodno].empty?
|
486
|
-
if
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
xml.send(elem, seq[name] + ' ' + seq[desc])
|
493
|
-
elsif !seq[desc].empty?
|
494
|
-
xml.send(elem, [desc])
|
495
|
-
end
|
496
|
-
end
|
502
|
+
if refdata = @refdata[ean]
|
503
|
+
xml.DSCRD refdata[:desc_de]
|
504
|
+
xml.DSCRF refdata[:desc_fr]
|
505
|
+
else
|
506
|
+
xml.DSCRD obj[:sequence_name] if obj[:sequence_name]
|
507
|
+
xml.DSCRF obj[:sequence_name] if obj[:sequence_name]
|
497
508
|
end
|
498
509
|
#xml.BNAMD
|
499
510
|
#xml.BNAMF
|
@@ -734,7 +745,7 @@ module Oddb2xml
|
|
734
745
|
idx += 1
|
735
746
|
Oddb2xml.log "build_article #{idx} of #{@articles.size} articles" if idx % 500 == 0
|
736
747
|
item = @items[obj[:ean]]
|
737
|
-
pac,no8 = nil,obj[:ean][4..11] # BAG-XML(SL/LS)
|
748
|
+
pac,no8 = nil,obj[:ean].to_s[4..11] # BAG-XML(SL/LS)
|
738
749
|
pack_info = nil
|
739
750
|
pack_info = @packs[no8.intern] if no8 # info from Packungen.xlsx from swissmedic_info
|
740
751
|
ppac = nil # Packungen
|
@@ -743,7 +754,7 @@ module Oddb2xml
|
|
743
754
|
next if obj[:desc_de] and /ad us vet/i.match(obj[:desc_de])
|
744
755
|
|
745
756
|
pharma_code = obj[:pharmacode]
|
746
|
-
ean =
|
757
|
+
ean = 0 if sprintf('%013d', ean).match(/^000000/)
|
747
758
|
if obj[:seq]
|
748
759
|
pac = obj[:seq][:packages][obj[:pharmacode]]
|
749
760
|
pac = obj[:seq][:packages][ean] unless pac
|
@@ -759,7 +770,7 @@ module Oddb2xml
|
|
759
770
|
end
|
760
771
|
xml.ART('DT' => obj[:last_change] ? obj[:last_change] : '') {
|
761
772
|
xml.REF_DATA (obj[:refdata] || @migel[pharma_code]) ? '1' : '0'
|
762
|
-
xml.PHAR obj[:pharmacode]
|
773
|
+
xml.PHAR sprintf('%07d', obj[:pharmacode]) if obj[:pharmacode]
|
763
774
|
#xml.GRPCD
|
764
775
|
#xml.CDS01
|
765
776
|
#xml.CDS02
|
@@ -767,7 +778,7 @@ module Oddb2xml
|
|
767
778
|
xml.SMCAT ppac[:swissmedic_category] unless ppac[:swissmedic_category].empty?
|
768
779
|
end
|
769
780
|
if no8 and !no8.to_s.empty?
|
770
|
-
if ean and ean[0..3] == "7680"
|
781
|
+
if ean and ean.to_s[0..3] == "7680"
|
771
782
|
xml.SMNO no8.to_s
|
772
783
|
end
|
773
784
|
end
|
@@ -793,8 +804,8 @@ module Oddb2xml
|
|
793
804
|
xml.COOL 1 if @fridges.include?($1.to_s)
|
794
805
|
end
|
795
806
|
#xml.TEMP
|
796
|
-
if ean
|
797
|
-
flag = @flags[ean]
|
807
|
+
if ean
|
808
|
+
flag = @flags[ean.to_s]
|
798
809
|
# as same flag
|
799
810
|
xml.CDBG(flag ? 'Y' : 'N')
|
800
811
|
xml.BG(flag ? 'Y' : 'N')
|
@@ -852,7 +863,7 @@ module Oddb2xml
|
|
852
863
|
#xml.DEL
|
853
864
|
xml.ARTCOMP {
|
854
865
|
# use ean13(gln) as COMPNO
|
855
|
-
xml.COMPNO obj[:company_ean] if obj[:company_ean] and
|
866
|
+
xml.COMPNO obj[:company_ean] if obj[:company_ean] and obj[:company_ean].to_s.length > 1
|
856
867
|
#xml.ROLE
|
857
868
|
#xml.ARTNO1
|
858
869
|
#xml.ARTNO2
|
@@ -860,10 +871,10 @@ module Oddb2xml
|
|
860
871
|
}
|
861
872
|
xml.ARTBAR {
|
862
873
|
xml.CDTYP 'E13'
|
863
|
-
xml.BC /^9999
|
874
|
+
xml.BC /^9999|^0000|^0$/.match(ean.to_s) ? 0 : sprintf('%013d', ean)
|
864
875
|
xml.BCSTAT 'A' # P is alternative
|
865
876
|
#xml.PHAR2
|
866
|
-
} if ean
|
877
|
+
} if ean
|
867
878
|
#xml.ARTCH {
|
868
879
|
#xml.PHAR2
|
869
880
|
#xml.CHTYPE
|
@@ -981,7 +992,7 @@ module Oddb2xml
|
|
981
992
|
info_index[info[:monid]] = i
|
982
993
|
end
|
983
994
|
# prod
|
984
|
-
@products.each do |prod|
|
995
|
+
@products.each do |ean13, prod|
|
985
996
|
next unless prod[:seq] and prod[:seq][:packages]
|
986
997
|
seq = prod[:seq]
|
987
998
|
prod[:seq][:packages].each {
|
@@ -1084,7 +1095,7 @@ module Oddb2xml
|
|
1084
1095
|
# fallback via EAN
|
1085
1096
|
bag_entry_via_ean = @items.values.select do |i|
|
1086
1097
|
next unless i[:packages]
|
1087
|
-
i[:packages].values.select {|_pac| _pac[:ean] == de_idx[:ean] }.length != 0
|
1098
|
+
i[:packages].values.select {|_pac| _pac[:ean].to_s == de_idx[:ean].to_s }.length != 0
|
1088
1099
|
end.length
|
1089
1100
|
if bag_entry_via_ean > 0
|
1090
1101
|
10
|
@@ -1229,7 +1240,7 @@ module Oddb2xml
|
|
1229
1240
|
else
|
1230
1241
|
('0' * DAT_LEN[:ITHE])
|
1231
1242
|
end.to_i
|
1232
|
-
row << "%0#{DAT_LEN[:CEAN]}d" % (ean.match(/^000000/) ? 0 : ean.to_i)
|
1243
|
+
row << "%0#{DAT_LEN[:CEAN]}d" % (sprintf('%013d', ean).match(/^000000/) ? 0 : ean.to_i)
|
1233
1244
|
row << "%#{DAT_LEN[:CMWS]}s" % '2' # pharma
|
1234
1245
|
rows << row
|
1235
1246
|
end
|
data/lib/oddb2xml/cli.rb
CHANGED
@@ -90,7 +90,6 @@ module Oddb2xml
|
|
90
90
|
private
|
91
91
|
def build
|
92
92
|
Oddb2xml.log("Start build")
|
93
|
-
puts "#{File.basename(__FILE__)}:#{__LINE__}: @refdata_types.keys #{@refdata_types.keys}"
|
94
93
|
begin
|
95
94
|
# require 'pry'; binding.pry
|
96
95
|
@_files = {"calc"=>"oddb_calc.xml"} if @options[:calc] and not @options[:extended]
|
@@ -163,19 +162,24 @@ module Oddb2xml
|
|
163
162
|
begin # instead of Thread.new do
|
164
163
|
downloader = MedregbmDownloader.new(what)
|
165
164
|
str = downloader.download
|
165
|
+
Oddb2xml.log("SwissmedicInfoDownloader #{what} str #{str.size} bytes")
|
166
166
|
self.instance_variable_set(
|
167
167
|
"@#{var}".intern,
|
168
|
-
MedregbmExtractor.new(str, what).to_arry
|
168
|
+
items = MedregbmExtractor.new(str, what).to_arry
|
169
169
|
)
|
170
|
+
Oddb2xml.log("MedregbmExtractor #{what} added #{items.size} fachinfo")
|
171
|
+
items
|
170
172
|
end
|
171
173
|
when :fachinfo
|
172
174
|
begin # instead of Thread.new do
|
173
175
|
downloader = SwissmedicInfoDownloader.new
|
174
176
|
xml = downloader.download
|
177
|
+
Oddb2xml.log("SwissmedicInfoDownloader #{var} xml #{xml.size} bytes")
|
175
178
|
@mutex.synchronize do
|
176
179
|
hsh = SwissmedicInfoExtractor.new(xml).to_hash
|
177
180
|
@infos = hsh
|
178
181
|
Oddb2xml.log("SwissmedicInfoExtractor added #{@infos.size} fachinfo")
|
182
|
+
@infos
|
179
183
|
end
|
180
184
|
end
|
181
185
|
when :orphan, :fridge
|
@@ -183,34 +187,41 @@ module Oddb2xml
|
|
183
187
|
begin # instead of Thread.new do
|
184
188
|
downloader = SwissmedicDownloader.new(what)
|
185
189
|
bin = downloader.download
|
190
|
+
Oddb2xml.log("SwissmedicDownloader #{var} bin #{bin.size} bytes")
|
186
191
|
self.instance_variable_set(
|
187
192
|
"@#{var}".intern,
|
188
|
-
SwissmedicExtractor.new(bin, what).to_arry
|
193
|
+
items = SwissmedicExtractor.new(bin, what).to_arry
|
189
194
|
)
|
190
|
-
|
195
|
+
Oddb2xml.log("SwissmedicExtractor added #{items.size} #{var}. File #{bin} was #{File.size(bin)} bytes")
|
196
|
+
items
|
191
197
|
end
|
192
198
|
when :interaction
|
193
199
|
begin # instead of Thread.new do
|
194
200
|
downloader = EphaDownloader.new
|
195
201
|
str = downloader.download
|
202
|
+
Oddb2xml.log("EphaDownloader str #{str.size} bytes")
|
196
203
|
@mutex.synchronize do
|
197
204
|
@actions = EphaExtractor.new(str).to_arry
|
198
205
|
Oddb2xml.log("EphaExtractor added #{@actions.size} interactions")
|
206
|
+
@actions
|
199
207
|
end
|
200
208
|
end
|
201
209
|
when :migel
|
202
210
|
begin # instead of Thread.new do
|
203
211
|
downloader = MigelDownloader.new
|
204
212
|
bin = downloader.download
|
213
|
+
Oddb2xml.log("MigelDownloader bin #{bin.size} bytes")
|
205
214
|
@mutex.synchronize do
|
206
215
|
@migel = MigelExtractor.new(bin).to_hash
|
207
216
|
Oddb2xml.log("MigelExtractor added #{@migel.size} migel items")
|
217
|
+
@migel
|
208
218
|
end
|
209
219
|
end
|
210
220
|
when :package
|
211
221
|
begin # instead of Thread.new do
|
212
222
|
downloader = SwissmedicDownloader.new(:package, @options)
|
213
223
|
bin = downloader.download
|
224
|
+
Oddb2xml.log("SwissmedicDownloader bin #{bin.size} bytes")
|
214
225
|
@mutex.synchronize do
|
215
226
|
@packs = SwissmedicExtractor.new(bin, :package).to_hash
|
216
227
|
Oddb2xml.log("SwissmedicExtractor added #{@packs.size} packs from #{bin}")
|
@@ -221,38 +232,44 @@ module Oddb2xml
|
|
221
232
|
begin # instead of Thread.new do
|
222
233
|
downloader = BMUpdateDownloader.new
|
223
234
|
str = downloader.download
|
235
|
+
Oddb2xml.log("BMUpdateDownloader str #{str.size} bytes")
|
224
236
|
@mutex.synchronize do
|
225
237
|
@flags = BMUpdateExtractor.new(str).to_hash
|
226
238
|
Oddb2xml.log("BMUpdateExtractor added #{@flags.size} flags")
|
239
|
+
@flags
|
227
240
|
end
|
228
241
|
end
|
229
242
|
when :lppv
|
230
243
|
begin # instead of Thread.new do
|
231
244
|
downloader = LppvDownloader.new
|
232
245
|
str = downloader.download
|
246
|
+
Oddb2xml.log("LppvDownloader str #{str.size} bytes")
|
233
247
|
@mutex.synchronize do
|
234
248
|
@lppvs = LppvExtractor.new(str).to_hash
|
235
249
|
Oddb2xml.log("LppvExtractor added #{@lppvs.size} lppvs")
|
250
|
+
@lppvs
|
236
251
|
end
|
237
252
|
end
|
238
253
|
when :bag
|
239
254
|
begin # instead of Thread.new do
|
240
255
|
downloader = BagXmlDownloader.new(@options)
|
241
256
|
xml = downloader.download
|
257
|
+
Oddb2xml.log("BagXmlDownloader xml #{xml.size} bytes")
|
242
258
|
@mutex.synchronize do
|
243
259
|
hsh = BagXmlExtractor.new(xml).to_hash
|
244
260
|
@items = hsh
|
245
|
-
Oddb2xml.log("
|
261
|
+
Oddb2xml.log("BagXmlExtractor added #{@items.size} items.")
|
262
|
+
@items
|
246
263
|
end
|
247
264
|
end
|
248
265
|
when :zurrose
|
249
266
|
begin # instead of Thread.new do
|
250
267
|
downloader = ZurroseDownloader.new(@options, @options[:transfer_dat])
|
251
268
|
xml = downloader.download
|
252
|
-
Oddb2xml.log("
|
269
|
+
Oddb2xml.log("ZurroseDownloader xml #{xml.size} bytes")
|
253
270
|
@mutex.synchronize do
|
254
271
|
hsh = ZurroseExtractor.new(xml, @options[:extended]).to_hash
|
255
|
-
Oddb2xml.log("
|
272
|
+
Oddb2xml.log("ZurroseExtractor added #{hsh.size} items from xml with #{xml.size} bytes")
|
256
273
|
@infos_zur_rose = hsh
|
257
274
|
end
|
258
275
|
end
|
@@ -261,7 +278,7 @@ module Oddb2xml
|
|
261
278
|
downloader = RefdataDownloader.new(@options, type)
|
262
279
|
begin
|
263
280
|
xml = downloader.download
|
264
|
-
Oddb2xml.log("
|
281
|
+
Oddb2xml.log("RefdataDownloader #{type} xml #{xml.size} bytes")
|
265
282
|
xml
|
266
283
|
rescue SystemExit
|
267
284
|
@mutex.synchronize do
|
@@ -274,7 +291,8 @@ module Oddb2xml
|
|
274
291
|
@mutex.synchronize do
|
275
292
|
hsh = RefdataExtractor.new(xml, type).to_hash
|
276
293
|
@refdata_types[type] = hsh
|
277
|
-
Oddb2xml.log("
|
294
|
+
Oddb2xml.log("RefdataExtractor #{type} added #{hsh.size} keys now #{@refdata_types.keys} items from xml with #{xml.size} bytes")
|
295
|
+
@refdata_types[type]
|
278
296
|
end
|
279
297
|
end
|
280
298
|
end
|
@@ -332,7 +350,7 @@ module Oddb2xml
|
|
332
350
|
if @refdata_types[type]
|
333
351
|
indices = @refdata_types[type].values.flatten.length
|
334
352
|
if type == :nonpharma
|
335
|
-
migel_xls = @migel.values.compact.select{|m| !m[:pharmacode]
|
353
|
+
migel_xls = @migel.values.compact.select{|m| !m[:pharmacode]}.map{|m| m[:pharmacode] }
|
336
354
|
nonpharmas = @refdata_types[type].keys
|
337
355
|
indices += (migel_xls - nonpharmas).length # ignore duplicates, null
|
338
356
|
lines << sprintf("\tNonPharma products: %i", indices)
|
data/lib/oddb2xml/downloader.rb
CHANGED
@@ -202,7 +202,7 @@ module Oddb2xml
|
|
202
202
|
end
|
203
203
|
end
|
204
204
|
content = read_xml_from_zip(/Preparations.xml/, File.join(Downloads, File.basename(file)))
|
205
|
-
FileUtils.rm_f(file, :verbose => false) unless defined?(
|
205
|
+
FileUtils.rm_f(file, :verbose => false) unless defined?(RSpec)
|
206
206
|
content
|
207
207
|
end
|
208
208
|
end
|
data/lib/oddb2xml/extractor.rb
CHANGED
@@ -27,13 +27,6 @@ module Oddb2xml
|
|
27
27
|
def initialize(xml)
|
28
28
|
@xml = xml
|
29
29
|
end
|
30
|
-
def correct_code(pharmacode, length=7)
|
31
|
-
if pharmacode.length != length # restore zero at the beginnig
|
32
|
-
("%0#{length}i" % pharmacode.to_i)
|
33
|
-
else
|
34
|
-
pharmacode
|
35
|
-
end
|
36
|
-
end
|
37
30
|
end
|
38
31
|
class BMUpdateExtractor < Extractor
|
39
32
|
include TxtExtractorMethods
|
@@ -79,11 +72,10 @@ module Oddb2xml
|
|
79
72
|
item[:pharmacodes] = []
|
80
73
|
item[:packages] = {} # pharmacode => package
|
81
74
|
seq.Packs.Pack.each do |pac|
|
82
|
-
phar = pac.Pharmacode
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
search_key = phar.to_i != 0 ? phar : ean
|
75
|
+
phar = pac.Pharmacode.to_i
|
76
|
+
ean = pac.GTIN.to_i
|
77
|
+
# search_key = phar.to_i != 0 ? phar : ean
|
78
|
+
search_key = ean != 0 ? ean : phar
|
87
79
|
# as common key with RefData Pharma/NonPharma data
|
88
80
|
item[:pharmacodes] << phar
|
89
81
|
# packages
|
@@ -141,7 +133,7 @@ module Oddb2xml
|
|
141
133
|
end
|
142
134
|
if id.empty? or id == '0'
|
143
135
|
key = :pharmacode
|
144
|
-
id = phar.
|
136
|
+
id = phar.to_i
|
145
137
|
end
|
146
138
|
lims.each do |lim|
|
147
139
|
limitation = {
|
@@ -191,16 +183,16 @@ module Oddb2xml
|
|
191
183
|
item = {}
|
192
184
|
item[:refdata] = true
|
193
185
|
item[:_type] = (typ = pac.ATYPE.downcase.to_sym) ? typ: ''
|
194
|
-
item[:ean] = (gtin = pac.GTIN) ? gtin:
|
195
|
-
item[:pharmacode] = (phar = pac.PHAR) ? phar:
|
186
|
+
item[:ean] = (gtin = pac.GTIN.to_i) ? gtin: 0
|
187
|
+
item[:pharmacode] = (phar = pac.PHAR.to_i) ? phar: 0
|
196
188
|
item[:last_change] = (date = Time.parse(pac.DT).to_s) ? date: '' # Date and time of last data change
|
197
189
|
item[:desc_de] = (dscr = pac.NAME_DE) ? dscr: ''
|
198
190
|
item[:desc_fr] = (dscr = pac.NAME_FR) ? dscr: ''
|
199
191
|
item[:atc_code] = (code = pac.ATC) ? code.to_s : ''
|
200
192
|
item[:company_name] = (nam = pac.AUTH_HOLDER_NAME) ? nam: ''
|
201
193
|
item[:company_ean] = (gln = pac.AUTH_HOLDER_GLN) ? gln: ''
|
202
|
-
unless item[:pharmacode]
|
203
|
-
item[:pharmacode] =
|
194
|
+
unless item[:pharmacode]
|
195
|
+
item[:pharmacode] = phar
|
204
196
|
unless data[item[:pharmacode]] # pharmacode => GTINs
|
205
197
|
data[item[:ean]] = []
|
206
198
|
end
|
@@ -322,18 +314,18 @@ module Oddb2xml
|
|
322
314
|
data = {}
|
323
315
|
@sheet.each_with_index do |row, i|
|
324
316
|
next if i.zero?
|
325
|
-
phar =
|
326
|
-
ean = row[0].to_i
|
327
|
-
ean =
|
317
|
+
phar = row[1].to_i
|
318
|
+
ean = row[0].to_i
|
319
|
+
ean = phar unless ean.to_s.length == 13
|
328
320
|
data[ean] = {
|
329
321
|
:refdata => true,
|
330
322
|
:ean => ean,
|
331
|
-
:pharmacode => phar,
|
323
|
+
:pharmacode => phar.to_i,
|
332
324
|
:desc_de => row[3],
|
333
325
|
:desc_fr => row[4],
|
334
326
|
:quantity => row[5], # quantity
|
335
327
|
:company_name => row[6],
|
336
|
-
:company_ean => row[7].to_i
|
328
|
+
:company_ean => row[7].to_i,
|
337
329
|
}
|
338
330
|
end
|
339
331
|
data
|
@@ -476,12 +468,12 @@ module Oddb2xml
|
|
476
468
|
else
|
477
469
|
next unless line =~ /(7680\d{9})(\d{1})$/
|
478
470
|
end
|
479
|
-
pharma_code = line[3..9]
|
471
|
+
pharma_code = line[3..9].to_i
|
480
472
|
if $1.to_s == '0000000000000'
|
481
473
|
@@items_without_ean13s += 1
|
482
|
-
ean13 =
|
474
|
+
ean13 = pharma_code # dummy ean13
|
483
475
|
else
|
484
|
-
ean13 = $1.
|
476
|
+
ean13 = $1.to_i
|
485
477
|
end
|
486
478
|
if data[ean13]
|
487
479
|
@@error_file.puts "Duplicate ean13 #{ean13} in line \nact: #{line.chomp}\norg: #{data[ean13][:line]}"
|
data/lib/oddb2xml/version.rb
CHANGED
data/oddb2xml.gemspec
CHANGED
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 = true
|
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
|
@@ -113,6 +113,7 @@ end
|
|
113
113
|
def checkAndGetProductWithGTIN(doc, gtin)
|
114
114
|
products = XPath.match( doc, "//PRD[GTIN=#{gtin.to_s}]")
|
115
115
|
gtins = XPath.match( doc, "//PRD[GTIN=#{gtin.to_s}]/GTIN")
|
116
|
+
binding.pry unless gtins.size == 1
|
116
117
|
gtins.size.should eq 1
|
117
118
|
gtins.first.text.should eq gtin.to_s
|
118
119
|
# return product
|
@@ -176,8 +177,8 @@ def checkProductXml
|
|
176
177
|
doc = REXML::Document.new IO.read(product_filename)
|
177
178
|
desitin = checkAndGetProductWithGTIN(doc, Oddb2xml::LEVETIRACETAM_GTIN)
|
178
179
|
desitin.elements['ATC'].text.should == 'N03AX14'
|
179
|
-
desitin.elements['DSCRD'].text.should == "
|
180
|
-
desitin.elements['DSCRF'].text.should == '
|
180
|
+
desitin.elements['DSCRD'].text.should == "LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk"
|
181
|
+
desitin.elements['DSCRF'].text.should == 'LEVETIRACETAM DESITIN mini cpr pel 250 mg 30 pce'
|
181
182
|
desitin.elements['PRODNO'].text.should eq '620691'
|
182
183
|
desitin.elements['IT'].text.should eq '01.07.1.'
|
183
184
|
desitin.elements['PackGrSwissmedic'].text.should eq '30'
|
@@ -208,11 +209,9 @@ end
|
|
208
209
|
|
209
210
|
describe Oddb2xml::Builder do
|
210
211
|
NrExtendedArticles = 86
|
211
|
-
NrNonPharmaArticles = 66
|
212
|
-
NrPharmaArticles = 8
|
213
212
|
NrSubstances = 12
|
214
|
-
NrProdno =
|
215
|
-
NrPackages =
|
213
|
+
NrProdno = 19
|
214
|
+
NrPackages = 20
|
216
215
|
RegExpDesitin = /1125819012LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk/
|
217
216
|
include ServerMockHelper
|
218
217
|
def common_run_init
|
@@ -333,7 +332,11 @@ end
|
|
333
332
|
options = Oddb2xml::Options.new
|
334
333
|
options.parser.parse!('-e'.split(' '))
|
335
334
|
Oddb2xml::Cli.new(options.opts)
|
336
|
-
|
335
|
+
if RUN_ALL
|
336
|
+
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
|
337
|
+
else
|
338
|
+
Oddb2xml::Cli.new(options.opts).run
|
339
|
+
end
|
337
340
|
end
|
338
341
|
|
339
342
|
it 'should emit a correct oddb_article.xml' do
|
@@ -345,9 +348,9 @@ end
|
|
345
348
|
end
|
346
349
|
|
347
350
|
it 'should report correct output on stdout' do
|
348
|
-
@res.should match(
|
349
|
-
@res.should match(
|
350
|
-
end
|
351
|
+
@res.should match(/\sPharma products: \d+/)
|
352
|
+
@res.should match(/\sNonPharma products: \d+/)
|
353
|
+
end if RUN_ALL
|
351
354
|
|
352
355
|
it 'should contain the correct (normal) prices' do
|
353
356
|
checkPrices(false)
|
@@ -359,7 +362,7 @@ end
|
|
359
362
|
checkItemForRefdata(doc, "1699947", 1) # 3TC Filmtabl 150 mg SMNO 53662013 IKSNR 53‘662, 53‘663
|
360
363
|
checkItemForRefdata(doc, "0598003", 0) # SOFRADEX Gtt Auric 8 ml
|
361
364
|
checkItemForRefdata(doc, "5366964", 1) # 1-DAY ACUVUE moist jour
|
362
|
-
novopen = checkItemForRefdata(doc, "3036984",
|
365
|
+
novopen = checkItemForRefdata(doc, "3036984", 1) # NovoPen 4 Injektionsgerät blue In NonPharma (a MiGel product)
|
363
366
|
expect(novopen.elements['ARTBAR/BC'].text).to eq '0'
|
364
367
|
end
|
365
368
|
|
@@ -388,6 +391,7 @@ end
|
|
388
391
|
XPath.match( doc, "//PHAR" ).find_all{|x| x.text.match('5366964') }.size.should == 1
|
389
392
|
dscrds.size.should == NrExtendedArticles
|
390
393
|
XPath.match( doc, "//PRODNO" ).find_all{|x| true}.size.should >= 1
|
394
|
+
XPath.match( doc, "//PRODNO" ).find_all{|x| x.text.match('002771') }.size.should == 0
|
391
395
|
XPath.match( doc, "//PRODNO" ).find_all{|x| x.text.match('620691') }.size.should == 1
|
392
396
|
end
|
393
397
|
|
data/spec/cli_spec.rb
CHANGED
@@ -44,6 +44,16 @@ describe Oddb2xml::Cli do
|
|
44
44
|
cleanup_compressor
|
45
45
|
end
|
46
46
|
|
47
|
+
context 'when -x address option is given' do
|
48
|
+
before(:all) do
|
49
|
+
cleanup_directories_before_run
|
50
|
+
options = Oddb2xml::Options.new
|
51
|
+
options.parser.parse!('-e --log'.split(' '))
|
52
|
+
@cli = Oddb2xml::Cli.new(options.opts)
|
53
|
+
@cli_output = buildr_capture(:stdout) { @cli.run }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
if true
|
47
57
|
context 'when -t md option is given' do
|
48
58
|
before(:all) do
|
49
59
|
cleanup_directories_before_run
|
@@ -288,3 +298,4 @@ describe Oddb2xml::Cli do
|
|
288
298
|
end
|
289
299
|
end
|
290
300
|
end
|
301
|
+
end
|
data/spec/downloader_spec.rb
CHANGED
@@ -140,7 +140,6 @@ if true
|
|
140
140
|
puts "#{Time.now}: URI was #{i.request.uri}"
|
141
141
|
m = /filename=.([^\d]+)/.match(i.response.headers['Content-Disposition'][0])
|
142
142
|
puts "#{Time.now}: SwissmedicDownloader #{m[1]} (#{i.response.body.size} bytes)."
|
143
|
-
# binding.pry
|
144
143
|
if m and true
|
145
144
|
name = m[1].chomp('_')
|
146
145
|
swissmedic_dir = File.join(Oddb2xml::WorkDir, 'swissmedic')
|
data/spec/extractor_spec.rb
CHANGED
@@ -41,9 +41,10 @@ describe Oddb2xml::MigelExtractor do
|
|
41
41
|
after(:all) { VCR.eject_cassette }
|
42
42
|
it "should have at some items" do
|
43
43
|
expect(@items.size).not_to eq 0
|
44
|
-
expect(@items.find{|k,v|
|
44
|
+
expect(@items.find{|k,v| 3248410 == v[:pharmacode] }).not_to be_nil
|
45
45
|
expect(@items.find{|k,v| /Novopen/i.match(v[:desc_de]) }).not_to be_nil
|
46
|
-
expect(@items.find{|k,v|
|
46
|
+
expect(@items.find{|k,v| 3036984 == v[:pharmacode] }).not_to be_nil
|
47
|
+
expect(@items.find{|k,v| /Epimineral/i.match(v[:desc_de]) }).not_to be_nil
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
@@ -59,12 +60,12 @@ describe Oddb2xml::RefdataExtractor do
|
|
59
60
|
|
60
61
|
it "should have correct info for pharmacode 1699947 correctly" do
|
61
62
|
@pharma_items = subject.to_hash
|
62
|
-
pharma_code_LEVETIRACETAM =
|
63
|
+
pharma_code_LEVETIRACETAM = 5819012
|
63
64
|
item_found = @pharma_items.values.find{ |x| x[:pharmacode].eql?(pharma_code_LEVETIRACETAM)}
|
64
65
|
expect(item_found).not_to be nil
|
65
66
|
expected = { :refdata=>true,
|
66
67
|
:_type=>:pharma,
|
67
|
-
:ean=> Oddb2xml::LEVETIRACETAM_GTIN,
|
68
|
+
:ean=> Oddb2xml::LEVETIRACETAM_GTIN.to_i,
|
68
69
|
:pharmacode=> pharma_code_LEVETIRACETAM,
|
69
70
|
:last_change => "2015-06-04 00:00:00 +0000",
|
70
71
|
:desc_de=>"LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk",
|
@@ -85,12 +86,12 @@ describe Oddb2xml::RefdataExtractor do
|
|
85
86
|
|
86
87
|
it "should have correct info for nonpharma with pharmacode 0058502 correctly" do
|
87
88
|
@non_pharma_items = subject.to_hash
|
88
|
-
pharma_code_TUBEGAZE =
|
89
|
+
pharma_code_TUBEGAZE = 58519
|
89
90
|
item_found = @non_pharma_items.values.find{ |x| x[:pharmacode].eql?(pharma_code_TUBEGAZE)}
|
90
91
|
expect(item_found).not_to be nil
|
91
92
|
expected = {:refdata=>true,
|
92
93
|
:_type=>:nonpharma,
|
93
|
-
:ean=>
|
94
|
+
:ean=>7611600441020,
|
94
95
|
:pharmacode=>pharma_code_TUBEGAZE,
|
95
96
|
:last_change => "2015-06-04 00:00:00 +0000",
|
96
97
|
:desc_de=>"TUBEGAZE Verband weiss Nr 12 20m Finger gross",
|
@@ -114,23 +115,24 @@ describe Oddb2xml::BagXmlExtractor do
|
|
114
115
|
end
|
115
116
|
it "should handle pub_price for 1699947 correctly" do
|
116
117
|
@items = subject.to_hash
|
117
|
-
with_pharma = @items[
|
118
|
+
with_pharma = @items[Oddb2xml::THREE_TC_GTIN]
|
118
119
|
expect(with_pharma).not_to be_nil
|
120
|
+
expect(with_pharma[:name_de]).to eq '3TC'
|
119
121
|
expect(with_pharma[:atc_code]).not_to be_nil
|
120
|
-
expect(with_pharma[:pharmacodes]).
|
122
|
+
expect(with_pharma[:pharmacodes]).to eq [1699947]
|
121
123
|
expect(with_pharma[:packages].size).to eq(1)
|
122
|
-
expect(with_pharma[:packages].first[0]).to eq(
|
124
|
+
expect(with_pharma[:packages].first[0]).to eq(Oddb2xml::THREE_TC_GTIN)
|
123
125
|
expect(with_pharma[:packages].first[1][:prices][:pub_price][:price]).to eq('205.3')
|
124
126
|
expect(@items.size).to eq(5)
|
125
127
|
end
|
126
128
|
it "should handle pub_price for 7680620690084 correctly" do
|
127
129
|
@items = subject.to_hash
|
128
|
-
no_pharma = @items[
|
130
|
+
no_pharma = @items[7680620690084]
|
129
131
|
expect(no_pharma).not_to be_nil
|
130
132
|
expect(no_pharma[:atc_code]).not_to be_nil
|
131
133
|
expect(no_pharma[:pharmacodes]).not_to be_nil
|
132
134
|
expect(no_pharma[:packages].size).to eq(1)
|
133
|
-
expect(no_pharma[:packages].first[0]).to eq(
|
135
|
+
expect(no_pharma[:packages].first[0]).to eq(7680620690084)
|
134
136
|
expect(no_pharma[:packages].first[1][:prices][:pub_price][:price]).to eq('27.8')
|
135
137
|
end
|
136
138
|
end
|
@@ -253,7 +255,7 @@ describe Oddb2xml::ZurroseExtractor do
|
|
253
255
|
Oddb2xml::ZurroseExtractor.new(dat)
|
254
256
|
end
|
255
257
|
it { expect(subject.to_hash.keys.length).to eq(1) }
|
256
|
-
it { expect(subject.to_hash.keys.first).to eq(
|
258
|
+
it { expect(subject.to_hash.keys.first).to eq(7680316440115) }
|
257
259
|
it { expect(subject.to_hash.values.first[:price]).to eq("8.95") }
|
258
260
|
end
|
259
261
|
context 'when Estradiol Creme is given' do
|
@@ -264,11 +266,11 @@ describe Oddb2xml::ZurroseExtractor do
|
|
264
266
|
Oddb2xml::ZurroseExtractor.new(dat)
|
265
267
|
end
|
266
268
|
it { expect(subject.to_hash.keys.length).to eq(1) }
|
267
|
-
it { expect(subject.to_hash.keys.first).to eq(
|
269
|
+
it { expect(subject.to_hash.keys.first).to eq(7680284070840) }
|
268
270
|
it { expect(subject.to_hash.values.first[:vat]).to eq("2") }
|
269
271
|
it { expect(subject.to_hash.values.first[:price]).to eq("9.40") }
|
270
272
|
it { expect(subject.to_hash.values.first[:pub_price]).to eq("16.30") }
|
271
|
-
it { expect(subject.to_hash.values.first[:pharmacode]).to eq(
|
273
|
+
it { expect(subject.to_hash.values.first[:pharmacode]).to eq(921929) }
|
272
274
|
end
|
273
275
|
context 'when SELSUN Shampoo is given' do
|
274
276
|
subject do
|
@@ -278,11 +280,11 @@ describe Oddb2xml::ZurroseExtractor do
|
|
278
280
|
Oddb2xml::ZurroseExtractor.new(dat)
|
279
281
|
end
|
280
282
|
it { expect(subject.to_hash.keys.length).to eq(1) }
|
281
|
-
it { expect(subject.to_hash.keys.first).to eq(
|
283
|
+
it { expect(subject.to_hash.keys.first).to eq(7680172330681) }
|
282
284
|
it { expect(subject.to_hash.values.first[:vat]).to eq("2") }
|
283
285
|
it { expect(subject.to_hash.values.first[:price]).to eq("15.76") }
|
284
286
|
it { expect(subject.to_hash.values.first[:pub_price]).to eq("24.30") }
|
285
|
-
it { expect(subject.to_hash.values.first[:pharmacode]).to eq(
|
287
|
+
it { expect(subject.to_hash.values.first[:pharmacode]).to eq(20652) }
|
286
288
|
it 'should set the correct SALECD cmut code' do expect(subject.to_hash.values.first[:cmut]).to eq("2") end
|
287
289
|
end
|
288
290
|
context 'when SOFRADEX is given' do
|
@@ -303,7 +305,7 @@ describe Oddb2xml::ZurroseExtractor do
|
|
303
305
|
DAT
|
304
306
|
Oddb2xml::ZurroseExtractor.new(dat, true)
|
305
307
|
end
|
306
|
-
it { expect(subject.to_hash.keys.first).to eq(
|
308
|
+
it { expect(subject.to_hash.keys.first).to eq(8807890) }
|
307
309
|
it "should set the correct SALECD cmut code" do expect(subject.to_hash.values.first[:cmut]).to eq("2") end
|
308
310
|
it "should set the correct SALECD description" do expect(subject.to_hash.values.first[:description]).to match(/Ethacridin lactat 1.+ 100ml/) end
|
309
311
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -65,23 +65,23 @@ module Oddb2xml
|
|
65
65
|
'7680555580054', # ZYVOXID
|
66
66
|
'7680620690084', # LEVETIRACETAM DESITIN Mini Filmtab 250 mg needed for extractor_spec.rb
|
67
67
|
] + GTINS_CALC
|
68
|
-
FERRO_GRADUMET_GTIN =
|
69
|
-
FIRST_DAY_ACUVUE_GTIN =
|
70
|
-
HIRUDOID_GTIN =
|
71
|
-
LANSOYL_GTIN =
|
68
|
+
FERRO_GRADUMET_GTIN = 7680316440115
|
69
|
+
FIRST_DAY_ACUVUE_GTIN = 733905577161
|
70
|
+
HIRUDOID_GTIN = 7680161050583
|
71
|
+
LANSOYL_GTIN = 7680324750190
|
72
72
|
LANSOYL_PRICE_RESELLER_PUB = 18.95
|
73
73
|
LANSOYL_PRICE_ZURROSE = 10.54
|
74
74
|
LANSOYL_PRICE_ZURROSEPUB = 16.25
|
75
|
-
LEVETIRACETAM_GTIN =
|
75
|
+
LEVETIRACETAM_GTIN = 7680620690084
|
76
76
|
LEVETIRACETAM_PRICE_PPUB = 27.8
|
77
77
|
LEVETIRACETAM_PRICE_ZURROSE = 13.49
|
78
78
|
LEVETIRACETAM_PRICE_RESELLER_PUB = 24.3
|
79
|
-
SOFRADEX_GTIN =
|
79
|
+
SOFRADEX_GTIN = 7680316950157
|
80
80
|
SOFRADEX_PRICE_RESELLER_PUB = 12.9
|
81
81
|
SOFRADEX_PRICE_ZURROSE = 7.18
|
82
82
|
SOFRADEX_PRICE_ZURROSEPUB = 15.45
|
83
|
-
THREE_TC_GTIN =
|
84
|
-
ZYVOXID_GTIN =
|
83
|
+
THREE_TC_GTIN = 7680536620137
|
84
|
+
ZYVOXID_GTIN = 7680555580054
|
85
85
|
|
86
86
|
GTINS_MEDREG = [
|
87
87
|
7601001380028, # Glarus
|
metadata
CHANGED
@@ -1,139 +1,139 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oddb2xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
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-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: archive-tar-minitar
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mechanize
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: nokogiri
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
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
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: savon
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ! '>='
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ! '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: spreadsheet
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ! '>='
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ! '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubyXL
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ! '>='
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ! '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: sax-machine
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ! '>='
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ! '>='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: parslet
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - ! '>='
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: '0'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - ! '>='
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
@@ -154,126 +154,126 @@ dependencies:
|
|
154
154
|
name: multi_json
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- -
|
157
|
+
- - ! '>='
|
158
158
|
- !ruby/object:Gem::Version
|
159
159
|
version: '0'
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - ! '>='
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: httpi
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
|
-
- -
|
171
|
+
- - ! '>='
|
172
172
|
- !ruby/object:Gem::Version
|
173
173
|
version: 2.4.1
|
174
174
|
type: :runtime
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
|
-
- -
|
178
|
+
- - ! '>='
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: 2.4.1
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: bundler
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
|
-
- -
|
185
|
+
- - ! '>='
|
186
186
|
- !ruby/object:Gem::Version
|
187
187
|
version: '0'
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
|
-
- -
|
192
|
+
- - ! '>='
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: rake
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
|
-
- -
|
199
|
+
- - ! '>='
|
200
200
|
- !ruby/object:Gem::Version
|
201
201
|
version: '0'
|
202
202
|
type: :development
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
|
-
- -
|
206
|
+
- - ! '>='
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: '0'
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: rspec
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
|
-
- -
|
213
|
+
- - ! '>='
|
214
214
|
- !ruby/object:Gem::Version
|
215
215
|
version: '0'
|
216
216
|
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
|
-
- -
|
220
|
+
- - ! '>='
|
221
221
|
- !ruby/object:Gem::Version
|
222
222
|
version: '0'
|
223
223
|
- !ruby/object:Gem::Dependency
|
224
224
|
name: webmock
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
226
226
|
requirements:
|
227
|
-
- -
|
227
|
+
- - ! '>='
|
228
228
|
- !ruby/object:Gem::Version
|
229
229
|
version: '0'
|
230
230
|
type: :development
|
231
231
|
prerelease: false
|
232
232
|
version_requirements: !ruby/object:Gem::Requirement
|
233
233
|
requirements:
|
234
|
-
- -
|
234
|
+
- - ! '>='
|
235
235
|
- !ruby/object:Gem::Version
|
236
236
|
version: '0'
|
237
237
|
- !ruby/object:Gem::Dependency
|
238
238
|
name: rdoc
|
239
239
|
requirement: !ruby/object:Gem::Requirement
|
240
240
|
requirements:
|
241
|
-
- -
|
241
|
+
- - ! '>='
|
242
242
|
- !ruby/object:Gem::Version
|
243
243
|
version: '0'
|
244
244
|
type: :development
|
245
245
|
prerelease: false
|
246
246
|
version_requirements: !ruby/object:Gem::Requirement
|
247
247
|
requirements:
|
248
|
-
- -
|
248
|
+
- - ! '>='
|
249
249
|
- !ruby/object:Gem::Version
|
250
250
|
version: '0'
|
251
251
|
- !ruby/object:Gem::Dependency
|
252
252
|
name: vcr
|
253
253
|
requirement: !ruby/object:Gem::Requirement
|
254
254
|
requirements:
|
255
|
-
- -
|
255
|
+
- - ! '>='
|
256
256
|
- !ruby/object:Gem::Version
|
257
257
|
version: '0'
|
258
258
|
type: :development
|
259
259
|
prerelease: false
|
260
260
|
version_requirements: !ruby/object:Gem::Requirement
|
261
261
|
requirements:
|
262
|
-
- -
|
262
|
+
- - ! '>='
|
263
263
|
- !ruby/object:Gem::Version
|
264
264
|
version: '0'
|
265
265
|
- !ruby/object:Gem::Dependency
|
266
266
|
name: timecop
|
267
267
|
requirement: !ruby/object:Gem::Requirement
|
268
268
|
requirements:
|
269
|
-
- -
|
269
|
+
- - ! '>='
|
270
270
|
- !ruby/object:Gem::Version
|
271
271
|
version: '0'
|
272
272
|
type: :development
|
273
273
|
prerelease: false
|
274
274
|
version_requirements: !ruby/object:Gem::Requirement
|
275
275
|
requirements:
|
276
|
-
- -
|
276
|
+
- - ! '>='
|
277
277
|
- !ruby/object:Gem::Version
|
278
278
|
version: '0'
|
279
279
|
description: oddb2xml creates xml files using swissINDEX, BAG-XML and Swissmedic.
|
@@ -283,9 +283,9 @@ executables:
|
|
283
283
|
extensions: []
|
284
284
|
extra_rdoc_files: []
|
285
285
|
files:
|
286
|
-
-
|
287
|
-
-
|
288
|
-
-
|
286
|
+
- .gitignore
|
287
|
+
- .rspec
|
288
|
+
- .travis.yml
|
289
289
|
- Gemfile
|
290
290
|
- Gemfile.lock
|
291
291
|
- History.txt
|
@@ -376,17 +376,17 @@ require_paths:
|
|
376
376
|
- lib
|
377
377
|
required_ruby_version: !ruby/object:Gem::Requirement
|
378
378
|
requirements:
|
379
|
-
- -
|
379
|
+
- - ! '>='
|
380
380
|
- !ruby/object:Gem::Version
|
381
381
|
version: '0'
|
382
382
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
383
383
|
requirements:
|
384
|
-
- -
|
384
|
+
- - ! '>='
|
385
385
|
- !ruby/object:Gem::Version
|
386
386
|
version: '0'
|
387
387
|
requirements: []
|
388
388
|
rubyforge_project:
|
389
|
-
rubygems_version: 2.
|
389
|
+
rubygems_version: 2.3.0
|
390
390
|
signing_key:
|
391
391
|
specification_version: 4
|
392
392
|
summary: oddb2xml creates xml files.
|