oddb2xml 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/History.txt +4 -0
- data/LICENSE +675 -0
- data/Manifest.txt +13 -0
- data/bin/oddb2xml +33 -15
- data/lib/oddb2xml/cli.rb +39 -25
- data/lib/oddb2xml/compressor.rb +3 -2
- data/lib/oddb2xml/downloader.rb +7 -2
- data/lib/oddb2xml/extractor.rb +7 -7
- data/lib/oddb2xml/version.rb +1 -1
- data/oddb2xml.gemspec +4 -0
- data/spec/builder_spec.rb +8 -0
- data/spec/cli_spec.rb +63 -0
- data/spec/compressor_spec.rb +37 -0
- data/spec/data/XMLPublications.zip +0 -0
- data/spec/data/oddb_article.xml +0 -0
- data/spec/data/oddb_product.xml +0 -0
- data/spec/data/swissindex.xml +56 -0
- data/spec/data/wsdl.xml +55 -0
- data/spec/downloader_spec.rb +64 -0
- data/spec/extractor_spec.rb +7 -0
- data/spec/spec_helper.rb +77 -0
- metadata +19 -6
data/Manifest.txt
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
.gitignore
|
2
|
+
.rspec
|
2
3
|
Gemfile
|
3
4
|
History.txt
|
5
|
+
LICENSE
|
4
6
|
Manifest.txt
|
5
7
|
README.md
|
6
8
|
Rakefile
|
@@ -13,3 +15,14 @@ lib/oddb2xml/downloader.rb
|
|
13
15
|
lib/oddb2xml/extractor.rb
|
14
16
|
lib/oddb2xml/version.rb
|
15
17
|
oddb2xml.gemspec
|
18
|
+
spec/builder_spec.rb
|
19
|
+
spec/cli_spec.rb
|
20
|
+
spec/compressor_spec.rb
|
21
|
+
spec/data/XMLPublications.zip
|
22
|
+
spec/data/oddb_article.xml
|
23
|
+
spec/data/oddb_product.xml
|
24
|
+
spec/data/swissindex.xml
|
25
|
+
spec/data/wsdl.xml
|
26
|
+
spec/downloader_spec.rb
|
27
|
+
spec/extractor_spec.rb
|
28
|
+
spec/spec_helper.rb
|
data/bin/oddb2xml
CHANGED
@@ -5,26 +5,44 @@ require 'pathname'
|
|
5
5
|
root = Pathname.new(__FILE__).realpath.parent.parent
|
6
6
|
$:.unshift root.join('lib') if $0 == __FILE__
|
7
7
|
|
8
|
+
require 'optparse'
|
8
9
|
require 'oddb2xml'
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
def help
|
12
|
+
<<EOS
|
13
|
+
#$0 ver.#{Oddb2xml::VERSION}
|
14
|
+
Usage:
|
15
|
+
oddb2xml [option]
|
16
|
+
-c F, --compress=F Compress format F. Currently only 'tar.gz' is available.
|
17
|
+
-a T, --append=T Additional target. T is only 'nonpharma' available.
|
18
|
+
-h, --help Show this help message.
|
19
|
+
EOS
|
20
|
+
end
|
21
|
+
|
22
|
+
parser = OptionParser.new
|
12
23
|
opts = {
|
13
|
-
:compress
|
24
|
+
:compress => nil,
|
25
|
+
:nonpharma => false
|
14
26
|
}
|
15
|
-
|
16
|
-
|
17
|
-
|
27
|
+
|
28
|
+
parser.on('-c v', '--compress v', /tar\.gz/) {|v| opts[:compress] = v }
|
29
|
+
parser.on('-a v', '--append v', /nonpharma/) {|v| opts[:nonpharma] = v }
|
30
|
+
parser.on_tail('-h', '--help') { puts help; exit }
|
31
|
+
|
32
|
+
args = ARGV.dup
|
33
|
+
begin
|
34
|
+
parser.parse!(args)
|
35
|
+
rescue OptionParser::MissingArgument,
|
36
|
+
OptionParser::InvalidArgument,
|
37
|
+
OptionParser::InvalidOption
|
38
|
+
puts help
|
39
|
+
exit
|
18
40
|
end
|
19
41
|
|
20
42
|
ui = Oddb2xml::Cli.new(opts)
|
21
|
-
|
22
|
-
ui.
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
rescue Interrupt
|
27
|
-
puts
|
28
|
-
exit
|
29
|
-
end
|
43
|
+
begin
|
44
|
+
ui.run
|
45
|
+
rescue Interrupt
|
46
|
+
puts
|
47
|
+
exit
|
30
48
|
end
|
data/lib/oddb2xml/cli.rb
CHANGED
@@ -13,20 +13,12 @@ module Oddb2xml
|
|
13
13
|
def initialize(args)
|
14
14
|
@options = args
|
15
15
|
#@mutex = Mutex.new
|
16
|
-
@items = {} # Preparations.xml in BAG
|
17
|
-
@index = {}
|
16
|
+
@items = {} # Items from Preparations.xml in BAG
|
17
|
+
@index = {} # Base index from swissINDEX
|
18
18
|
LANGUAGES.each do |lang|
|
19
|
-
@index[lang] = {}
|
19
|
+
@index[lang] = {}
|
20
20
|
end
|
21
21
|
end
|
22
|
-
def help
|
23
|
-
puts <<EOS
|
24
|
-
#$0 ver.#{Oddb2xml::VERSION}
|
25
|
-
Usage:
|
26
|
-
oddb2xml [option]
|
27
|
-
-c compress option. currently only 'tar.gz' is available.
|
28
|
-
EOS
|
29
|
-
end
|
30
22
|
def run
|
31
23
|
# Sometimes nokogiri crashes with ruby in Threads.
|
32
24
|
#threads = []
|
@@ -34,20 +26,20 @@ EOS
|
|
34
26
|
#threads << Thread.new do
|
35
27
|
downloader = BagXmlDownloader.new
|
36
28
|
xml = downloader.download
|
37
|
-
|
38
|
-
@items = extractor.to_hash
|
29
|
+
@items = BagXmlExtractor.new(xml).to_hash
|
39
30
|
#end
|
40
|
-
LANGUAGES.
|
31
|
+
LANGUAGES.each do |lang|
|
41
32
|
# swissindex
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
33
|
+
types.each do |type|
|
34
|
+
#threads << Thread.new do
|
35
|
+
downloader = SwissIndexDownloader.new(type)
|
36
|
+
xml = downloader.download_by(lang)
|
37
|
+
hsh = SwissIndexExtractor.new(xml, type).to_hash
|
38
|
+
#@mutex.synchronize do
|
39
|
+
@index[lang][type] = hsh
|
40
|
+
#end
|
49
41
|
#end
|
50
|
-
|
42
|
+
end
|
51
43
|
end
|
52
44
|
#threads.map(&:join)
|
53
45
|
build
|
@@ -60,9 +52,16 @@ EOS
|
|
60
52
|
begin
|
61
53
|
files.each_pair do |sbj, file|
|
62
54
|
builder = Builder.new do |builder|
|
55
|
+
index = {}
|
56
|
+
LANGUAGES.each do |lang|
|
57
|
+
index[lang] = {} unless index[lang]
|
58
|
+
types.each do |type|
|
59
|
+
index[lang].merge!(@index[lang][type])
|
60
|
+
end
|
61
|
+
end
|
63
62
|
builder.subject = sbj
|
64
|
-
builder.index
|
65
|
-
builder.items
|
63
|
+
builder.index = index
|
64
|
+
builder.items = @items
|
66
65
|
end
|
67
66
|
xml = builder.to_xml
|
68
67
|
File.open(file, 'w:utf-8'){ |fh| fh << xml }
|
@@ -84,7 +83,22 @@ EOS
|
|
84
83
|
end
|
85
84
|
end
|
86
85
|
def report
|
87
|
-
|
86
|
+
lines = []
|
87
|
+
LANGUAGES.each do |lang|
|
88
|
+
lines << lang
|
89
|
+
types.each do |type|
|
90
|
+
key = (type == :nonpharma ? 'NonPharma' : 'Pharma')
|
91
|
+
lines << sprintf("\t#{key} products: %i", @index[lang][type].values.length)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
puts lines.join("\n")
|
95
|
+
end
|
96
|
+
def types # swissindex
|
97
|
+
if @options[:nonpharma]
|
98
|
+
[:pharma, :nonpharma]
|
99
|
+
else
|
100
|
+
[:pharma]
|
101
|
+
end
|
88
102
|
end
|
89
103
|
end
|
90
104
|
end
|
data/lib/oddb2xml/compressor.rb
CHANGED
data/lib/oddb2xml/downloader.rb
CHANGED
@@ -52,8 +52,12 @@ module Oddb2xml
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
class SwissIndexDownloader < Downloader
|
55
|
+
def initialize(type=:pharma)
|
56
|
+
@type = (type == :pharma ? 'Pharma' : 'NonPharma')
|
57
|
+
url = "https://index.ws.e-mediat.net/Swissindex/#{@type}/ws_#{@type}_V101.asmx?WSDL"
|
58
|
+
super(url)
|
59
|
+
end
|
55
60
|
def init
|
56
|
-
@url ||= 'https://index.ws.e-mediat.net/Swissindex/Pharma/ws_Pharma_V101.asmx?WSDL'
|
57
61
|
Savon.configure do |config|
|
58
62
|
config.log_level = :info
|
59
63
|
config.log = false # $stdout
|
@@ -66,12 +70,13 @@ module Oddb2xml
|
|
66
70
|
wsdl.document = @url
|
67
71
|
end
|
68
72
|
begin
|
73
|
+
type = @type
|
69
74
|
response = client.request :download_all do
|
70
75
|
soap.xml = <<XML
|
71
76
|
<?xml version="1.0" encoding="utf-8"?>
|
72
77
|
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
73
78
|
<soap:Body>
|
74
|
-
<lang xmlns="http://swissindex.e-mediat.net/
|
79
|
+
<lang xmlns="http://swissindex.e-mediat.net/Swissindex#{type}_out_V101">#{lang}</lang>
|
75
80
|
</soap:Body>
|
76
81
|
</soap:Envelope>
|
77
82
|
XML
|
data/lib/oddb2xml/extractor.rb
CHANGED
@@ -11,9 +11,7 @@ module Oddb2xml
|
|
11
11
|
end
|
12
12
|
class BagXmlExtractor < Extractor
|
13
13
|
def to_hash
|
14
|
-
#File.open('../bagxml.xml', 'r:ASCII-8BIT')
|
15
|
-
# @xml = f.read
|
16
|
-
#end
|
14
|
+
#File.open('../bagxml.xml', 'r:ASCII-8BIT') {|f| @xml = f.read }
|
17
15
|
# pharmacode => sequence
|
18
16
|
data = {}
|
19
17
|
doc = Nokogiri::XML(@xml)
|
@@ -90,15 +88,17 @@ module Oddb2xml
|
|
90
88
|
end
|
91
89
|
end
|
92
90
|
class SwissIndexExtractor < Extractor
|
91
|
+
def initialize(xml, type)
|
92
|
+
@type = (type == :pharma ? 'PHARMA' : 'NONPHARMA')
|
93
|
+
super(xml)
|
94
|
+
end
|
93
95
|
def to_hash
|
94
|
-
#File.open(
|
95
|
-
# @xml = f.read
|
96
|
-
#end
|
96
|
+
#File.open("../swissindex_#{@type.downcase}.xml", 'r:ASCII-8BIT'){|f| @xml = f.read }
|
97
97
|
# pharmacode => package
|
98
98
|
data = {}
|
99
99
|
doc = Nokogiri::XML(@xml)
|
100
100
|
doc.remove_namespaces!
|
101
|
-
doc.xpath(
|
101
|
+
doc.xpath("//Envelope/Body/#{@type}/ITEM").each do |pac|
|
102
102
|
item = {}
|
103
103
|
item[:ean] = (gtin = pac.at_xpath('.//GTIN')) ? gtin.text : ''
|
104
104
|
item[:pharmacode] = (phar = pac.at_xpath('.//PHAR')) ? phar.text : ''
|
data/lib/oddb2xml/version.rb
CHANGED
data/oddb2xml.gemspec
CHANGED
@@ -22,4 +22,8 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_dependency 'mechanize'
|
23
23
|
gem.add_dependency 'nokogiri'
|
24
24
|
gem.add_dependency 'savon'
|
25
|
+
|
26
|
+
gem.add_development_dependency 'rspec'
|
27
|
+
gem.add_development_dependency 'webmock'
|
28
|
+
gem.add_development_dependency 'ZenTest'
|
25
29
|
end
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
shared_examples_for 'any interface' do
|
6
|
+
it { cli.should respond_to(:run) }
|
7
|
+
it 'should run successfully' do
|
8
|
+
$stdout.should_receive(:puts).with(/product/)
|
9
|
+
cli.run
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe Oddb2xml::Cli do
|
14
|
+
include ServerMockHelper
|
15
|
+
before(:each) do
|
16
|
+
setup_server_mocks
|
17
|
+
end
|
18
|
+
context "when -c tar.gz option is given" do
|
19
|
+
let(:cli) { Oddb2xml::Cli.new({:compress => 'tar.gz', :nonpharma => false}) }
|
20
|
+
it { cli.instance_variable_get(:@options).should == {:compress => 'tar.gz', :nonpharma => false} }
|
21
|
+
it_behaves_like 'any interface'
|
22
|
+
it "should create tar.gz file" do
|
23
|
+
$stdout.should_receive(:puts).with(/Pharma/)
|
24
|
+
cli.run
|
25
|
+
file = Dir.glob('oddb_*.tar.gz').first
|
26
|
+
File.exists?(file).should be_true
|
27
|
+
end
|
28
|
+
it "should not create any xml file" do
|
29
|
+
$stdout.should_receive(:puts).with(/Nonpharma/)
|
30
|
+
cli.run
|
31
|
+
Dir.glob('oddb_*.xml').each do |file|
|
32
|
+
File.exists?(file).should be_nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
after(:each) do
|
36
|
+
Dir.glob('oddb_*.tar.gz').each do |file|
|
37
|
+
File.unlink(file) if File.exists?(file)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
context "when -a nonpharma option is given" do
|
42
|
+
let(:cli) { Oddb2xml::Cli.new({:compress => nil, :nonpharma => true}) }
|
43
|
+
it { cli.instance_variable_get(:@options).should == {:compress => nil, :nonpharma => true} }
|
44
|
+
it_behaves_like 'any interface'
|
45
|
+
it "should not create any compressed file" do
|
46
|
+
$stdout.should_receive(:puts).with(/Pharma/)
|
47
|
+
cli.run
|
48
|
+
Dir.glob('oddb_*.tar.gz').first.should be_nil
|
49
|
+
end
|
50
|
+
it "should create 2 xml files" do
|
51
|
+
$stdout.should_receive(:puts).with(/Nonpharma/)
|
52
|
+
cli.run
|
53
|
+
Dir.glob('oddb_*.xml').each do |file|
|
54
|
+
File.exists?(file).should be_true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
after(:each) do
|
58
|
+
Dir.glob('oddb_*.xml').each do |file|
|
59
|
+
File.unlink(file) if File.exists?(file)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Oddb2xml::Compressor do
|
6
|
+
context "when tar.gz ext is given at initialize" do
|
7
|
+
before(:each) do
|
8
|
+
@compressor = Oddb2xml::Compressor.new('tar.gz')
|
9
|
+
end
|
10
|
+
it 'should have formated filename with datetime' do
|
11
|
+
@compressor.instance_variable_get(:@compressed_file).
|
12
|
+
should =~ /oddb_xml_\d{2}.\d{2}.\d{4}_\d{2}.\d{2}.tar\.gz/
|
13
|
+
end
|
14
|
+
it 'should have empty contents as array' do
|
15
|
+
@compressor.contents.should be_a Array
|
16
|
+
@compressor.contents.should be_empty
|
17
|
+
end
|
18
|
+
end
|
19
|
+
context 'when finalize! is called' do
|
20
|
+
before(:each) do
|
21
|
+
@compressor = Oddb2xml::Compressor.new()
|
22
|
+
end
|
23
|
+
context 'unexpectedly' do
|
24
|
+
it 'should fail with no contents' do
|
25
|
+
@compressor.finalize!.should == false
|
26
|
+
end
|
27
|
+
it 'should fail with invalid file' do
|
28
|
+
@compressor.contents << '../invalid_file'
|
29
|
+
@compressor.finalize!.should == false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
context 'successfully' do
|
33
|
+
it 'pending'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
Binary file
|
File without changes
|
File without changes
|
@@ -0,0 +1,56 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<soap:Envelope
|
3
|
+
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
|
4
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
5
|
+
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
6
|
+
<soap:Body>
|
7
|
+
<PHARMA
|
8
|
+
CREATION_DATETIME="2012-10-18T06:31:19.4687619+02:00"
|
9
|
+
xmlns="http://example.com/test">
|
10
|
+
<ITEM DT="2012-10-18T00:00:00">
|
11
|
+
<GTIN>0000000000000</GTIN>
|
12
|
+
<PHAR>00000</PHAR>
|
13
|
+
<STATUS>A</STATUS>
|
14
|
+
<STDATE>2002-05-23T00:00:00</STDATE>
|
15
|
+
<LANG>DE</LANG>
|
16
|
+
<DSCR>Foo 1000 mg</DSCR>
|
17
|
+
<ADDSCR>Amp</ADDSCR>
|
18
|
+
<ATC>A00AA00</ATC>
|
19
|
+
<COMP>
|
20
|
+
<NAME>EXAMPLE.COM AG</NAME>
|
21
|
+
<GLN>0000000000000</GLN>
|
22
|
+
</COMP>
|
23
|
+
</ITEM>
|
24
|
+
<ITEM DT="2012-10-18T00:00:00">
|
25
|
+
<GTIN>0000000000001</GTIN>
|
26
|
+
<PHAR>00001</PHAR>
|
27
|
+
<STATUS>A</STATUS>
|
28
|
+
<STDATE>2002-05-23T00:00:00</STDATE>
|
29
|
+
<LANG>DE</LANG>
|
30
|
+
<DSCR>Bar 10 Stk</DSCR>
|
31
|
+
<ADDSCR>10 Stk</ADDSCR>
|
32
|
+
<ATC>A02AA02</ATC>
|
33
|
+
<COMP>
|
34
|
+
<NAME>EXAMPLE.ORG AG</NAME>
|
35
|
+
</COMP>
|
36
|
+
</ITEM>
|
37
|
+
<ITEM DT="2012-10-18T00:00:00">
|
38
|
+
<GTIN>0000000000002</GTIN>
|
39
|
+
<PHAR>00002</PHAR>
|
40
|
+
<STATUS>A</STATUS>
|
41
|
+
<STDATE>2002-05-23T00:00:00</STDATE>
|
42
|
+
<LANG>DE</LANG>
|
43
|
+
<DSCR>Baz 10 Tablet</DSCR>
|
44
|
+
<ADDSCR>5 Stk</ADDSCR>
|
45
|
+
<ATC>A03AA03</ATC>
|
46
|
+
<COMP>
|
47
|
+
<NAME>EXAMPLE.AC AG</NAME>
|
48
|
+
</COMP>
|
49
|
+
</ITEM>
|
50
|
+
<RESULT>
|
51
|
+
<OK_ERROR>OK</OK_ERROR>
|
52
|
+
<NBR_RECORD>3</NBR_RECORD>
|
53
|
+
</RESULT>
|
54
|
+
</PHARMA>
|
55
|
+
</soap:Body>
|
56
|
+
</soap:Envelope>
|
data/spec/data/wsdl.xml
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<wsdl:definitions
|
3
|
+
xmlns:s="http://www.w3.org/2001/XMLSchema"
|
4
|
+
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
|
5
|
+
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
|
6
|
+
xmlns:tns="http://example.com/test"
|
7
|
+
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
8
|
+
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
|
9
|
+
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
|
10
|
+
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
|
11
|
+
targetNamespace="http://example.com/test"
|
12
|
+
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
|
13
|
+
<wsdl:types>
|
14
|
+
<s:schema elementFormDefault="qualified" targetNamespace="http://example.com/test">
|
15
|
+
</s:schema>
|
16
|
+
</wsdl:types>
|
17
|
+
<wsdl:message name="DownloadAllSoapIn">
|
18
|
+
<wsdl:part name="lang" element="tns:lang" />
|
19
|
+
</wsdl:message>
|
20
|
+
<wsdl:message name="DownloadAllSoapOut">
|
21
|
+
<wsdl:part name="DownloadAllResult" element="tns:PHARMA" />
|
22
|
+
</wsdl:message>
|
23
|
+
<wsdl:binding name="ws_Pharma_V101Soap" type="tns:ws_Pharma_V101Soap">
|
24
|
+
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
|
25
|
+
<wsdl:operation name="DownloadAll">
|
26
|
+
<soap:operation soapAction="http://example.com/DownloadAll" style="document" />
|
27
|
+
<wsdl:input>
|
28
|
+
<soap:body use="literal" />
|
29
|
+
</wsdl:input>
|
30
|
+
<wsdl:output>
|
31
|
+
<soap:body use="literal" />
|
32
|
+
</wsdl:output>
|
33
|
+
</wsdl:operation>
|
34
|
+
</wsdl:binding>
|
35
|
+
<wsdl:binding name="ws_Pharma_V101Soap12" type="tns:ws_Pharma_V101Soap">
|
36
|
+
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
|
37
|
+
<wsdl:operation name="DownloadAll">
|
38
|
+
<soap12:operation soapAction="http://example.com/DownloadAll" style="document" />
|
39
|
+
<wsdl:input>
|
40
|
+
<soap12:body use="literal" />
|
41
|
+
</wsdl:input>
|
42
|
+
<wsdl:output>
|
43
|
+
<soap12:body use="literal" />
|
44
|
+
</wsdl:output>
|
45
|
+
</wsdl:operation>
|
46
|
+
</wsdl:binding>
|
47
|
+
<wsdl:service name="ws_Pharma_V101">
|
48
|
+
<wsdl:port name="ws_Pharma_V101Soap" binding="tns:ws_Pharma_V101Soap">
|
49
|
+
<soap:address location="https://example.com/test" />
|
50
|
+
</wsdl:port>
|
51
|
+
<wsdl:port name="ws_Pharma_V101Soap12" binding="tns:ws_Pharma_V101Soap12">
|
52
|
+
<soap12:address location="https://example.com/test" />
|
53
|
+
</wsdl:port>
|
54
|
+
</wsdl:service>
|
55
|
+
</wsdl:definitions>
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
shared_examples_for 'any downloader' do
|
6
|
+
# this takes 5 sec. by call for sleep
|
7
|
+
it 'should count retry times as retrievable or not' do
|
8
|
+
expect {
|
9
|
+
Array.new(3).map do
|
10
|
+
Thread.new do
|
11
|
+
@downloader.send(:retrievable?).should be(true)
|
12
|
+
end
|
13
|
+
end.map(&:join)
|
14
|
+
}.to change {
|
15
|
+
@downloader.instance_variable_get(:@retry_times)
|
16
|
+
}.from(3).to(0)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe Oddb2xml::BagXmlDownloader do
|
21
|
+
include ServerMockHelper
|
22
|
+
before(:each) do
|
23
|
+
setup_bag_xml_server_mock
|
24
|
+
@downloader = Oddb2xml::BagXmlDownloader.new()
|
25
|
+
end
|
26
|
+
it_behaves_like 'any downloader'
|
27
|
+
context 'when download is called' do
|
28
|
+
let(:xml) { @downloader.download }
|
29
|
+
it 'should parse zip to string' do
|
30
|
+
xml.should be_a String
|
31
|
+
xml.length.should_not == 0
|
32
|
+
end
|
33
|
+
it 'should return valid xml' do
|
34
|
+
xml.should =~ /xml\sversion="1.0"/
|
35
|
+
xml.should =~ /Preparations/
|
36
|
+
xml.should =~ /DescriptionDe/
|
37
|
+
end
|
38
|
+
it 'should cleanup current directory' do
|
39
|
+
xml.should_not raise_error(Timeout::Error)
|
40
|
+
File.exist?('XMLPublications.zip').should be(false)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe Oddb2xml::SwissIndexDownloader do
|
46
|
+
include ServerMockHelper
|
47
|
+
before(:each) do
|
48
|
+
setup_swiss_index_server_mock
|
49
|
+
@downloader = Oddb2xml::SwissIndexDownloader.new()
|
50
|
+
end
|
51
|
+
it_behaves_like 'any downloader'
|
52
|
+
context 'when download_by is called with DE' do
|
53
|
+
let(:xml) { @downloader.download_by('DE') }
|
54
|
+
it 'should parse hash to xml' do
|
55
|
+
xml.should be_a String
|
56
|
+
xml.length.should_not == 0
|
57
|
+
end
|
58
|
+
it 'should return valid xml' do
|
59
|
+
xml.should =~ /xml\sversion="1.0"/
|
60
|
+
xml.should =~ /ITEM/
|
61
|
+
xml.should =~ /PHAR/
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
#
|
8
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
9
|
+
$:.unshift File.dirname(__FILE__)
|
10
|
+
|
11
|
+
require 'bundler/setup'
|
12
|
+
Bundler.require
|
13
|
+
|
14
|
+
require 'rspec'
|
15
|
+
require 'webmock/rspec'
|
16
|
+
require 'oddb2xml'
|
17
|
+
|
18
|
+
module ServerMockHelper
|
19
|
+
def setup_server_mocks
|
20
|
+
setup_bag_xml_server_mock
|
21
|
+
setup_swiss_index_server_mock
|
22
|
+
end
|
23
|
+
def setup_bag_xml_server_mock
|
24
|
+
# zip
|
25
|
+
stub_wsdl_url = 'http://bag.e-mediat.net/SL2007.Web.External/File.axd?file=XMLPublications.zip'
|
26
|
+
stub_response = File.read(File.expand_path('../data/XMLPublications.zip', __FILE__))
|
27
|
+
stub_request(:get, stub_wsdl_url).
|
28
|
+
with(:headers => {
|
29
|
+
'Accept' => '*/*',
|
30
|
+
'Accept-Encoding' => 'gzip,deflate,identity',
|
31
|
+
'Host' => 'bag.e-mediat.net',
|
32
|
+
}).
|
33
|
+
to_return(
|
34
|
+
:status => 200,
|
35
|
+
:headers => {'Content-Type' => 'application/zip; charset=utf-8'},
|
36
|
+
:body => stub_response)
|
37
|
+
end
|
38
|
+
def setup_swiss_index_server_mock
|
39
|
+
# wsdl
|
40
|
+
stub_wsdl_url = 'https://index.ws.e-mediat.net/Swissindex/Pharma/ws_Pharma_V101.asmx?WSDL'
|
41
|
+
stub_response = File.read(File.expand_path('../data/wsdl.xml', __FILE__))
|
42
|
+
stub_request(:get, stub_wsdl_url).
|
43
|
+
with(:headers => {
|
44
|
+
'Accept' => '*/*',
|
45
|
+
'User-Agent' => 'Ruby'}).
|
46
|
+
to_return(
|
47
|
+
:status => 200,
|
48
|
+
:headers => {'Content-Type' => 'text/xml; charset=utf-8'},
|
49
|
+
:body => stub_response)
|
50
|
+
# soap (dummy)
|
51
|
+
stub_soap_url = 'https://example.com/test'
|
52
|
+
stub_response = File.read(File.expand_path('../data/swissindex.xml', __FILE__))
|
53
|
+
stub_request(:post, stub_soap_url).
|
54
|
+
with(:headers => {
|
55
|
+
'Accept' => '*/*',
|
56
|
+
'User-Agent' => 'Ruby'}).
|
57
|
+
to_return(
|
58
|
+
:status => 200,
|
59
|
+
:headers => {'Content-Type' => 'text/xml; chaprset=utf-8'},
|
60
|
+
:body => stub_response)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
RSpec.configure do |config|
|
65
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
66
|
+
config.run_all_when_everything_filtered = true
|
67
|
+
config.filter_run :focus
|
68
|
+
|
69
|
+
# Run specs in random order to surface order dependencies. If you find an
|
70
|
+
# order dependency and want to debug it, you can fix the order by providing
|
71
|
+
# the seed, which is printed after each run.
|
72
|
+
# --seed 1234
|
73
|
+
config.order = 'random'
|
74
|
+
|
75
|
+
# Helper
|
76
|
+
config.include(ServerMockHelper)
|
77
|
+
end
|