oddb2xml 2.5.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Elexis_Artikelstamm_v003.xsd +387 -0
- data/Elexis_Artikelstamm_v5.xsd +513 -0
- data/Gemfile +2 -6
- data/History.txt +11 -0
- data/README.md +35 -27
- data/artikelstamm.md +68 -0
- data/bin/compare_v5 +41 -0
- data/bin/oddb2xml +3 -15
- data/data/article_overrides.yaml +51859 -0
- data/data/gtin2ignore.yaml +30510 -0
- data/data/product_overrides.yaml +4 -0
- data/lib/oddb2xml/builder.rb +543 -192
- data/lib/oddb2xml/cli.rb +82 -62
- data/lib/oddb2xml/compare.rb +189 -0
- data/lib/oddb2xml/compressor.rb +6 -3
- data/lib/oddb2xml/downloader.rb +79 -64
- data/lib/oddb2xml/extractor.rb +67 -40
- data/lib/oddb2xml/options.rb +76 -77
- data/lib/oddb2xml/parslet_compositions.rb +18 -1
- data/lib/oddb2xml/util.rb +25 -3
- data/lib/oddb2xml/version.rb +1 -1
- data/oddb2xml.gemspec +8 -5
- data/oddb2xml.xsd +1 -0
- data/spec/artikelstamm_spec.rb +383 -0
- data/spec/builder_spec.rb +147 -118
- data/spec/calc_spec.rb +3 -15
- data/spec/cli_spec.rb +24 -35
- data/spec/compare_spec.rb +24 -0
- data/spec/compressor_spec.rb +1 -3
- data/spec/data/Elexis_Artikelstamm_v5.xsd +513 -0
- data/spec/data/Preparations.xml +2200 -0
- data/spec/data/Publications.xls +0 -0
- data/spec/data/artikelstamm_N_010917.xml +39 -0
- data/spec/data/artikelstamm_N_011217.xml +17 -0
- data/spec/data/artikelstamm_P_010917.xml +86 -0
- data/spec/data/artikelstamm_P_011217.xml +63 -0
- data/spec/data/oddb2xml_files_lppv.txt +2 -0
- data/spec/data/refdata_NonPharma.xml +38 -0
- data/spec/data/refdata_Pharma.xml +220 -0
- data/spec/data/swissmedic_orphan.xlsx +0 -0
- data/spec/data/swissmedic_package.xlsx +0 -0
- data/spec/data/transfer.dat +59 -19
- data/spec/data/v5_first.xml +102 -0
- data/spec/data/v5_second.xml +184 -0
- data/spec/data_helper.rb +72 -0
- data/spec/downloader_spec.rb +19 -27
- data/spec/extractor_spec.rb +27 -33
- data/spec/fixtures/vcr_cassettes/artikelstamm.json +1 -0
- data/spec/options_spec.rb +73 -66
- data/spec/spec_helper.rb +73 -24
- data/test_options.rb +4 -2
- metadata +100 -21
- data/spec/data/XMLPublications.zip +0 -0
- data/spec/data/compressor/oddb_article.xml +0 -0
- data/spec/data/compressor/oddb_fi.xml +0 -0
- data/spec/data/compressor/oddb_fi_product.xml +0 -0
- data/spec/data/compressor/oddb_limitation.xml +0 -0
- data/spec/data/compressor/oddb_product.xml +0 -0
- data/spec/data/compressor/oddb_substance.xml +0 -0
data/spec/builder_spec.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
require "rexml/document"
|
5
|
+
require 'webmock/rspec'
|
5
6
|
include REXML
|
6
7
|
RUN_ALL = true
|
7
8
|
|
@@ -28,7 +29,7 @@ ARTICLE_MISSING_ELEMENTS = [
|
|
28
29
|
|
29
30
|
ARTICLE_ZURROSE_ELEMENTS = [
|
30
31
|
['ARTICLE/ART/REF_DATA', '0'],
|
31
|
-
['ARTICLE/ART/ARTCOMP/COMPNO', '
|
32
|
+
['ARTICLE/ART/ARTCOMP/COMPNO', '7601001000896'],
|
32
33
|
['ARTICLE/ART/ARTPRI/PTYP', 'PEXF'],
|
33
34
|
['ARTICLE/ART/ARTPRI/PTYP', 'PPUB'],
|
34
35
|
['ARTICLE/ART/ARTPRI/PTYP', 'ZURROSE'],
|
@@ -37,6 +38,28 @@ ARTICLE_ZURROSE_ELEMENTS = [
|
|
37
38
|
['ARTICLE/ART/ARTINS/NINCD', '20'],
|
38
39
|
]
|
39
40
|
|
41
|
+
ARTICLE_NAROPIN = %(<REF_DATA>1</REF_DATA>
|
42
|
+
<PHAR>1882189</PHAR>
|
43
|
+
<SMCAT>B</SMCAT>
|
44
|
+
<SMNO>54015011</SMNO>
|
45
|
+
<PRODNO>5401501</PRODNO>
|
46
|
+
<SALECD>I</SALECD>
|
47
|
+
<CDBG>N</CDBG>
|
48
|
+
<BG>N</BG>
|
49
|
+
<DSCRD>NAROPIN Inj Lös 0.2 % 10ml Duofit Amp 5 Stk</DSCRD>
|
50
|
+
<DSCRF>NAROPIN sol inj 0.2 % 10ml amp duofit 5 pce</DSCRF>
|
51
|
+
<SORTD>NAROPIN INJ LÖS 0.2 % 10ML DUOFIT AMP 5 STK</SORTD>
|
52
|
+
<SORTF>NAROPIN SOL INJ 0.2 % 10ML AMP DUOFIT 5 PCE</SORTF>
|
53
|
+
<ARTCOMP>
|
54
|
+
<COMPNO>7601001402539</COMPNO>
|
55
|
+
</ARTCOMP>
|
56
|
+
<ARTBAR>
|
57
|
+
<CDTYP>E13</CDTYP>
|
58
|
+
<BC>7680540150118</BC>
|
59
|
+
<BCSTAT>A</BCSTAT>
|
60
|
+
</ARTBAR>
|
61
|
+
</ART>)
|
62
|
+
|
40
63
|
ARTICLE_COMMON_ELEMENTS = [
|
41
64
|
['ARTICLE/ART/REF_DATA', '1'],
|
42
65
|
['ARTICLE/ART/SMCAT', 'A'],
|
@@ -59,10 +82,6 @@ ARTICLE_COMMON_ELEMENTS = [
|
|
59
82
|
['ARTICLE/ART/BG', 'N'],
|
60
83
|
['ARTICLE/ART/ARTBAR/BC', Oddb2xml::ORPHAN_GTIN.to_s],
|
61
84
|
['ARTICLE/ART/ARTBAR/BC', Oddb2xml::FRIDGE_GTIN.to_s],
|
62
|
-
['ARTICLE/ART/DSCRD', 'NAROPIN Inj Lös 0.2 % 5 Polybag 100 ml'],
|
63
|
-
['ARTICLE/ART/DSCRF', 'NAROPIN sol inj 0.2 % 5 polybag 100 ml'],
|
64
|
-
['ARTICLE/ART/SORTD', 'NAROPIN INJ LÖS 0.2 % 5 POLYBAG 100 ML'],
|
65
|
-
['ARTICLE/ART/SORTF', 'NAROPIN SOL INJ 0.2 % 5 POLYBAG 100 ML'],
|
66
85
|
['ARTICLE/ART/SYN1D', 'Hirudoid'],
|
67
86
|
['ARTICLE/ART/SYN1F', 'Hirudoid'],
|
68
87
|
['ARTICLE/ART/SLOPLUS', '2'],
|
@@ -226,12 +245,18 @@ MEDIZINALPERSON_ELEMENT_TESTS = [
|
|
226
245
|
['Personen/Person/BTM_Berechtigung', 'BTM_Berechtigung'],
|
227
246
|
]
|
228
247
|
|
229
|
-
def check_result(
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
248
|
+
def check_result(inhalt, nbr_record)
|
249
|
+
[ "<NBR_RECORD>",
|
250
|
+
"<OK_ERROR>",
|
251
|
+
'<OK_ERROR>OK</OK_ERROR>',
|
252
|
+
].each do |what|
|
253
|
+
expect(inhalt.scan(what).size).to eq 1
|
254
|
+
end
|
255
|
+
expect(inhalt.index('<OK_ERROR>OK</OK_ERROR>')).to be > 0
|
256
|
+
expect(inhalt.index('<ERROR_CODE/>')).to be > 0
|
257
|
+
m = /<NBR_RECORD>(\d+)<\/NBR_RECORD>/.match(inhalt)
|
258
|
+
expect(m).not_to be nil
|
259
|
+
expect(m[1].to_i).to eq nbr_record
|
235
260
|
end
|
236
261
|
|
237
262
|
def checkItemForRefdata(doc, pharmacode, isRefdata)
|
@@ -292,27 +317,29 @@ def check_article_IGM_format(line, price_kendural=825, add_80_percents=false)
|
|
292
317
|
return [found_SL, found_non_SL]
|
293
318
|
end
|
294
319
|
|
320
|
+
def validate_via_xsd(xsd_file, xml_file)
|
321
|
+
xsd =open(xsd_file).read
|
322
|
+
xsd_rtikelstamm_xml = Nokogiri::XML::Schema(xsd)
|
323
|
+
doc = Nokogiri::XML(File.read(xml_file))
|
324
|
+
xsd_rtikelstamm_xml.validate(doc).each do
|
325
|
+
|error|
|
326
|
+
if error.message
|
327
|
+
puts "Failed validating #{xml_file} with #{File.size(xml_file)} bytes using XSD from #{xsd_file}"
|
328
|
+
puts "CMD: xmllint --noout --schema #{xsd_file} #{xml_file}"
|
329
|
+
end
|
330
|
+
msg = "expected #{error.message} to be nil\nfor #{xml_file}"
|
331
|
+
puts msg
|
332
|
+
expect(error.message).to be_nil, msg
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
295
336
|
def check_validation_via_xsd
|
296
|
-
@oddb2xml_xsd = File.expand_path(File.join(File.dirname(__FILE__), '..', 'oddb2xml.xsd'))
|
297
|
-
@oddb_calc_xsd = File.expand_path(File.join(File.dirname(__FILE__), '..', 'oddb_calc.xsd'))
|
298
|
-
expect(File.exists?(@oddb2xml_xsd)).to eq true
|
299
|
-
expect(File.exists?(@oddb_calc_xsd)).to eq true
|
300
337
|
files = Dir.glob('*.xml')
|
301
|
-
xsd_oddb2xml = Nokogiri::XML::Schema(File.read(@oddb2xml_xsd))
|
302
|
-
xsd_oddb_calc = Nokogiri::XML::Schema(File.read(@oddb_calc_xsd))
|
303
338
|
files.each{
|
304
339
|
|file|
|
305
340
|
next if /#{Time.now.year}/.match(file)
|
306
|
-
|
307
|
-
xsd2use
|
308
|
-
xsd2use.validate(doc).each do
|
309
|
-
|error|
|
310
|
-
if error.message
|
311
|
-
puts "Failed validating #{file} with #{File.size(file)} bytes using XSD from #{@oddb2xml_xsd}"
|
312
|
-
puts "cmd would be: xsdvalidate #{@oddb2xml_xsd} #{file}"
|
313
|
-
end
|
314
|
-
expect(error.message).to be_nil, "expected #{error.message} to be nil\nfor #{file} content \n#{File.read(file)}"
|
315
|
-
end
|
341
|
+
xsd2use = /oddb_calc/.match(file) ? @oddb_calc_xsd : @oddb2xml_xsd
|
342
|
+
validate_via_xsd(xsd2use, File.expand_path(file))
|
316
343
|
}
|
317
344
|
end
|
318
345
|
|
@@ -352,7 +379,6 @@ end
|
|
352
379
|
def checkAndGetProductWithGTIN(doc, gtin)
|
353
380
|
products = XPath.match( doc, "//PRD[GTIN=#{gtin.to_s}]")
|
354
381
|
gtins = XPath.match( doc, "//PRD[GTIN=#{gtin.to_s}]/GTIN")
|
355
|
-
binding.pry unless gtins.size == 1
|
356
382
|
expect(gtins.size).to eq 1
|
357
383
|
expect(gtins.first.text).to eq gtin.to_s
|
358
384
|
# return product
|
@@ -378,6 +404,7 @@ def checkArticleXml(checkERYTHROCIN = true)
|
|
378
404
|
|
379
405
|
desitin = checkAndGetArticleWithGTIN(doc, Oddb2xml::LEVETIRACETAM_GTIN)
|
380
406
|
expect(desitin).not_to eq nil
|
407
|
+
# TODO: why is this now nil? desitin.elements['ATC'].text.should == 'N03AX14'
|
381
408
|
expect(desitin.elements['DSCRD'].text).to eq("LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk")
|
382
409
|
expect(desitin.elements['DSCRF'].text).to eq('LEVETIRACETAM DESITIN mini cpr pel 250 mg 30 pce')
|
383
410
|
expect(desitin.elements['REF_DATA'].text).to eq('1')
|
@@ -405,6 +432,7 @@ def checkArticleXml(checkERYTHROCIN = true)
|
|
405
432
|
expect(zyvoxid.elements['DSCRD'].text).to eq 'ZYVOXID Filmtabl 600 mg 10 Stk'
|
406
433
|
|
407
434
|
expect(XPath.match( doc, "//LIMPTS" ).size).to be >= 1
|
435
|
+
# TODO: desitin.elements['QTY'].text.should eq '250 mg'
|
408
436
|
end
|
409
437
|
|
410
438
|
def checkProductXml(nbr_record = -1)
|
@@ -414,7 +442,7 @@ def checkProductXml(nbr_record = -1)
|
|
414
442
|
# check products
|
415
443
|
content = IO.read(product_filename)
|
416
444
|
doc = REXML::Document.new content
|
417
|
-
check_result(
|
445
|
+
check_result(content, nbr_record)
|
418
446
|
expect(nbr_record).to eq content.scan(/<PRD/).size if nbr_record != -1
|
419
447
|
|
420
448
|
desitin = checkAndGetProductWithGTIN(doc, Oddb2xml::LEVETIRACETAM_GTIN)
|
@@ -427,9 +455,8 @@ def checkProductXml(nbr_record = -1)
|
|
427
455
|
expect(desitin.elements['EinheitSwissmedic'].text).to eq 'Tablette(n)'
|
428
456
|
expect(desitin.elements['SubstanceSwissmedic'].text).to eq 'levetiracetamum'
|
429
457
|
expect(desitin.elements['CompositionSwissmedic'].text).to eq 'levetiracetamum 250 mg, excipiens pro compressi obducti pro charta.'
|
430
|
-
|
431
458
|
expect(desitin.elements['CPT/CPTCMP/LINE'].text).to eq '0'
|
432
|
-
expect(desitin.elements['CPT/CPTCMP/SUBNO'].text).to eq '
|
459
|
+
expect(desitin.elements['CPT/CPTCMP/SUBNO'].text).to eq '14'
|
433
460
|
expect(desitin.elements['CPT/CPTCMP/QTY'].text).to eq '250'
|
434
461
|
expect(desitin.elements['CPT/CPTCMP/QTYU'].text).to eq 'mg'
|
435
462
|
|
@@ -441,31 +468,32 @@ def checkProductXml(nbr_record = -1)
|
|
441
468
|
puts "checkProductXml has #{XPath.match( doc, "//GTIN" ).find_all{|x| true}.size} GTIN"
|
442
469
|
puts "checkProductXml has #{XPath.match( doc, "//PRODNO" ).find_all{|x| true}.size} PRODNO"
|
443
470
|
end
|
444
|
-
expect(XPath.match( doc, "//PRD" ).find_all{|x| true}.size).to eq(NrPackages)
|
445
|
-
expect(XPath.match( doc, "//GTIN" ).find_all{|x| true}.size).to eq(NrPackages)
|
446
|
-
expect(XPath.match( doc, "//PRODNO" ).find_all{|x| true}.size).to eq(NrProdno)
|
447
|
-
|
448
471
|
hirudoid = checkAndGetProductWithGTIN(doc, Oddb2xml::HIRUDOID_GTIN)
|
449
472
|
expect(hirudoid.elements['ATC'].text).to eq('C05BA01') # modified by atc.csv!
|
450
473
|
end
|
451
474
|
|
452
475
|
describe Oddb2xml::Builder do
|
453
|
-
NrExtendedArticles =
|
454
|
-
NrSubstances =
|
455
|
-
NrLimitations =
|
456
|
-
|
476
|
+
NrExtendedArticles = 67
|
477
|
+
NrSubstances = 25
|
478
|
+
NrLimitations = 12
|
479
|
+
|
480
|
+
NrInteractions = 2
|
457
481
|
NrCodes = 5
|
458
|
-
NrProdno =
|
459
|
-
NrPackages =
|
460
|
-
NrProducts =
|
482
|
+
NrProdno = 31
|
483
|
+
NrPackages = 38
|
484
|
+
NrProducts = 32
|
461
485
|
RegExpDesitin = /1125819012LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk/
|
462
486
|
include ServerMockHelper
|
463
|
-
def common_run_init
|
487
|
+
def common_run_init(options = {})
|
464
488
|
@savedDir = Dir.pwd
|
489
|
+
@oddb2xml_xsd = File.expand_path(File.join(File.dirname(__FILE__), '..', 'oddb2xml.xsd'))
|
490
|
+
@oddb_calc_xsd = File.expand_path(File.join(File.dirname(__FILE__), '..', 'oddb_calc.xsd'))
|
491
|
+
expect(File.exist?(@oddb2xml_xsd)).to eq true
|
492
|
+
expect(File.exist?(@oddb_calc_xsd)).to eq true
|
465
493
|
cleanup_directories_before_run
|
466
494
|
FileUtils.makedirs(Oddb2xml::WorkDir)
|
467
495
|
Dir.chdir(Oddb2xml::WorkDir)
|
468
|
-
|
496
|
+
mock_downloads
|
469
497
|
end
|
470
498
|
|
471
499
|
after(:all) do
|
@@ -474,19 +502,18 @@ describe Oddb2xml::Builder do
|
|
474
502
|
context 'when default options are given' do
|
475
503
|
before(:all) do
|
476
504
|
common_run_init
|
477
|
-
|
478
|
-
# @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
|
479
|
-
Oddb2xml::Cli.new(options.opts).run # to debug
|
505
|
+
Oddb2xml::Cli.new({}).run # to debug
|
480
506
|
@doc = Nokogiri::XML(File.open(oddb_article_xml))
|
507
|
+
@inhalt = File.read(oddb_article_xml)
|
481
508
|
@rexml = REXML::Document.new File.read(oddb_article_xml)
|
482
509
|
end
|
483
510
|
|
484
|
-
it 'should
|
511
|
+
it 'should produce a oddb_article.xml' do
|
485
512
|
expect(File.exists?(oddb_article_xml)).to eq true
|
486
513
|
end
|
487
514
|
|
488
515
|
it 'should have a correct NBR_RECORD in oddb_article.xml' do
|
489
|
-
check_result(@
|
516
|
+
check_result(@inhalt, NrProducts)
|
490
517
|
end
|
491
518
|
|
492
519
|
it 'oddb_article.xml should contain a SHA256' do
|
@@ -503,9 +530,12 @@ describe Oddb2xml::Builder do
|
|
503
530
|
check_validation_via_xsd
|
504
531
|
end
|
505
532
|
|
506
|
-
|
507
|
-
|
508
|
-
|
533
|
+
check_attributes(oddb_article_xml, ARTICLE_ATTRIBUTE_TESTS)
|
534
|
+
check_elements(oddb_article_xml, ARTICLE_COMMON_ELEMENTS)
|
535
|
+
|
536
|
+
it 'should validate XSD article' do
|
537
|
+
@inhalt = File.read(oddb_article_xml)
|
538
|
+
expect(File.read(oddb_article_xml).scan(ARTICLE_NAROPIN).size).to eq 1
|
509
539
|
end
|
510
540
|
|
511
541
|
context 'XSD betrieb' do
|
@@ -522,7 +552,7 @@ describe Oddb2xml::Builder do
|
|
522
552
|
|
523
553
|
it 'should have a correct insulin (gentechnik) for 7680532900196' do
|
524
554
|
expect(XPath.match( @rexml, "//ART/[BC='7680532900196']").size).to eq 1
|
525
|
-
expect(XPath.match( @rexml, "//ART//GEN_PRODUCTION").size).to
|
555
|
+
expect(XPath.match( @rexml, "//ART//GEN_PRODUCTION").size).to be >= 1
|
526
556
|
expect(XPath.match( @rexml, "//ART//GEN_PRODUCTION").first.text).to eq 'X'
|
527
557
|
expect(XPath.match( @rexml, "//ART//INSULIN_CATEGORY").size).to eq 1
|
528
558
|
expect(XPath.match( @rexml, "//ART//INSULIN_CATEGORY").first.text).to eq 'Insulinanalog: schnell wirkend'
|
@@ -534,8 +564,10 @@ describe Oddb2xml::Builder do
|
|
534
564
|
expect(XPath.match( doc, "//COOL='1']").size).to eq 1
|
535
565
|
end
|
536
566
|
|
537
|
-
|
538
|
-
|
567
|
+
ean_with_drug_index = 7680555610041
|
568
|
+
it "should have a correct drug information for #{ean_with_drug_index}" do
|
569
|
+
doc = REXML::Document.new IO.read(checkAndGetArticleXmlName)
|
570
|
+
expect(XPath.match( @rexml, "//ART/[BC='#{ean_with_drug_index}']").size).to eq 1
|
539
571
|
expect(XPath.match( @rexml, "//ART//DRUG_INDEX").size).to eq 1
|
540
572
|
expect(XPath.match( @rexml, "//ART//DRUG_INDEX").first.text).to eq 'd'
|
541
573
|
found = false
|
@@ -556,20 +588,17 @@ describe Oddb2xml::Builder do
|
|
556
588
|
common_run_init
|
557
589
|
@oddb_fi_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_fi.xml'))
|
558
590
|
@oddb_fi_product_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_fi_product.xml'))
|
559
|
-
options = Oddb2xml::Options.
|
560
|
-
|
561
|
-
|
562
|
-
Oddb2xml::Cli.new(options.opts).run
|
591
|
+
options = Oddb2xml::Options.parse(['-o', '--log'])
|
592
|
+
# @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
593
|
+
Oddb2xml::Cli.new(options).run
|
563
594
|
end
|
564
595
|
|
565
596
|
it 'should have a correct NBR_RECORD in oddb_fi_product.xml' do
|
566
|
-
|
567
|
-
check_result(rexml, 0)
|
597
|
+
check_result( File.read('oddb_fi_product.xml'), 0)
|
568
598
|
end
|
569
599
|
|
570
600
|
it 'should have a correct NBR_RECORD in oddb_fi.xml' do
|
571
|
-
|
572
|
-
check_result(rexml, 2)
|
601
|
+
check_result( File.read('oddb_fi.xml'), 2)
|
573
602
|
end
|
574
603
|
|
575
604
|
it 'should return produce a correct oddb_fi.xml' do
|
@@ -580,12 +609,11 @@ describe Oddb2xml::Builder do
|
|
580
609
|
m = /<paragraph><!\[CDATA\[(.+)\n(.*)/.match(inhalt.to_s)
|
581
610
|
expect(m[1]).to eq '<?xml version="1.0" encoding="utf-8"?><div xmlns="http://www.w3.org/1999/xhtml">'
|
582
611
|
expected = '<p class="s2"> </p>'
|
583
|
-
skip {
|
612
|
+
skip { m[2].should eq '<p class="s4" id="section1"><span class="s2"><span>Zyvoxid</span></span><sup class="s3"><span>®</span></sup></p>' }
|
584
613
|
expect(File.exists?(@oddb_fi_product_xml)).to eq true
|
585
614
|
inhalt = IO.read(@oddb_fi_product_xml)
|
586
615
|
end
|
587
616
|
|
588
|
-
if RUN_ALL
|
589
617
|
it 'should produce valid xml files' do
|
590
618
|
skip "Niklaus does not know how to create a valid oddb_fi_product.xml"
|
591
619
|
# check_validation_via_xsd
|
@@ -601,10 +629,9 @@ if RUN_ALL
|
|
601
629
|
context 'when -f dat is given' do
|
602
630
|
before(:all) do
|
603
631
|
common_run_init
|
604
|
-
options = Oddb2xml::Options.
|
605
|
-
|
606
|
-
|
607
|
-
# Oddb2xml::Cli.new(options.opts).run # to debug
|
632
|
+
options = Oddb2xml::Options.parse('-f dat --log')
|
633
|
+
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
634
|
+
# Oddb2xml::Cli.new(options).run # to debug
|
608
635
|
end
|
609
636
|
|
610
637
|
it 'should contain the correct values fo CMUT from transfer.dat' do
|
@@ -616,7 +643,7 @@ if RUN_ALL
|
|
616
643
|
expect(oddb_dat).to match(/^..3/), "should have a record with '3' in CMUT field"
|
617
644
|
expect(oddb_dat).to match(RegExpDesitin), "should have Desitin"
|
618
645
|
IO.readlines(dat_filename).each{ |line| check_article_IGM_format(line, 0) }
|
619
|
-
m = /.+
|
646
|
+
m = /.+KENDURAL Depottabl 30 Stk.*7680353660163.+/.match(oddb_dat)
|
620
647
|
expect(m[0].size).to eq 97 # size of IGM 1 record
|
621
648
|
expect(m[0][74]).to eq '3'
|
622
649
|
end
|
@@ -625,10 +652,8 @@ if RUN_ALL
|
|
625
652
|
context 'when --append -f dat is given' do
|
626
653
|
before(:all) do
|
627
654
|
common_run_init
|
628
|
-
options = Oddb2xml::Options.
|
629
|
-
|
630
|
-
# Oddb2xml::Cli.new(options.opts).run
|
631
|
-
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
|
655
|
+
options = Oddb2xml::Options.parse('--append -f dat')
|
656
|
+
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
632
657
|
end
|
633
658
|
|
634
659
|
it 'should generate a valid oddb_with_migel.dat' do
|
@@ -650,20 +675,35 @@ if RUN_ALL
|
|
650
675
|
context 'when --append -I 80 -e is given' do
|
651
676
|
before(:all) do
|
652
677
|
common_run_init
|
653
|
-
options = Oddb2xml::Options.
|
654
|
-
|
655
|
-
Oddb2xml::Cli.new(options
|
656
|
-
# @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
|
678
|
+
options = Oddb2xml::Options.parse('--append -I 80 -e')
|
679
|
+
Oddb2xml::Cli.new(options).run
|
680
|
+
# @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
657
681
|
end
|
658
682
|
|
659
683
|
it "oddb_article with stuf from ZurRose", :skip => "ZurRose contains ERYTHROCIN i.v. Troc*esteekensub 1000 mg Amp [!]" do
|
660
684
|
checkArticleXml
|
661
685
|
end
|
662
686
|
|
687
|
+
# Zeno used oddb2xml -e -I 45 -c zip for oddb_arcticle for artikelstamm 7680172330414 3605520301605
|
688
|
+
it 'should add GTIN 7680172330414 which is marked as inactive in transfer.dat' do
|
689
|
+
@inhalt = IO.read(oddb_article_xml)
|
690
|
+
expect(@inhalt.index('7680172330414')).not_to be nil
|
691
|
+
end
|
692
|
+
|
693
|
+
it 'should add GTIN 3605520301605 Armani Attitude which is marked as inactive in transfer.dat' do
|
694
|
+
@inhalt = IO.read(oddb_article_xml)
|
695
|
+
# <SALECD>I</SALECD>
|
696
|
+
|
697
|
+
expect(@inhalt.index('3605520301605')).not_to be nil
|
698
|
+
end
|
699
|
+
|
663
700
|
context 'XSD' do
|
664
701
|
check_attributes(oddb_article_xml, ARTICLE_ATTRIBUTE_TESTS)
|
665
702
|
check_elements(oddb_article_xml, ARTICLE_COMMON_ELEMENTS)
|
666
703
|
check_elements(oddb_article_xml, ARTICLE_ZURROSE_ELEMENTS)
|
704
|
+
it 'should contain NAROPIN' do
|
705
|
+
expect(File.read(oddb_article_xml).scan(ARTICLE_NAROPIN).size).to eq 1
|
706
|
+
end
|
667
707
|
end
|
668
708
|
|
669
709
|
it 'should emit a correct oddb_article.xml' do
|
@@ -679,19 +719,17 @@ if RUN_ALL
|
|
679
719
|
checkPrices(true)
|
680
720
|
end
|
681
721
|
end
|
682
|
-
end
|
683
722
|
|
684
|
-
if RUN_ALL
|
685
723
|
context 'when option -e is given' do
|
686
724
|
before(:all) do
|
687
725
|
common_run_init
|
688
|
-
options = Oddb2xml::Options.
|
689
|
-
options
|
690
|
-
Oddb2xml::Cli.new(options
|
726
|
+
options = Oddb2xml::Options.parse('-e')
|
727
|
+
puts options
|
728
|
+
@cli = Oddb2xml::Cli.new(options)
|
691
729
|
if RUN_ALL
|
692
|
-
@res = buildr_capture(:stdout){
|
730
|
+
@res = buildr_capture(:stdout){ @cli.run }
|
693
731
|
else
|
694
|
-
|
732
|
+
@cli.run
|
695
733
|
end
|
696
734
|
end
|
697
735
|
|
@@ -706,8 +744,7 @@ if RUN_ALL
|
|
706
744
|
end
|
707
745
|
|
708
746
|
it 'should have a correct NBR_RECORD in oddb_code.xml' do
|
709
|
-
|
710
|
-
check_result(rexml, NrCodes)
|
747
|
+
check_result(File.read(oddb_code_xml), NrCodes)
|
711
748
|
end
|
712
749
|
|
713
750
|
context 'XSD interaction' do
|
@@ -716,8 +753,7 @@ if RUN_ALL
|
|
716
753
|
end
|
717
754
|
|
718
755
|
it 'should have a correct NBR_RECORD in oddb_interaction.xml' do
|
719
|
-
|
720
|
-
check_result(rexml, NrInteractions)
|
756
|
+
check_result(File.read(oddb_interaction_xml), NrInteractions)
|
721
757
|
end
|
722
758
|
|
723
759
|
context 'XSD substance' do
|
@@ -726,8 +762,7 @@ if RUN_ALL
|
|
726
762
|
end
|
727
763
|
|
728
764
|
it 'should have a correct NBR_RECORD in oddb_substance.xml' do
|
729
|
-
|
730
|
-
check_result(rexml, NrSubstances)
|
765
|
+
check_result(File.read('oddb_substance.xml'), NrSubstances)
|
731
766
|
end
|
732
767
|
|
733
768
|
it 'should emit a correct oddb_article.xml' do
|
@@ -759,7 +794,7 @@ if RUN_ALL
|
|
759
794
|
expect(XPath.match( doc, "//REF_DATA" ).size).to be > 0
|
760
795
|
checkItemForRefdata(doc, "1699947", 1) # 3TC Filmtabl 150 mg SMNO 53662013 IKSNR 53‘662, 53‘663
|
761
796
|
checkItemForRefdata(doc, "0598003", 0) # SOFRADEX Gtt Auric 8 ml
|
762
|
-
checkItemForRefdata(doc, "5366964",
|
797
|
+
checkItemForRefdata(doc, "5366964", 0) # 1-DAY ACUVUE moist jour
|
763
798
|
unless SkipMigelDownloader
|
764
799
|
novopen = checkItemForRefdata(doc, "3036984", 1) # NovoPen 4 Injektionsgerät blue In NonPharma (a MiGel product)
|
765
800
|
expect(novopen.elements['ARTBAR/BC'].text).to eq '0'
|
@@ -768,8 +803,7 @@ if RUN_ALL
|
|
768
803
|
|
769
804
|
it 'should generate SALECD A for migel (NINCD 13)' do
|
770
805
|
doc = REXML::Document.new File.new(checkAndGetArticleXmlName)
|
771
|
-
article = XPath.match( doc, "//ART[
|
772
|
-
article = XPath.match( doc, "//ART[PHAR=5366964]").first
|
806
|
+
article = XPath.match( doc, "//ART[PHAR=4236863]").first
|
773
807
|
expect(article.elements['SALECD'].text).to eq('A')
|
774
808
|
expect(article.elements['ARTINS/NINCD'].text).to eq('13')
|
775
809
|
end
|
@@ -791,7 +825,7 @@ if RUN_ALL
|
|
791
825
|
expect(XPath.match( doc, "//PHAR" ).find_all{|x| x.text.match('5366964') }.size).to eq(1)
|
792
826
|
expect(dscrds.size).to eq(NrExtendedArticles)
|
793
827
|
expect(XPath.match( doc, "//PRODNO" ).find_all{|x| true}.size).to be >= 1
|
794
|
-
expect(XPath.match( doc, "//PRODNO" ).find_all{|x| x.text.match('0027701') }.size).to eq(
|
828
|
+
expect(XPath.match( doc, "//PRODNO" ).find_all{|x| x.text.match('0027701') }.size).to eq(1)
|
795
829
|
expect(XPath.match( doc, "//PRODNO" ).find_all{|x| x.text.match('6206901') }.size).to eq(1)
|
796
830
|
end
|
797
831
|
|
@@ -805,8 +839,7 @@ if RUN_ALL
|
|
805
839
|
end
|
806
840
|
|
807
841
|
it 'should have a correct NBR_RECORD in oddb_limitation.xml' do
|
808
|
-
|
809
|
-
check_result(rexml, NrLimitations)
|
842
|
+
check_result(File.read('oddb_limitation.xml'), NrLimitations)
|
810
843
|
end
|
811
844
|
|
812
845
|
it 'should emit a correct oddb_limitation.xml' do
|
@@ -817,10 +850,10 @@ if RUN_ALL
|
|
817
850
|
limitations = XPath.match( doc, "//LIM" )
|
818
851
|
expect(limitations.size).to eql NrLimitations
|
819
852
|
expect(XPath.match( doc, "//SwissmedicNo5" ).find_all{|x| x.text.match('28486') }.size).to eq(1)
|
820
|
-
expect(XPath.match( doc, "//LIMNAMEBAG" ).find_all{|x| x.text.match('ZYVOXID') }.size).to eq(
|
821
|
-
expect(XPath.match( doc, "//LIMNAMEBAG" ).find_all{|x| x.text.match('070240') }.size).to
|
822
|
-
expect(XPath.match( doc, "//DSCRD" ).find_all{|x| x.text.match(/^Gesamthaft zugelassen/) }.size).to
|
823
|
-
expect(XPath.match( doc, "//DSCRD" ).find_all{|x| x.text.match(/^Behandlung nosokomialer Pneumonien/) }.size).to
|
853
|
+
expect(XPath.match( doc, "//LIMNAMEBAG" ).find_all{|x| x.text.match('ZYVOXID') }.size).to eq(2)
|
854
|
+
expect(XPath.match( doc, "//LIMNAMEBAG" ).find_all{|x| x.text.match('070240') }.size).to be >= 1
|
855
|
+
expect(XPath.match( doc, "//DSCRD" ).find_all{|x| x.text.match(/^Gesamthaft zugelassen/) }.size).to be >= 1
|
856
|
+
expect(XPath.match( doc, "//DSCRD" ).find_all{|x| x.text.match(/^Behandlung nosokomialer Pneumonien/) }.size).to be >= 1
|
824
857
|
end
|
825
858
|
|
826
859
|
it 'should emit a correct oddb_substance.xml' do
|
@@ -833,7 +866,7 @@ if RUN_ALL
|
|
833
866
|
it 'should emit a correct oddb_interaction.xml' do
|
834
867
|
doc = REXML::Document.new File.new(File.join(Oddb2xml::WorkDir, 'oddb_interaction.xml'))
|
835
868
|
titles = XPath.match( doc, "//TITD" )
|
836
|
-
expect(titles.size).to eq
|
869
|
+
expect(titles.size).to eq 2
|
837
870
|
expect(titles.find_all{|x| x.text.match('Keine Interaktion') }.size).to be >= 1
|
838
871
|
expect(titles.find_all{|x| x.text.match('Erhöhtes Risiko für Myopathie und Rhabdomyolyse') }.size).to eq(1)
|
839
872
|
end
|
@@ -859,19 +892,17 @@ if RUN_ALL
|
|
859
892
|
checkItemForSALECD(doc, Oddb2xml::SOFRADEX_GTIN, 'I') # SOFRADEX
|
860
893
|
end
|
861
894
|
end
|
862
|
-
if RUN_ALL
|
863
895
|
context 'testing -e -I 80 option' do
|
864
896
|
before(:all) do
|
865
897
|
common_run_init
|
866
|
-
options = Oddb2xml::Options.
|
867
|
-
|
868
|
-
@res =
|
898
|
+
options = Oddb2xml::Options.parse('-e -I 80 --log')
|
899
|
+
# @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
900
|
+
@res = Oddb2xml::Cli.new(options).run
|
869
901
|
end
|
870
902
|
|
871
903
|
it 'should add 80 percent to zur_rose pubbprice' do
|
872
904
|
expect(File.exists?(oddb_article_xml)).to eq true
|
873
905
|
FileUtils.cp(oddb_article_xml, File.join(Oddb2xml::WorkDir, 'tst-e80.xml'))
|
874
|
-
checkProductXml(NrPackages)
|
875
906
|
checkArticleXml
|
876
907
|
checkPrices(true)
|
877
908
|
end
|
@@ -880,17 +911,17 @@ if RUN_ALL
|
|
880
911
|
expect(File.exists?(oddb_article_xml)).to eq true
|
881
912
|
doc = REXML::Document.new IO.read(oddb_article_xml)
|
882
913
|
article = XPath.match( doc, "//ART[PHAR=5822801]").first
|
883
|
-
expect(article.elements['DSCRD'].text).to match
|
914
|
+
expect(article.elements['DSCRD'].text).to match /EPIMINERAL/i
|
884
915
|
end
|
885
916
|
|
886
|
-
it 'should generate a correct oddb_product.xml' do
|
917
|
+
it 'should generate a correct number of packages in oddb_product.xml' do
|
887
918
|
checkProductXml(NrPackages)
|
888
919
|
end
|
889
920
|
|
890
921
|
it 'should generate an article with the COOL (fridge) attribute' do
|
891
922
|
doc = REXML::Document.new File.new(oddb_article_xml)
|
892
923
|
fridge_product = checkAndGetArticleWithGTIN(doc, Oddb2xml::FRIDGE_GTIN)
|
893
|
-
expect(fridge_product.elements['COOL'].text).to eq
|
924
|
+
expect(fridge_product.elements['COOL'].text).to eq('1')
|
894
925
|
end
|
895
926
|
|
896
927
|
it 'should generate a correct oddb_article.xml' do
|
@@ -901,9 +932,8 @@ if RUN_ALL
|
|
901
932
|
context 'when -f dat -p is given' do
|
902
933
|
before(:all) do
|
903
934
|
common_run_init
|
904
|
-
options = Oddb2xml::Options.
|
905
|
-
|
906
|
-
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
|
935
|
+
options = Oddb2xml::Options.parse('-f dat -p')
|
936
|
+
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
907
937
|
end
|
908
938
|
|
909
939
|
it 'should report correct number of items' do
|
@@ -918,15 +948,15 @@ if RUN_ALL
|
|
918
948
|
expect(oddb_dat).to match(/^..3/), "should have a record with '3' in CMUT field"
|
919
949
|
expect(oddb_dat).to match(RegExpDesitin), "should have Desitin"
|
920
950
|
IO.readlines(dat_filename).each{ |line| check_article_IGM_format(line, 0) }
|
951
|
+
# oddb_dat.should match(/^..1/), "should have a record with '1' in CMUT field" # we have no
|
921
952
|
end
|
922
953
|
end
|
923
954
|
|
924
955
|
context 'when -f dat -I 80 is given' do
|
925
956
|
before(:all) do
|
926
957
|
common_run_init
|
927
|
-
options = Oddb2xml::Options.
|
928
|
-
|
929
|
-
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
|
958
|
+
options = Oddb2xml::Options.parse('-f dat -I 80')
|
959
|
+
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
930
960
|
end
|
931
961
|
|
932
962
|
it 'should report correct number of items' do
|
@@ -949,6 +979,5 @@ if RUN_ALL
|
|
949
979
|
expect(out.chomp).to eq '<NAME_DE>SENSURA Mio 1t Uro 10-33 midi con lig so op 10 Stk</NAME_DE>'
|
950
980
|
end
|
951
981
|
end
|
952
|
-
|
953
|
-
end
|
982
|
+
|
954
983
|
end
|