oddb2xml 2.1.9 → 2.2.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.
- 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.
|