oddb2xml 1.3.8 → 1.3.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,9 @@
1
+ === 1.3.9 / 14.02.2013
2
+
3
+ * Add address xml output
4
+ - oddb2xml --context address
5
+ - oddb2xml -x addr
6
+
1
7
  === 1.3.8 / 09.02.2013
2
8
 
3
9
  * Add valid INDEX entries to product.xml
@@ -19,17 +19,17 @@ spec/cli_spec.rb
19
19
  spec/compressor_spec.rb
20
20
  spec/data/XMLPublications.zip
21
21
  spec/data/epha_interactions.csv
22
+ spec/data/medregbm_betrieb.txt
23
+ spec/data/medregbm_person.txt
22
24
  spec/data/oddb2xml_files_bm_update.txt
23
25
  spec/data/oddb2xml_files_lppv.txt
26
+ spec/data/oddb2xml_files_nonpharma.xls
24
27
  spec/data/oddb_article.xml
25
28
  spec/data/oddb_fi.xml
26
29
  spec/data/oddb_fi_product.xml
27
30
  spec/data/oddb_limitation.xml
28
31
  spec/data/oddb_product.xml
29
32
  spec/data/oddb_substance.xml
30
- spec/data/oddb2xml_files_nonpharma.xls
31
- spec/data/oddb2xml_files_lppv.txt
32
- spec/data/oddb2xml_files_bm_update.txt
33
33
  spec/data/swissindex.xml
34
34
  spec/data/swissindex_nonpharma.xml
35
35
  spec/data/swissindex_pharma.xml
data/README.md CHANGED
@@ -229,7 +229,7 @@ You can confirm wit `ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'`.
229
229
  3. Click "Advanced" Tab.
230
230
  4. Click "Environment Variables" button.
231
231
  5. Add set variable entry "SSL\_CERT\_FILE=%HOMEPATH%\cacert.pem"
232
- * Variable name: SSL\_CCERT\_FILE
232
+ * Variable name: SSL\_CERT\_FILE
233
233
  * Variable value: %HOMEPATH%\cacert.pem
234
234
  * with "New..." button into upper are "User variables for xxx"
235
235
  6. Do not remove this cacert.pem. All SSLv3 connections use this file.
@@ -17,21 +17,23 @@ Usage:
17
17
  -c F, --compress=F Compress format F. {tar.gz|zip}
18
18
  -f F, --format=F File format F, default is xml. {xml|dat}
19
19
  If F is given, -o option is ignored.
20
- -o O, --optional=O Optional output. O, only 'fi' is available.
20
+ -o O, --option=O Optional output. O, only 'fi' is available.
21
21
  -i I, --include=I Include target option for 'dat' format. only 'ean14' is available.
22
22
  'xml' format includes always ean14 records.
23
23
  -t S, --tag-suffix=S XML tag suffix S. Default is none. [A-z0-9]
24
24
  If S is given, it is also used as prefix of filename.
25
+ -x X, --context context for address (betrieb and person).
25
26
  -h, --help Show this help message.
26
27
  EOS
27
28
  end
28
29
 
29
30
  parser = OptionParser.new
30
31
  opts = {
32
+ :fi => false,
33
+ :adr => false,
31
34
  :nonpharma => false,
32
35
  :compress_ext => nil,
33
36
  :format => :xml,
34
- :fi => false,
35
37
  :tag_suffix => nil,
36
38
  :debug => false,
37
39
  :ean14 => false,
@@ -40,9 +42,10 @@ opts = {
40
42
  parser.on('-a v', '--append v', /^nonpharma$/) {|v| opts[:nonpharma] = true }
41
43
  parser.on('-c v', '--compress v', /^tar\.gz|zip$/){|v| opts[:compress_ext] = v }
42
44
  parser.on('-f v', '--format v', /^xml|dat$/) {|v| opts[:format] = v.intern }
43
- parser.on('-o v', '--optional v', /^fi$/) {|v| opts[:fi] = true }
45
+ parser.on('-o v', '--option v', /^fi$/) {|v| opts[:fi] = true }
44
46
  parser.on('-i v', '--include v', /^ean14$/) {|v| opts[:ean14] = true }
45
47
  parser.on('-t v', '--tag-suffix v', /^[A-z0-9]*$/i) {|v| opts[:tag_suffix] = v.upcase }
48
+ parser.on('-x v', '--context v', /^addr(ess)*$/i){|v| opts[:address] = true }
46
49
  #parser.on('--debug') {|v| opts[:debug] = true }
47
50
  parser.on_tail('-h', '--help') { puts help; exit }
48
51
 
@@ -20,7 +20,8 @@ module Oddb2xml
20
20
  attr_accessor :subject, :index, :items, :flags, :lppvs,
21
21
  :actions, :migel, :orphans, :fridges,
22
22
  :infos, :packs,
23
- :ean14, :tag_suffix
23
+ :ean14, :tag_suffix,
24
+ :companies, :people
24
25
  def initialize
25
26
  @subject = nil
26
27
  @index = {}
@@ -34,6 +35,8 @@ module Oddb2xml
34
35
  @orphans = []
35
36
  @fridges = []
36
37
  @ean14 = true
38
+ @companies = {}
39
+ @people = {}
37
40
  @tag_suffix = nil
38
41
  if block_given?
39
42
  yield self
@@ -766,6 +769,77 @@ module Oddb2xml
766
769
  end
767
770
  _builder.to_xml
768
771
  end
772
+ def build_company
773
+ _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
774
+ xml.doc.tag_suffix = @tag_suffix
775
+ datetime = Time.new.strftime('%FT%T.%7N%z')
776
+ xml.Betriebe(
777
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
778
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
779
+ 'xmlns' => 'http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration',
780
+ 'CREATION_DATETIME' => datetime,
781
+ 'VALID_DATE' => datetime,
782
+ ) {
783
+ @companies.each_pair do |ean, c|
784
+ xml.Betrieb('DT' => '') {
785
+ xml.GLN_Betrieb ean unless ean.empty?
786
+ xml.Betriebsname_1 c[:name_1] unless c[:name_1].empty?
787
+ xml.Betriebsname_2 c[:name_2] unless c[:name_2].empty?
788
+ xml.Strasse c[:address] unless c[:address].empty?
789
+ xml.Nummer c[:number] unless c[:number].empty?
790
+ xml.PLZ c[:post] unless c[:post].empty?
791
+ xml.Ort c[:place] unless c[:place].empty?
792
+ xml.Bewilligungskanton c[:region] unless c[:region].empty?
793
+ xml.Land c[:country] unless c[:country].empty?
794
+ xml.Betriebstyp c[:type] unless c[:type].empty?
795
+ xml.BTM_Berechtigung c[:authorization] unless c[:authorization].empty?
796
+ }
797
+ end
798
+ xml.RESULT {
799
+ xml.OK_ERROR 'OK'
800
+ xml.NBR_RECORD @companies.values.length
801
+ xml.ERROR_CODE ''
802
+ xml.MESSAGE ''
803
+ }
804
+ }
805
+ end
806
+ _builder.to_xml
807
+ end
808
+ def build_person
809
+ _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
810
+ xml.doc.tag_suffix = @tag_suffix
811
+ datetime = Time.new.strftime('%FT%T.%7N%z')
812
+ xml.Personen(
813
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
814
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
815
+ 'xmlns' => 'http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration',
816
+ 'CREATION_DATETIME' => datetime,
817
+ 'VALID_DATE' => datetime,
818
+ ) {
819
+ @people.each_pair do |ean, p|
820
+ xml.Person('DT' => '') {
821
+ xml.GLN_Person ean unless ean.empty?
822
+ xml.Name p[:last_name] unless p[:last_name].empty?
823
+ xml.Vorname p[:first_name] unless p[:first_name].empty?
824
+ xml.PLZ p[:post] unless p[:post].empty?
825
+ xml.Ort p[:place] unless p[:place].empty?
826
+ xml.Bewilligungskanton p[:region] unless p[:region].empty?
827
+ xml.Land p[:country] unless p[:country].empty?
828
+ xml.Bewilligung_Selbstdispensation p[:lincense] unless p[:license].empty?
829
+ xml.Diplom p[:certificate] unless p[:certificate].empty?
830
+ xml.BTM_Berechtigung p[:authorization] unless p[:authorization].empty?
831
+ }
832
+ end
833
+ xml.RESULT {
834
+ xml.OK_ERROR 'OK'
835
+ xml.NBR_RECORD @people.values.length
836
+ xml.ERROR_CODE ''
837
+ xml.MESSAGE ''
838
+ }
839
+ }
840
+ end
841
+ _builder.to_xml
842
+ end
769
843
 
770
844
  ### --- see oddb2tdat
771
845
  def format_price(price_str, len=6, int_len=4, frac_len=2)
@@ -15,6 +15,7 @@ module Oddb2xml
15
15
  def initialize(args)
16
16
  @options = args
17
17
  @mutex = Mutex.new
18
+ # product
18
19
  @items = {} # Items from Preparations.xml in BAG
19
20
  @index = {} # Base index from swissINDEX
20
21
  @flags = {} # narcotics flag files repo
@@ -25,6 +26,9 @@ module Oddb2xml
25
26
  @actions = [] # [addition] interactions from epha
26
27
  @orphans = [] # [addition] Orphaned drugs from Swissmedic xls
27
28
  @fridges = [] # [addition] ReFridge drugs from Swissmedic xls
29
+ # addres
30
+ @companies = {} # betrieb
31
+ @people = {} # medizinalperson
28
32
  LANGUAGES.each do |lang|
29
33
  @index[lang] = {}
30
34
  end
@@ -32,25 +36,31 @@ module Oddb2xml
32
36
  end
33
37
  def run
34
38
  threads = []
35
- if @options[:format] != :dat
36
- if @options[:fi]
37
- threads << download(:fachinfo) # swissmedic-info
39
+ if @options[:address]
40
+ [:company, :person].each do |type|
41
+ threads << download(type) # medregbm.admin
38
42
  end
39
- [:orphan, :fridge].each do |type|
40
- threads << download(type) # swissmedic
43
+ else
44
+ if @options[:format] != :dat
45
+ if @options[:fi]
46
+ threads << download(:fachinfo) # swissmedic-info
47
+ end
48
+ [:orphan, :fridge].each do |type|
49
+ threads << download(type) # swissmedic
50
+ end
51
+ threads << download(:interaction) # epha
41
52
  end
42
- threads << download(:interaction) # epha
43
- end
44
- if @options[:nonpharma]
45
- threads << download(:migel) # oddb2xml_files
46
- end
47
- threads << download(:package) # swissmedic
48
- threads << download(:bm_update) # oddb2xml_files
49
- threads << download(:lppv) # oddb2xml_files
50
- threads << download(:bag) # bag.e-mediat
51
- LANGUAGES.each do |lang|
52
- types.each do |type|
53
- threads << download(:index, type, lang) # swissindex
53
+ if @options[:nonpharma]
54
+ threads << download(:migel) # oddb2xml_files
55
+ end
56
+ threads << download(:package) # swissmedic
57
+ threads << download(:bm_update) # oddb2xml_files
58
+ threads << download(:lppv) # oddb2xml_files
59
+ threads << download(:bag) # bag.e-mediat
60
+ LANGUAGES.each do |lang|
61
+ types.each do |type|
62
+ threads << download(:index, type, lang) # swissindex
63
+ end
54
64
  end
55
65
  end
56
66
  begin
@@ -75,32 +85,38 @@ module Oddb2xml
75
85
  begin
76
86
  files.each_pair do |sbj, file|
77
87
  builder = Builder.new do |builder|
78
- if @options[:format] != :dat
79
- index = {}
80
- LANGUAGES.each do |lang|
81
- index[lang] = {} unless index[lang]
82
- types.each do |type|
83
- index[lang].merge!(@index[lang][type]) if @index[lang][type]
88
+ if @options[:address]
89
+ builder.subject = sbj
90
+ builder.companies = @companies
91
+ builder.people = @people
92
+ else # product
93
+ if @options[:format] != :dat
94
+ index = {}
95
+ LANGUAGES.each do |lang|
96
+ index[lang] = {} unless index[lang]
97
+ types.each do |type|
98
+ index[lang].merge!(@index[lang][type]) if @index[lang][type]
99
+ end
84
100
  end
101
+ builder.index = index
102
+ builder.subject = sbj
103
+ end
104
+ # common sources
105
+ builder.items = @items
106
+ builder.flags = @flags
107
+ builder.lppvs = @lppvs
108
+ # optional sources
109
+ builder.infos = @infos
110
+ builder.packs = @packs
111
+ # additional sources
112
+ %w[actions orphans fridges migel].each do |addition|
113
+ builder.send("#{addition}=".intern, self.instance_variable_get("@#{addition}"))
85
114
  end
86
- builder.index = index
87
- builder.subject = sbj
88
- end
89
- # common sources
90
- builder.items = @items
91
- builder.flags = @flags
92
- builder.lppvs = @lppvs
93
- # optional sources
94
- builder.infos = @infos
95
- builder.packs = @packs
96
- # additional sources
97
- %w[actions orphans fridges migel].each do |addition|
98
- builder.send("#{addition}=".intern, self.instance_variable_get("@#{addition}"))
99
115
  end
100
116
  builder.tag_suffix = @options[:tag_suffix]
101
117
  end
102
118
  output = ''
103
- if @options[:format] == :dat
119
+ if !@options[:address] and (@options[:format] == :dat)
104
120
  types.each do |type|
105
121
  index = {}
106
122
  LANGUAGES.each do |lang|
@@ -131,6 +147,16 @@ module Oddb2xml
131
147
  end
132
148
  def download(what, type=nil, lang=nil)
133
149
  case what
150
+ when :company, :person
151
+ var = (what == :company ? 'companies' : 'people')
152
+ Thread.new do
153
+ downloader = MedregbmDownloader.new(what)
154
+ str = downloader.download
155
+ self.instance_variable_set(
156
+ "@#{var}".intern,
157
+ MedregbmExtractor.new(str, what).to_hash
158
+ )
159
+ end
134
160
  when :fachinfo
135
161
  Thread.new do
136
162
  downloader = SwissmedicInfoDownloader.new
@@ -141,13 +167,13 @@ module Oddb2xml
141
167
  end
142
168
  end
143
169
  when :orphan, :fridge
144
- type = (what.to_s + "s").intern
170
+ var = what.to_s + 's'
145
171
  Thread.new do
146
- downloader = SwissmedicDownloader.new(type)
172
+ downloader = SwissmedicDownloader.new(what)
147
173
  bin = downloader.download
148
174
  self.instance_variable_set(
149
- "@#{type.to_s}".intern,
150
- SwissmedicExtractor.new(bin, type).to_arry
175
+ "@#{var}".intern,
176
+ SwissmedicExtractor.new(bin, what).to_arry
151
177
  )
152
178
  end
153
179
  when :interaction
@@ -168,10 +194,10 @@ module Oddb2xml
168
194
  end
169
195
  when :package
170
196
  Thread.new do
171
- downloader = SwissmedicDownloader.new(:packages)
197
+ downloader = SwissmedicDownloader.new(:package)
172
198
  bin = downloader.download
173
199
  @mutex.synchronize do
174
- @packs = SwissmedicExtractor.new(bin, :packages).to_hash
200
+ @packs = SwissmedicExtractor.new(bin, :package).to_hash
175
201
  end
176
202
  end
177
203
  when :bm_update
@@ -231,7 +257,10 @@ module Oddb2xml
231
257
  def files
232
258
  unless @_files
233
259
  @_files = {}
234
- if @options[:format] == :dat
260
+ if @options[:address]
261
+ @_files[:company] = "#{prefix}_betrieb.xml"
262
+ @_files[:person] = "#{prefix}_medizinalperson.xml"
263
+ elsif @options[:format] == :dat
235
264
  @_files[:dat] = "#{prefix}.dat"
236
265
  if @options[:nonpharma] # into one file
237
266
  @_files[:dat] = "#{prefix}_with_migel.dat"
@@ -255,18 +284,20 @@ module Oddb2xml
255
284
  @_prefix ||= (@options[:tag_suffix] || 'oddb').gsub(/^_|_$/, '').downcase
256
285
  end
257
286
  def report
258
- lines = []
259
- LANGUAGES.each do |lang|
260
- lines << lang
261
- types.each do |type|
262
- key = (type == :nonpharma ? 'NonPharma' : 'Pharma')
263
- if @index[lang][type]
264
- lines << sprintf(
265
- "\t#{key} products: %i", @index[lang][type].values.length)
287
+ unless @options[:address]
288
+ lines = []
289
+ LANGUAGES.each do |lang|
290
+ lines << lang
291
+ types.each do |type|
292
+ key = (type == :nonpharma ? 'NonPharma' : 'Pharma')
293
+ if @index[lang][type]
294
+ lines << sprintf(
295
+ "\t#{key} products: %i", @index[lang][type].values.length)
296
+ end
266
297
  end
267
298
  end
299
+ puts lines.join("\n")
268
300
  end
269
- puts lines.join("\n")
270
301
  end
271
302
  def types # swissindex
272
303
  @_types ||=
@@ -5,6 +5,25 @@ require 'zip/zip'
5
5
  require 'savon'
6
6
 
7
7
  module Oddb2xml
8
+ module DownloadMethod
9
+ private
10
+ def download_as(file, option='r')
11
+ begin
12
+ response = @agent.get(@url)
13
+ response.save_as(file)
14
+ response = nil # win
15
+ io = File.open(file, option)
16
+ return io.read
17
+ rescue Timeout::Error
18
+ retrievable? ? retry : raise
19
+ ensure
20
+ io.close if io and !io.closed? # win
21
+ if File.exists?(file)
22
+ File.unlink(file)
23
+ end
24
+ end
25
+ end
26
+ end
8
27
  class Downloader
9
28
  def initialize(options={}, url=nil)
10
29
  @options = options
@@ -56,6 +75,53 @@ module Oddb2xml
56
75
  xml
57
76
  end
58
77
  end
78
+ class MigelDownloader < Downloader
79
+ include DownloadMethod
80
+ def download
81
+ @url ||= 'https://github.com/zdavatz/oddb2xml_files/raw/master/NON-Pharma.xls'
82
+ download_as('oddb2xml_files_nonpharma.xls', 'rb')
83
+ end
84
+ end
85
+ class EphaDownloader < Downloader
86
+ include DownloadMethod
87
+ def download
88
+ @url ||= 'http://community.epha.ch/interactions_de_utf8.csv'
89
+ download_as('epha_interactions.csv', 'r')
90
+ end
91
+ end
92
+ class BMUpdateDownloader < Downloader
93
+ include DownloadMethod
94
+ def download
95
+ @url ||= 'https://raw.github.com/zdavatz/oddb2xml_files/master/BM_Update.txt'
96
+ download_as('oddb2xml_files_bm_update.txt', 'r')
97
+ end
98
+ end
99
+ class LppvDownloader < Downloader
100
+ include DownloadMethod
101
+ def download
102
+ @url ||= 'https://raw.github.com/zdavatz/oddb2xml_files/master/LPPV.txt'
103
+ download_as('oddb2xml_files_lppv.txt', 'r')
104
+ end
105
+ end
106
+ class MedregbmDownloader < Downloader
107
+ include DownloadMethod
108
+ def initialize(type=:company)
109
+ @type = type
110
+ case @type
111
+ when :company # betrieb
112
+ action = 'CreateExcelListBetriebs'
113
+ when :person # medizinalperson
114
+ action = 'CreateExcelListMedizinalPersons'
115
+ else
116
+ action = ''
117
+ end
118
+ url = "https://www.medregbm.admin.ch/Publikation/#{action}"
119
+ super({}, url)
120
+ end
121
+ def download
122
+ download_as("medregbm_#{@type.to_s}.txt", 'r:iso-8859-1:utf-8')
123
+ end
124
+ end
59
125
  class BagXmlDownloader < Downloader
60
126
  def init
61
127
  super
@@ -131,16 +197,16 @@ XML
131
197
  end
132
198
  end
133
199
  class SwissmedicDownloader < Downloader
134
- def initialize(type=:orphans)
200
+ def initialize(type=:orphan)
135
201
  @type = type
136
202
  case @type
137
- when :orphans
203
+ when :orphan
138
204
  action = "daten/00081/index.html?lang=de"
139
205
  @xpath = "//div[@id='sprungmarke0_4']//a[@title='Humanarzneimittel']"
140
- when :fridges
206
+ when :fridge
141
207
  action = "daten/00080/00254/index.html?lang=de"
142
208
  @xpath = "//table[@class='swmTableFlex']//a[@title='B3.1.35-d.xls']"
143
- when :packages
209
+ when :package
144
210
  action = "daten/00080/00251/index.html?lang=de"
145
211
  @xpath = "//div[@id='sprungmarke0_7']//a[@title='Excel-Version Zugelassene Verpackungen*']"
146
212
  end
@@ -169,29 +235,6 @@ XML
169
235
  end
170
236
  end
171
237
  end
172
- class MigelDownloader < Downloader
173
- def init
174
- super
175
- @url ||= 'https://github.com/zdavatz/oddb2xml_files/raw/master/NON-Pharma.xls'
176
- end
177
- def download
178
- file = "oddb2xml_files_nonpharma.xls"
179
- begin
180
- response = @agent.get(@url)
181
- response.save_as(file)
182
- response = nil # win
183
- io = File.open(file, 'rb')
184
- return io.read
185
- rescue Timeout::Error
186
- retrievable? ? retry : raise
187
- ensure
188
- io.close if io and !io.closed? # win
189
- if File.exists?(file)
190
- File.unlink(file)
191
- end
192
- end
193
- end
194
- end
195
238
  class SwissmedicInfoDownloader < Downloader
196
239
  def init
197
240
  super
@@ -235,68 +278,4 @@ XML
235
278
  end
236
279
  end
237
280
  end
238
- class EphaDownloader < Downloader
239
- def init
240
- super
241
- @url ||= 'http://community.epha.ch/interactions_de_utf8.csv'
242
- end
243
- def download
244
- file = "epha_interactions.csv"
245
- begin
246
- response = @agent.get(@url)
247
- response.save_as(file)
248
- response = nil # win
249
- io = File.open(file, 'r')
250
- return io.read
251
- rescue Timeout::Error
252
- retrievable? ? retry : raise
253
- ensure
254
- io.close if io and !io.closed? # win
255
- if File.exists?(file)
256
- File.unlink(file)
257
- end
258
- end
259
- end
260
- end
261
- # txt filse
262
- module TxtDownloadMethods
263
- def download_as(file)
264
- begin
265
- response = @agent.get(@url)
266
- response.save_as(file)
267
- response = nil # win
268
- io = File.open(file, 'r')
269
- return io.read
270
- rescue Timeout::Error
271
- retrievable? ? retry : raise
272
- ensure
273
- io.close if io and !io.closed? # win
274
- if File.exists?(file)
275
- File.unlink(file)
276
- end
277
- end
278
- end
279
- end
280
- class BMUpdateDownloader < Downloader
281
- include TxtDownloadMethods
282
- def init
283
- super
284
- @url ||= 'https://raw.github.com/zdavatz/oddb2xml_files/master/BM_Update.txt'
285
- end
286
- def download
287
- file = 'oddb2xml_files_bm_update.txt'
288
- download_as(file)
289
- end
290
- end
291
- class LppvDownloader < Downloader
292
- include TxtDownloadMethods
293
- def init
294
- super
295
- @url ||= 'https://raw.github.com/zdavatz/oddb2xml_files/master/LPPV.txt'
296
- end
297
- def download
298
- file = 'oddb2xml_files_lppv.txt'
299
- download_as(file)
300
- end
301
- end
302
281
  end
@@ -5,12 +5,32 @@ require 'spreadsheet'
5
5
  require 'stringio'
6
6
 
7
7
  module Oddb2xml
8
+ module TxtExtractorMethods
9
+ def initialize(str)
10
+ @io = StringIO.new(str)
11
+ end
12
+ def to_hash
13
+ data = {}
14
+ while line = @io.gets
15
+ next unless line =~ /\d{13}/
16
+ ean = line.chomp.gsub("\"", '')
17
+ data[ean] = true
18
+ end
19
+ data
20
+ end
21
+ end
8
22
  class Extractor
9
23
  attr_accessor :xml
10
24
  def initialize(xml)
11
25
  @xml = xml
12
26
  end
13
27
  end
28
+ class BMUpdateExtractor < Extractor
29
+ include TxtExtractorMethods
30
+ end
31
+ class LppvExtractor < Extractor
32
+ include TxtExtractorMethods
33
+ end
14
34
  class BagXmlExtractor < Extractor
15
35
  def to_hash
16
36
  data = {}
@@ -167,21 +187,21 @@ module Oddb2xml
167
187
  class SwissmedicExtractor < Extractor
168
188
  def initialize(bin, type)
169
189
  io = StringIO.new(bin)
170
- book = Spreadsheet.open(io)
190
+ book = Spreadsheet.open(io, 'rb')
171
191
  @sheet = book.worksheet(0)
172
192
  @type = type
173
193
  end
174
194
  def to_arry
175
195
  data = []
176
196
  case @type
177
- when :orphans
197
+ when :orphan
178
198
  i = 1
179
199
  @sheet.each do |row|
180
200
  if number = extract_number(row, i)
181
201
  data << number.to_s
182
202
  end
183
203
  end
184
- when :fridges
204
+ when :fridge
185
205
  i,c = 1,7
186
206
  @sheet.each do |row|
187
207
  if number = extract_number(row, i) and row[c] and row[c].to_s == 'x'
@@ -194,7 +214,7 @@ module Oddb2xml
194
214
  def to_hash # Packungen.xls
195
215
  data = {}
196
216
  case @type
197
- when :packages
217
+ when :package
198
218
  typ = 6 # Heilmittelcode
199
219
  i_5,i_3 = 0,10 # :swissmedic_numbers
200
220
  cat = 13 # :swissmedic_category
@@ -253,13 +273,13 @@ module Oddb2xml
253
273
  class MigelExtractor < Extractor
254
274
  def initialize(bin)
255
275
  io = StringIO.new(bin)
256
- book = Spreadsheet.open(io)
276
+ book = Spreadsheet.open(io, 'rb')
257
277
  @sheet = book.worksheet(0)
258
278
  end
259
279
  def to_hash
260
280
  data = {}
261
281
  @sheet.each_with_index do |row, i|
262
- next if i == 0
282
+ next if i.zero?
263
283
  phar = row[1].to_s
264
284
  data[phar] = {
265
285
  :ean => row[0].to_i.to_s,
@@ -328,25 +348,53 @@ module Oddb2xml
328
348
  data
329
349
  end
330
350
  end
331
- # txt files
332
- module TxtMethods
333
- def initialize(str)
334
- @io = StringIO.new(str)
351
+ class MedregbmExtractor < Extractor
352
+ def initialize(str, type)
353
+ @io = StringIO.new(str)
354
+ @type = type
335
355
  end
336
356
  def to_hash
337
357
  data = {}
338
- while line = @io.gets
339
- next unless line =~ /\d{13}/
340
- ean = line.chomp.gsub("\"", '')
341
- data[ean] = true
358
+ case @type
359
+ when :company
360
+ while line = @io.gets
361
+ row = line.chomp.split("\t")
362
+ next if row[0] =~ /^GLN/
363
+ gln = row[0].to_s
364
+ data[gln] = {
365
+ :gln => gln, #=> GLN Betrieb
366
+ :name_1 => row[1].to_s, #=> Betriebsname 1
367
+ :name_2 => row[2].to_s, #=> Betriebsname 2
368
+ :address => row[3].to_s, #=> Strasse
369
+ :number => row[4].to_s, #=> Nummer
370
+ :post => row[5].to_s, #=> PLZ
371
+ :place => row[6].to_s, #=> Ort
372
+ :region => row[7].to_s, #=> Bewilligungskanton
373
+ :country => row[8].to_s, #=> Land
374
+ :type => row[9].to_s, #=> Betriebstyp
375
+ :authorization => row[10].to_s, #=> BTM Berechtigung
376
+ }
377
+ end
378
+ when :person
379
+ while line = @io.gets
380
+ row = line.chomp.split("\t")
381
+ next if row[0] =~ /^GLN/
382
+ gln = row[0].to_s
383
+ data[gln] = {
384
+ :gln => gln, #=> GLN Person
385
+ :last_name => row[1].to_s, #=> Name
386
+ :first_name => row[2].to_s, #=> Vorname
387
+ :post => row[3].to_s, #=> PLZ
388
+ :place => row[4].to_s, #=> Ort
389
+ :region => row[5].to_s, #=> Bewilligungskanton
390
+ :country => row[6].to_s, #=> Land
391
+ :license => row[7].to_s, #=> Bewilligung Selbstdispensation
392
+ :certificate => row[8].to_s, #=> Diplom
393
+ :authorization => row[9].to_s, #=> BTM Berechtigung
394
+ }
395
+ end
342
396
  end
343
397
  data
344
398
  end
345
399
  end
346
- class BMUpdateExtractor < Extractor
347
- include TxtMethods
348
- end
349
- class LppvExtractor < Extractor
350
- include TxtMethods
351
- end
352
400
  end
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "1.3.8"
2
+ VERSION = "1.3.9"
3
3
  end
@@ -14,7 +14,7 @@ RSpec::Matchers.define :have_option do |option|
14
14
  end
15
15
  end
16
16
 
17
- shared_examples_for 'any interface' do
17
+ shared_examples_for 'any interface for product' do
18
18
  it { cli.should respond_to(:run) }
19
19
  it 'should run successfully' do
20
20
  $stdout.should_receive(:puts).with(/products/)
@@ -22,6 +22,14 @@ shared_examples_for 'any interface' do
22
22
  end
23
23
  end
24
24
 
25
+ shared_examples_for 'any interface for address' do
26
+ it { cli.should respond_to(:run) }
27
+ it 'should run successfully' do
28
+ $stdout.should_not_receive(:puts) # no output
29
+ cli.run
30
+ end
31
+ end
32
+
25
33
  describe Oddb2xml::Cli do
26
34
  include ServerMockHelper
27
35
  before(:each) do
@@ -33,11 +41,12 @@ describe Oddb2xml::Cli do
33
41
  :compress_ext => 'tar.gz',
34
42
  :nonpharma => false,
35
43
  :fi => false,
44
+ :address => false,
36
45
  :tag_suffix => nil,
37
46
  }
38
47
  Oddb2xml::Cli.new(opts)
39
48
  end
40
- it_behaves_like 'any interface'
49
+ it_behaves_like 'any interface for product'
41
50
  it 'should have compress option' do
42
51
  cli.should have_option(:compress_ext => 'tar.gz')
43
52
  end
@@ -66,11 +75,12 @@ describe Oddb2xml::Cli do
66
75
  :compress_ext => 'zip',
67
76
  :nonpharma => false,
68
77
  :fi => false,
78
+ :address => false,
69
79
  :tag_suffix => nil,
70
80
  }
71
81
  Oddb2xml::Cli.new(opts)
72
82
  end
73
- it_behaves_like 'any interface'
83
+ it_behaves_like 'any interface for product'
74
84
  it 'should have compress option' do
75
85
  cli.should have_option(:compress_ext => 'zip')
76
86
  end
@@ -99,11 +109,12 @@ describe Oddb2xml::Cli do
99
109
  :compress_ext => nil,
100
110
  :nonpharma => true,
101
111
  :fi => false,
112
+ :address => false,
102
113
  :tag_suffix => nil,
103
114
  }
104
115
  Oddb2xml::Cli.new(opts)
105
116
  end
106
- it_behaves_like 'any interface'
117
+ it_behaves_like 'any interface for product'
107
118
  it 'should have nonpharma option' do
108
119
  cli.should have_option(:nonpharma => true)
109
120
  end
@@ -140,11 +151,12 @@ describe Oddb2xml::Cli do
140
151
  :compress_ext => nil,
141
152
  :nonpharma => false,
142
153
  :fi => false,
154
+ :address => false,
143
155
  :tag_suffix => '_swiss'.upcase,
144
156
  }
145
157
  Oddb2xml::Cli.new(opts)
146
158
  end
147
- it_behaves_like 'any interface'
159
+ it_behaves_like 'any interface for product'
148
160
  it 'should have tag_suffix option' do
149
161
  cli.should have_option(:tag_suffix=> '_SWISS')
150
162
  end
@@ -181,11 +193,12 @@ describe Oddb2xml::Cli do
181
193
  :compress_ext => nil,
182
194
  :nonpharma => false,
183
195
  :fi => true,
196
+ :address => false,
184
197
  :tag_suffix => nil,
185
198
  }
186
199
  Oddb2xml::Cli.new(opts)
187
200
  end
188
- it_behaves_like 'any interface'
201
+ it_behaves_like 'any interface for product'
189
202
  it 'should have nonpharma option' do
190
203
  cli.should have_option(:fi => true)
191
204
  end
@@ -218,4 +231,40 @@ describe Oddb2xml::Cli do
218
231
  end
219
232
  end
220
233
  end
234
+ context 'when -x address option is given' do
235
+ let(:cli) do
236
+ opts = {
237
+ :compress_ext => nil,
238
+ :nonpharma => false,
239
+ :fi => false,
240
+ :address => true,
241
+ :tag_suffix => nil,
242
+ }
243
+ Oddb2xml::Cli.new(opts)
244
+ end
245
+ it_behaves_like 'any interface for address'
246
+ it 'should have address option' do
247
+ cli.should have_option(:address=> true)
248
+ end
249
+ it 'should not create any compressed file' do
250
+ cli.run
251
+ Dir.glob('oddb_*.tar.gz').first.should be_nil
252
+ Dir.glob('oddb_*.zip').first.should be_nil
253
+ end
254
+ it 'should create xml files' do
255
+ cli.run
256
+ expected = [
257
+ 'oddb_betrieb.xml',
258
+ 'oddb_medizinalperson.xml',
259
+ ].length
260
+ Dir.glob('oddb_*.xml').each do |file|
261
+ File.exists?(file).should be_true
262
+ end.to_a.length.should equal expected
263
+ end
264
+ after(:each) do
265
+ Dir.glob('oddb_*.xml').each do |file|
266
+ File.unlink(file) if File.exists?(file)
267
+ end
268
+ end
269
+ end
221
270
  end
File without changes
File without changes
@@ -87,13 +87,13 @@ end
87
87
 
88
88
  describe Oddb2xml::SwissmedicDownloader do
89
89
  include ServerMockHelper
90
- context 'orphans' do
90
+ context 'orphan' do
91
91
  before(:each) do
92
92
  setup_swissmedic_server_mock
93
- @downloader = Oddb2xml::SwissmedicDownloader.new(:orphans)
93
+ @downloader = Oddb2xml::SwissmedicDownloader.new(:orphan)
94
94
  end
95
95
  it_behaves_like 'any downloader'
96
- context 'download_by for orphans xls' do
96
+ context 'download_by for orphan xls' do
97
97
  let(:bin) { @downloader.download }
98
98
  it 'should return valid Binary-String' do
99
99
  bin.should be_a String
@@ -101,16 +101,16 @@ describe Oddb2xml::SwissmedicDownloader do
101
101
  end
102
102
  it 'should clean up current directory' do
103
103
  bin.should_not raise_error(Timeout::Error)
104
- File.exist?('oddb_orphans.xls').should be(false)
104
+ File.exist?('oddb_orphan.xls').should be(false)
105
105
  end
106
106
  end
107
107
  end
108
- context 'fridges' do
108
+ context 'fridge' do
109
109
  before(:each) do
110
110
  setup_swissmedic_server_mock
111
- @downloader = Oddb2xml::SwissmedicDownloader.new(:fridges)
111
+ @downloader = Oddb2xml::SwissmedicDownloader.new(:fridge)
112
112
  end
113
- context 'download_by for fridges xls' do
113
+ context 'download_by for fridge xls' do
114
114
  let(:bin) { @downloader.download }
115
115
  it 'should return valid Binary-String' do
116
116
  bin.should be_a String
@@ -118,16 +118,16 @@ describe Oddb2xml::SwissmedicDownloader do
118
118
  end
119
119
  it 'should clean up current directory' do
120
120
  bin.should_not raise_error(Timeout::Error)
121
- File.exist?('oddb_fridges.xls').should be(false)
121
+ File.exist?('oddb_fridge.xls').should be(false)
122
122
  end
123
123
  end
124
124
  end
125
- context 'packages' do
125
+ context 'package' do
126
126
  before(:each) do
127
127
  setup_swissmedic_server_mock
128
- @downloader = Oddb2xml::SwissmedicDownloader.new(:packages)
128
+ @downloader = Oddb2xml::SwissmedicDownloader.new(:package)
129
129
  end
130
- context 'download_by for packages xls' do
130
+ context 'download_by for package xls' do
131
131
  let(:bin) { @downloader.download }
132
132
  it 'should return valid Binary-String' do
133
133
  bin.should be_a String
@@ -135,7 +135,7 @@ describe Oddb2xml::SwissmedicDownloader do
135
135
  end
136
136
  it 'should clean up current directory' do
137
137
  bin.should_not raise_error(Timeout::Error)
138
- File.exist?('oddb_packages.xls').should be(false)
138
+ File.exist?('oddb_package.xls').should be(false)
139
139
  end
140
140
  end
141
141
  end
@@ -245,3 +245,42 @@ describe Oddb2xml::MigelDownloader do
245
245
  end
246
246
  end
247
247
  end
248
+
249
+ describe Oddb2xml::MedregbmDownloader do
250
+ include ServerMockHelper
251
+ context 'betrieb' do
252
+ before(:each) do
253
+ setup_medregbm_server_mock
254
+ @downloader = Oddb2xml::MedregbmDownloader.new(:company)
255
+ end
256
+ it_behaves_like 'any downloader'
257
+ context 'download betrieb txt' do
258
+ let(:txt) { @downloader.download }
259
+ it 'should return valid String' do
260
+ txt.should be_a String
261
+ txt.bytes.should_not nil
262
+ end
263
+ it 'should clean up current directory' do
264
+ txt.should_not raise_error(Timeout::Error)
265
+ File.exist?('oddb_company.xls').should be(false)
266
+ end
267
+ end
268
+ end
269
+ context 'person' do
270
+ before(:each) do
271
+ setup_medregbm_server_mock
272
+ @downloader = Oddb2xml::MedregbmDownloader.new(:person)
273
+ end
274
+ context 'download person txt' do
275
+ let(:txt) { @downloader.download }
276
+ it 'should return valid String' do
277
+ txt.should be_a String
278
+ txt.bytes.should_not nil
279
+ end
280
+ it 'should clean up current directory' do
281
+ txt.should_not raise_error(Timeout::Error)
282
+ File.exist?('oddb_person.xls').should be(false)
283
+ end
284
+ end
285
+ end
286
+ end
@@ -25,6 +25,7 @@ module ServerMockHelper
25
25
  setup_bm_update_server_mock
26
26
  setup_lppv_server_mock
27
27
  setup_migel_server_mock
28
+ setup_medregbm_server_mock
28
29
  end
29
30
  def setup_bag_xml_server_mock
30
31
  # zip
@@ -199,6 +200,32 @@ module ServerMockHelper
199
200
  :headers => {'Content-Type' => 'application/octet-stream; charset=utf-8'},
200
201
  :body => stub_response)
201
202
  end
203
+ def setup_medregbm_server_mock
204
+ # txt betrieb
205
+ stub_txt_url = 'https://www.medregbm.admin.ch/Publikation/CreateExcelListBetriebs'
206
+ stub_response = File.read(File.expand_path('../data/medregbm_betrieb.txt', __FILE__))
207
+ stub_request(:get, stub_txt_url).
208
+ with(:headers => {
209
+ 'Accept' => '*/*',
210
+ 'Host' => 'www.medregbm.admin.ch',
211
+ }).
212
+ to_return(
213
+ :status => 200,
214
+ :headers => {'Content-Type' => 'text/plain; charset=utf-8'},
215
+ :body => stub_response)
216
+ stub_txt_url = 'https://www.medregbm.admin.ch/Publikation/CreateExcelListMedizinalPersons'
217
+ # txt person
218
+ stub_response = File.read(File.expand_path('../data/medregbm_person.txt', __FILE__))
219
+ stub_request(:get, stub_txt_url).
220
+ with(:headers => {
221
+ 'Accept' => '*/*',
222
+ 'Host' => 'www.medregbm.admin.ch',
223
+ }).
224
+ to_return(
225
+ :status => 200,
226
+ :headers => {'Content-Type' => 'text/plain; charset=utf-8'},
227
+ :body => stub_response)
228
+ end
202
229
  end
203
230
 
204
231
  RSpec.configure do |config|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oddb2xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.8
4
+ version: 1.3.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-09 00:00:00.000000000 Z
12
+ date: 2013-02-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubyzip
16
- requirement: &17599500 !ruby/object:Gem::Requirement
16
+ requirement: &19384600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *17599500
24
+ version_requirements: *19384600
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: archive-tar-minitar
27
- requirement: &17598980 !ruby/object:Gem::Requirement
27
+ requirement: &19384140 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *17598980
35
+ version_requirements: *19384140
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mechanize
38
- requirement: &17598420 !ruby/object:Gem::Requirement
38
+ requirement: &19383700 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *17598420
46
+ version_requirements: *19383700
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: nokogiri
49
- requirement: &17597680 !ruby/object:Gem::Requirement
49
+ requirement: &19383200 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *17597680
57
+ version_requirements: *19383200
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: savon
60
- requirement: &17596580 !ruby/object:Gem::Requirement
60
+ requirement: &19382620 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '2.0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *17596580
68
+ version_requirements: *19382620
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: spreadsheet
71
- requirement: &17596100 !ruby/object:Gem::Requirement
71
+ requirement: &19255580 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *17596100
79
+ version_requirements: *19255580
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &17595560 !ruby/object:Gem::Requirement
82
+ requirement: &19254720 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *17595560
90
+ version_requirements: *19254720
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: webmock
93
- requirement: &17594800 !ruby/object:Gem::Requirement
93
+ requirement: &19253480 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *17594800
101
+ version_requirements: *19253480
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: ZenTest
104
- requirement: &17593260 !ruby/object:Gem::Requirement
104
+ requirement: &19252640 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *17593260
112
+ version_requirements: *19252640
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: hoe
115
- requirement: &17590480 !ruby/object:Gem::Requirement
115
+ requirement: &19251860 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '3.4'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *17590480
123
+ version_requirements: *19251860
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rdoc
126
- requirement: &17554860 !ruby/object:Gem::Requirement
126
+ requirement: &19250720 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *17554860
134
+ version_requirements: *19250720
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rdoc
137
- requirement: &17553900 !ruby/object:Gem::Requirement
137
+ requirement: &19247520 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '3.10'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *17553900
145
+ version_requirements: *19247520
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: hoe
148
- requirement: &17553160 !ruby/object:Gem::Requirement
148
+ requirement: &19246620 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,7 +153,7 @@ dependencies:
153
153
  version: '2.13'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *17553160
156
+ version_requirements: *19246620
157
157
  description: oddb2xml creates xml files using swissINDEX, BAG-XML and Swissmedic.
158
158
  email: yasaka@ywesee.com, zdavatz@ywesee.com
159
159
  executables:
@@ -184,15 +184,17 @@ files:
184
184
  - spec/compressor_spec.rb
185
185
  - spec/data/XMLPublications.zip
186
186
  - spec/data/epha_interactions.csv
187
+ - spec/data/medregbm_betrieb.txt
188
+ - spec/data/medregbm_person.txt
187
189
  - spec/data/oddb2xml_files_bm_update.txt
188
190
  - spec/data/oddb2xml_files_lppv.txt
191
+ - spec/data/oddb2xml_files_nonpharma.xls
189
192
  - spec/data/oddb_article.xml
190
193
  - spec/data/oddb_fi.xml
191
194
  - spec/data/oddb_fi_product.xml
192
195
  - spec/data/oddb_limitation.xml
193
196
  - spec/data/oddb_product.xml
194
197
  - spec/data/oddb_substance.xml
195
- - spec/data/oddb2xml_files_nonpharma.xls
196
198
  - spec/data/swissindex.xml
197
199
  - spec/data/swissindex_nonpharma.xml
198
200
  - spec/data/swissindex_pharma.xml