oddb2xml 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,14 +1,3 @@
1
1
  source :rubygems
2
2
 
3
- gem 'rubyzip'
4
- gem 'archive-tar-minitar'
5
- gem 'mechanize'
6
- gem 'nokogiri'
7
- gem 'savon', '>= 2.0'
8
- gem 'spreadsheet'
9
-
10
- group :development do
11
- gem 'rspec'
12
- gem 'webmock'
13
- gem 'ZenTest'
14
- end
3
+ gemspec
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ === 1.1.3 / 09.01.2013
2
+
3
+ * Add interaction.xml and code.xml output
4
+ * Update to check option fi
5
+ * Improve using of memory at file reading for mswin
6
+ * Add oddb_fi_product.xml output to fi option
7
+ * Restore Gemfile to use gemspec file
8
+
1
9
  === 1.1.2 / 08.01.2013
2
10
 
3
11
  * Update Gemfile for development
data/Manifest.txt CHANGED
@@ -14,11 +14,15 @@ lib/oddb2xml/compressor.rb
14
14
  lib/oddb2xml/downloader.rb
15
15
  lib/oddb2xml/extractor.rb
16
16
  lib/oddb2xml/version.rb
17
+ oddb2xml.gemspec
17
18
  spec/builder_spec.rb
18
19
  spec/cli_spec.rb
19
20
  spec/compressor_spec.rb
20
21
  spec/data/XMLPublications.zip
22
+ spec/data/epha_interactions.csv
21
23
  spec/data/oddb_article.xml
24
+ spec/data/oddb_fi.xml
25
+ spec/data/oddb_fi_product.xml
22
26
  spec/data/oddb_limitation.xml
23
27
  spec/data/oddb_product.xml
24
28
  spec/data/oddb_substance.xml
@@ -29,6 +33,7 @@ spec/data/swissmedic_fridges.html
29
33
  spec/data/swissmedic_fridges.xls
30
34
  spec/data/swissmedic_info.html
31
35
  spec/data/swissmedic_info.zip
36
+ spec/data/swissmedic_info_2.html
32
37
  spec/data/swissmedic_orphans.html
33
38
  spec/data/swissmedic_orphans.xls
34
39
  spec/data/wsdl.xml
@@ -17,14 +17,17 @@ end
17
17
 
18
18
  module Oddb2xml
19
19
  class Builder
20
- attr_accessor :subject, :index, :items, :infos,
20
+ attr_accessor :subject, :index, :items,
21
+ :actions,
21
22
  :orphans, :fridges,
23
+ :infos,
22
24
  :tag_suffix
23
25
  def initialize
24
26
  @subject = nil
25
27
  @index = {}
26
28
  @items = {}
27
29
  @infos = {}
30
+ @actions = []
28
31
  @orphans = []
29
32
  @fridges = []
30
33
  @tag_suffix = nil
@@ -40,6 +43,21 @@ module Oddb2xml
40
43
  end
41
44
  end
42
45
  private
46
+ def prepare_articles
47
+ unless @articles
48
+ @articles = [] # base is 'DE'
49
+ @index['DE'].each_pair do |pharmacode, index|
50
+ object = {
51
+ :de => index,
52
+ :fr => @index['FR'][pharmacode],
53
+ }
54
+ if seq = @items[pharmacode]
55
+ object[:seq] = seq
56
+ end
57
+ @articles << object
58
+ end
59
+ end
60
+ end
43
61
  def prepare_substances
44
62
  unless @substances
45
63
  @substances = []
@@ -64,6 +82,45 @@ module Oddb2xml
64
82
  @limitations.sort_by!{|lim| lim[:code] }
65
83
  end
66
84
  end
85
+ def prepare_interactions
86
+ unless @interactions
87
+ @interactions = []
88
+ @actions.each do |act|
89
+ @interactions << act
90
+ end
91
+ end
92
+ end
93
+ def prepare_codes
94
+ unless @codes
95
+ @codes = {
96
+ 'X' => {:int => 11, :txt => 'Kontraindiziert'},
97
+ 'E' => {:int => 12, :txt => 'Kontraindiziert'},
98
+ 'D' => {:int => 13, :txt => 'Kombination meiden'},
99
+ 'C' => {:int => 14, :txt => 'Monitorisieren'},
100
+ 'B' => {:int => 15, :txt => 'Vorsichtsmassnahmen'},
101
+ 'A' => {:int => 16, :txt => 'keine Massnahmen'}
102
+ }
103
+ end
104
+ end
105
+ def prepare_products
106
+ unless @products
107
+ # merge company info from swissINDEX
108
+ @products = []
109
+ @products = @items.values.uniq.map do |seq|
110
+ %w[de fr].each do |lang|
111
+ name_key = "company_name_#{lang}".intern
112
+ seq[name_key] = ''
113
+ if pharmacode = seq[:pharmacodes].first
114
+ indices = @index[lang.upcase]
115
+ if index = indices[pharmacode]
116
+ seq[name_key] = index[:company_name]
117
+ end
118
+ end
119
+ end
120
+ seq
121
+ end
122
+ end
123
+ end
67
124
  def build_substance
68
125
  prepare_substances
69
126
  _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
@@ -133,23 +190,109 @@ module Oddb2xml
133
190
  end
134
191
  _builder.to_xml
135
192
  end
136
- def build_product
137
- prepare_substances
138
- # merge company info from swissINDEX
139
- objects = []
140
- objects = @items.values.uniq.map do |seq|
141
- %w[de fr].each do |lang|
142
- name_key = "company_name_#{lang}".intern
143
- seq[name_key] = ''
144
- if pharmacode = seq[:pharmacodes].first
145
- indices = @index[lang.upcase]
146
- if index = indices[pharmacode]
147
- seq[name_key] = index[:company_name]
148
- end
193
+ def build_interaction
194
+ prepare_interactions
195
+ prepare_codes
196
+ _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
197
+ xml.doc.tag_suffix = @tag_suffix
198
+ datetime = Time.new.strftime('%FT%T.%7N%z')
199
+ xml.INTERACTION(
200
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
201
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
202
+ 'xmlns' => 'http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration',
203
+ 'CREATION_DATETIME' => datetime,
204
+ 'PROD_DATE' => datetime,
205
+ 'VALID_DATE' => datetime,
206
+ ) {
207
+ @interactions.sort_by{|ix| ix[:ixno] }.each do |ix|
208
+ xml.IX('DT' => '') {
209
+ xml.IXNO ix[:ixno]
210
+ #xml.TITD
211
+ #xml.TITF
212
+ xml.GRP1D ix[:atc1]
213
+ #xml.GRP1F
214
+ xml.GRP2D ix[:atc2]
215
+ #xml.GRP2F
216
+ xml.EFFD ix[:effect]
217
+ #xml.EFFF
218
+ if dict = @codes[ix[:grad].upcase]
219
+ xml.RLV dict[:int]
220
+ xml.RLVD dict[:txt]
221
+ #xml.RLVF
222
+ end
223
+ #xml.EFFTXTD
224
+ #xml.EFFTXTF
225
+ xml.MECHD ix[:mechanism]
226
+ #xml.MECHF
227
+ xml.MEASD ix[:measures]
228
+ #xml.MEASF
229
+ #xml.REMD
230
+ #xml.REMF
231
+ #xml.LIT
232
+ xml.DEL false
233
+ #xml.IXMCH {
234
+ # xml.TYP
235
+ # xml.TYPD
236
+ # xml.TYPF
237
+ # xml.CD
238
+ # xml.CDD
239
+ # xml.CDF
240
+ # xml.TXTD
241
+ # xml.TXTF
242
+ #}
243
+ }
149
244
  end
150
- end
151
- seq
245
+ xml.RESULT {
246
+ xml.OK_ERROR 'OK'
247
+ xml.NBR_RECORD @interactions.length.to_s
248
+ xml.ERROR_CODE ''
249
+ xml.MESSAGE ''
250
+ }
251
+ }
152
252
  end
253
+ _builder.to_xml
254
+ end
255
+ def build_code
256
+ prepare_codes
257
+ _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
258
+ xml.doc.tag_suffix = @tag_suffix
259
+ datetime = Time.new.strftime('%FT%T.%7N%z')
260
+ xml.CODE(
261
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
262
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
263
+ 'xmlns' => 'http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration',
264
+ 'CREATION_DATETIME' => datetime,
265
+ 'PROD_DATE' => datetime,
266
+ 'VALID_DATE' => datetime,
267
+ ) {
268
+ @codes.each_pair do |val, definition|
269
+ xml.CD('DT' => '') {
270
+ xml.CDTYP definition[:int]
271
+ xml.CDVAL val
272
+ xml.DSCRSD definition[:txt]
273
+ #xml.DSCRSF
274
+ #xml.DSCRMD
275
+ #xml.DSCRMF
276
+ #xml.DSCRD
277
+ #xml.DSCRF
278
+ xml.DEL false
279
+ }
280
+ end
281
+ xml.RESULT {
282
+ xml.OK_ERROR 'OK'
283
+ xml.NBR_RECORD @codes.keys.length
284
+ xml.ERROR_CODE ''
285
+ xml.MESSAGE ''
286
+ }
287
+ }
288
+ end
289
+ _builder.to_xml
290
+ end
291
+ def build_product
292
+ prepare_substances
293
+ prepare_products
294
+ prepare_interactions
295
+ prepare_codes
153
296
  _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
154
297
  xml.doc.tag_suffix = @tag_suffix
155
298
  datetime = Time.new.strftime('%FT%T.%7N%z')
@@ -161,7 +304,7 @@ module Oddb2xml
161
304
  'PROD_DATE' => datetime,
162
305
  'VALID_DATE' => datetime,
163
306
  ) {
164
- objects.each do |seq|
307
+ @products.each do |seq|
165
308
  xml.PRD('DT' => '') {
166
309
  xml.PRDNO seq[:product_key] unless seq[:product_key].empty?
167
310
  %w[de fr].each do |l|
@@ -245,11 +388,15 @@ module Oddb2xml
245
388
  #xml.WHK
246
389
  }
247
390
  end
248
- #xml.CPTIX {
249
- #xml.IXNO
250
- #xml.GRP
251
- #xml.RLV
252
- #}
391
+ @interactions.each do |ix|
392
+ if [ix[:act1], ix[:act2]].include?(seq[:atc_code])
393
+ xml.CPTIX {
394
+ xml.IXNO ix[:ixno]
395
+ #xml.GRP
396
+ xml.RLV @codes[ix[:grad]]
397
+ }
398
+ end
399
+ end
253
400
  #xml.CPTROA {
254
401
  #xml.SYSLOC
255
402
  #xml.ROA
@@ -266,7 +413,7 @@ module Oddb2xml
266
413
  end
267
414
  xml.RESULT {
268
415
  xml.OK_ERROR 'OK'
269
- xml.NBR_RECORD objects.length.to_s
416
+ xml.NBR_RECORD @products.length.to_s
270
417
  xml.ERROR_CODE ''
271
418
  xml.MESSAGE ''
272
419
  }
@@ -276,17 +423,7 @@ module Oddb2xml
276
423
  end
277
424
  def build_article
278
425
  prepare_limitations
279
- objects = [] # base is 'DE'
280
- @index['DE'].each_pair do |pharmacode, index|
281
- object = {
282
- :de => index,
283
- :fr => @index['FR'][pharmacode],
284
- }
285
- if seq = @items[pharmacode]
286
- object[:seq] = seq
287
- end
288
- objects << object
289
- end
426
+ prepare_articles
290
427
  _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
291
428
  xml.doc.tag_suffix = @tag_suffix
292
429
  datetime = Time.new.strftime('%FT%T.%7N%z')
@@ -298,7 +435,7 @@ module Oddb2xml
298
435
  'PROD_DATE' => datetime,
299
436
  'VALID_DATE' => datetime,
300
437
  ) {
301
- objects.each do |obj|
438
+ @articles.each do |obj|
302
439
  de_pac = obj[:de] # swiss index DE (base)
303
440
  fr_pac = obj[:fr] # swiss index FR
304
441
  bg_pac = nil # BAG XML (additional data)
@@ -440,7 +577,7 @@ module Oddb2xml
440
577
  end
441
578
  xml.RESULT {
442
579
  xml.OK_ERROR 'OK'
443
- xml.NBR_RECORD objects.length.to_s
580
+ xml.NBR_RECORD @articles.length.to_s
444
581
  xml.ERROR_CODE ''
445
582
  xml.MESSAGE ''
446
583
  }
@@ -490,5 +627,52 @@ module Oddb2xml
490
627
  end
491
628
  _builder.to_xml
492
629
  end
630
+ def build_fi_product
631
+ prepare_products
632
+ _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
633
+ xml.doc.tag_suffix = @tag_suffix
634
+ datetime = Time.new.strftime('%FT%T.%7N%z')
635
+ xml.KOMPENDIUM_PRODUCT(
636
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
637
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
638
+ 'xmlns' => 'http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration',
639
+ 'CREATION_DATETIME' => datetime,
640
+ 'PROD_DATE' => datetime,
641
+ 'VALID_DATE' => datetime,
642
+ ) {
643
+ length = 0
644
+ %w[de fr].each do |lang|
645
+ info_index = {}
646
+ @infos[lang].each_with_index do |info, i|
647
+ info_index[info[:monid]] = i
648
+ end
649
+ # prod
650
+ @products.each do |seq|
651
+ seq[:packages].values.each do |pac|
652
+ if pac[:swissmedic_number] =~ /(\d{5})(\d{3})/
653
+ number = $1.to_s
654
+ if i = info_index[number]
655
+ length += 1
656
+ xml.KP('DT' => '') {
657
+ xml.MONID @infos[lang][i][:monid]
658
+ xml.PRDNO seq[:product_key] unless seq[:product_key].empty?
659
+ # as orphans ?
660
+ xml.DEL @orphans.include?(number) ? true : false
661
+ }
662
+ end
663
+ end
664
+ end
665
+ end
666
+ end
667
+ xml.RESULT {
668
+ xml.OK_ERROR 'OK'
669
+ xml.NBR_RECORD length
670
+ xml.ERROR_CODE ''
671
+ xml.MESSAGE ''
672
+ }
673
+ }
674
+ end
675
+ _builder.to_xml
676
+ end
493
677
  end
494
678
  end
data/lib/oddb2xml/cli.rb CHANGED
@@ -9,39 +9,51 @@ require 'oddb2xml/compressor'
9
9
  module Oddb2xml
10
10
  class Cli
11
11
  SUBJECTS = %w[product article]
12
- ADDITIONS = %w[substance limitation]
13
- OPTIONALS = %w[fi]
12
+ ADDITIONS = %w[substance limitation interaction code]
13
+ OPTIONALS = %w[fi fi_product]
14
14
  LANGUAGES = %w[DE FR] # EN does not exist
15
15
  def initialize(args)
16
16
  @options = args
17
17
  @mutex = Mutex.new
18
18
  @items = {} # Items from Preparations.xml in BAG
19
19
  @index = {} # Base index from swissINDEX
20
- @infos = {} # FI from SwissmedicInfo
21
- @orphans = [] # Orphaned drugs from Swissmedic xls
22
- @fridges = [] # ReFridge drugs from Swissmedic xls
20
+ @infos = {} # [option] FI from SwissmedicInfo
21
+ @actions = [] # [addition] interactions from epha
22
+ @orphans = [] # [addition] Orphaned drugs from Swissmedic xls
23
+ @fridges = [] # [addition] ReFridge drugs from Swissmedic xls
23
24
  LANGUAGES.each do |lang|
24
25
  @index[lang] = {}
25
26
  end
26
27
  end
27
28
  def run
28
29
  threads = []
29
- # swissmedic
30
- threads << Thread.new do
31
- downloader = SwissmedicInfoDownloader.new
32
- xml = downloader.download
33
- @mutex.synchronize do
34
- hsh = SwissmedicInfoExtractor.new(xml).to_hash
35
- @infos = hsh
30
+ # swissmedic-info
31
+ if @options[:fi]
32
+ threads << Thread.new do
33
+ downloader = SwissmedicInfoDownloader.new
34
+ xml = downloader.download
35
+ @mutex.synchronize do
36
+ hsh = SwissmedicInfoExtractor.new(xml).to_hash
37
+ @infos = hsh
38
+ end
36
39
  end
37
40
  end
41
+ # swissmedic
38
42
  [:orphans, :fridges].each do |type|
39
43
  threads << Thread.new do
40
- downloader = SwissmedicDownloader.new
41
- io = downloader.download_by(type)
44
+ downloader = SwissmedicDownloader.new(type)
45
+ io = downloader.download
42
46
  self.instance_variable_set("@#{type.to_s}", SwissmedicExtractor.new(io, type).to_arry)
43
47
  end
44
48
  end
49
+ # epha
50
+ threads << Thread.new do
51
+ downloader = EphaDownloader.new
52
+ io = downloader.download
53
+ @mutex.synchronize do
54
+ @actions = EphaExtractor.new(io).to_hash
55
+ end
56
+ end
45
57
  # bag
46
58
  threads << Thread.new do
47
59
  downloader = BagXmlDownloader.new
@@ -55,8 +67,8 @@ module Oddb2xml
55
67
  # swissindex
56
68
  types.each do |type|
57
69
  threads << Thread.new do
58
- downloader = SwissIndexDownloader.new(type)
59
- xml = downloader.download_by(lang)
70
+ downloader = SwissIndexDownloader.new(type, lang)
71
+ xml = downloader.download
60
72
  @mutex.synchronize do
61
73
  hsh = SwissIndexExtractor.new(xml, type).to_hash
62
74
  @index[lang][type] = hsh
@@ -85,8 +97,12 @@ module Oddb2xml
85
97
  builder.index = index
86
98
  builder.items = @items
87
99
  # additions
88
- builder.orphans = @orphans
89
- builder.fridges = @fridges
100
+ %w[actions orphans fridges].each do |addition|
101
+ builder.send("#{addition}=".intern, self.instance_variable_get("@#{addition}"))
102
+ end
103
+ #builder.actions = @actions
104
+ #builder.orphans = @orphans
105
+ #builder.fridges = @fridges
90
106
  # optionals
91
107
  builder.infos = @infos
92
108
  builder.tag_suffix = @options[:tag_suffix]
@@ -115,6 +131,11 @@ module Oddb2xml
115
131
  def files
116
132
  unless @_files
117
133
  @_files = {}
134
+ ##
135
+ # building order
136
+ # 1. addtions
137
+ # 2. subjects
138
+ # 3. optionals
118
139
  _files = (ADDITIONS + SUBJECTS)
119
140
  _files += OPTIONALS if @options[:fi]
120
141
  _files.each do|sbj|
@@ -13,7 +13,11 @@ module Oddb2xml
13
13
  init
14
14
  end
15
15
  def init
16
- # pass
16
+ @agent = Mechanize.new
17
+ @agent.user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0'
18
+ @agent.redirect_ok = true
19
+ @agent.redirection_limit = 5
20
+ @agent.follow_meta_refresh = true
17
21
  end
18
22
  protected
19
23
  def retrievable?
@@ -25,23 +29,39 @@ module Oddb2xml
25
29
  false
26
30
  end
27
31
  end
32
+ def read_xml_form_zip(target, zipfile)
33
+ xml = ''
34
+ if RUBY_PLATFORM =~ /mswin/i # for memory error
35
+ Zip::ZipFile.foreach(zipfile) do |entry|
36
+ if entry.name =~ target
37
+ entry.get_input_stream do |io|
38
+ while line = io.gets
39
+ xml << line
40
+ end
41
+ end
42
+ end
43
+ end
44
+ else
45
+ Zip::ZipFile.foreach(zipfile) do |entry|
46
+ if entry.name =~ target
47
+ entry.get_input_stream { |io| xml = io.read }
48
+ end
49
+ end
50
+ end
51
+ xml
52
+ end
28
53
  end
29
54
  class BagXmlDownloader < Downloader
30
55
  def init
56
+ super
31
57
  @url ||= 'http://bag.e-mediat.net/SL2007.Web.External/File.axd?file=XMLPublications.zip'
32
58
  end
33
59
  def download
34
60
  file = 'XMLPublications.zip'
35
61
  begin
36
- response = Mechanize.new.get(@url)
62
+ response = @agent.get(@url)
37
63
  response.save_as file
38
- xml = ''
39
- Zip::ZipFile.foreach(file) do |entry|
40
- if entry.name =~ /^Preparation/iu
41
- entry.get_input_stream{ |io| xml = io.read }
42
- end
43
- end
44
- return xml
64
+ return read_xml_form_zip(/^Preparation/iu, file)
45
65
  rescue Timeout::Error
46
66
  retrievable? ? retry : raise
47
67
  ensure
@@ -52,33 +72,33 @@ module Oddb2xml
52
72
  end
53
73
  end
54
74
  class SwissIndexDownloader < Downloader
55
- def initialize(type=:pharma)
75
+ def initialize(type=:pharma, lang='DE')
56
76
  @type = (type == :pharma ? 'Pharma' : 'NonPharma')
77
+ @lang = lang
57
78
  url = "https://index.ws.e-mediat.net/Swissindex/#{@type}/ws_#{@type}_V101.asmx?WSDL"
58
79
  super(url)
59
80
  end
60
81
  def init
61
- @config = {
82
+ config = {
62
83
  :log_level => :info,
63
84
  :log => false, # $stdout
64
85
  :raise_errors => true,
65
86
  :ssl_verify_mode => :none,
66
87
  :wsdl => @url
67
88
  }
89
+ @client = Savon::Client.new(config)
68
90
  end
69
- def download_by(lang = 'DE')
70
- client = Savon::Client.new(@config)
91
+ def download
71
92
  begin
72
- type = @type
73
93
  soap = <<XML
74
94
  <?xml version="1.0" encoding="utf-8"?>
75
95
  <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/">
76
96
  <soap:Body>
77
- <lang xmlns="http://swissindex.e-mediat.net/Swissindex#{type}_out_V101">#{lang}</lang>
97
+ <lang xmlns="http://swissindex.e-mediat.net/Swissindex#{@type}_out_V101">#{@lang}</lang>
78
98
  </soap:Body>
79
99
  </soap:Envelope>
80
100
  XML
81
- response = client.call(:download_all, :xml => soap)
101
+ response = @client.call(:download_all, :xml => soap)
82
102
  if response.success?
83
103
  if xml = response.to_xml
84
104
  return xml
@@ -95,25 +115,26 @@ XML
95
115
  end
96
116
  end
97
117
  class SwissmedicDownloader < Downloader
98
- HOST = 'http://www.swissmedic.ch'
99
- def init
100
- end
101
- def download_by(index=:orphans)
102
- case index
118
+ def initialize(type=:orphans)
119
+ @type = type
120
+ case @type
103
121
  when :orphans
104
- @url ||= "#{HOST}/daten/00081/index.html?lang=de"
105
- xpath = "//div[@id='sprungmarke0_4']//a[@title='Humanarzneimittel']"
122
+ action = "daten/00081/index.html?lang=de"
123
+ @xpath = "//div[@id='sprungmarke0_4']//a[@title='Humanarzneimittel']"
106
124
  when :fridges
107
- @url ||= "#{HOST}/daten/00080/00254/index.html?lang=de"
108
- xpath = "//table[@class='swmTableFlex']//a[@title='B3.1.35-d.xls']"
125
+ action = "daten/00080/00254/index.html?lang=de"
126
+ @xpath = "//table[@class='swmTableFlex']//a[@title='B3.1.35-d.xls']"
109
127
  end
110
- file = "swissmedic_#{index}.xls"
128
+ url = "http://www.swissmedic.ch/#{action}"
129
+ super(url)
130
+ end
131
+ def download
132
+ file = "swissmedic_#{@type}.xls"
111
133
  begin
112
- agent = Mechanize.new
113
- page = agent.get(@url)
114
- if link = page.search(xpath).first
115
- url = HOST + link['href']
116
- response = agent.get(url)
134
+ page = @agent.get(@url)
135
+ if link_node = page.search(@xpath).first
136
+ link = Mechanize::Page::Link.new(link_node, @agent, page)
137
+ response = link.click
117
138
  response.save_as file
118
139
  end
119
140
  return File.open(file, 'rb')
@@ -128,15 +149,15 @@ XML
128
149
  end
129
150
  class SwissmedicInfoDownloader < Downloader
130
151
  def init
152
+ super
153
+ @agent.ignore_bad_chunking = true
131
154
  @url ||= "http://download.swissmedicinfo.ch/Accept.aspx?ReturnUrl=%2f"
132
155
  end
133
156
  def download
134
157
  file = "swissmedic_info.zip"
135
158
  begin
136
159
  response = nil
137
- agent = Mechanize.new
138
- agent.ignore_bad_chunking = true
139
- if home = agent.get(@url)
160
+ if home = @agent.get(@url)
140
161
  form = home.form_with(:id => 'Form1')
141
162
  bttn = form.button_with(:name => 'ctl00$MainContent$btnOK')
142
163
  if page = form.submit(bttn)
@@ -148,13 +169,7 @@ XML
148
169
  if response
149
170
  response.save_as file
150
171
  end
151
- xml = ''
152
- Zip::ZipFile.foreach(file) do |entry|
153
- if entry.name =~ /^AipsDownload_/iu
154
- entry.get_input_stream{ |io| xml = io.read }
155
- end
156
- end
157
- return xml
172
+ return read_xml_form_zip(/^AipsDownload_/iu, file)
158
173
  rescue Timeout::Error
159
174
  retrievable? ? retry : raise
160
175
  rescue NoMethodError => e
@@ -166,4 +181,24 @@ XML
166
181
  end
167
182
  end
168
183
  end
184
+ class EphaDownloader < Downloader
185
+ def init
186
+ super
187
+ @url ||= 'http://community.epha.ch/interactions_de_utf8.csv'
188
+ end
189
+ def download
190
+ file = "epha_interactions.csv"
191
+ begin
192
+ response = @agent.get(@url)
193
+ response.save_as file
194
+ return File.open(file, 'r')
195
+ rescue Timeout::Error
196
+ retrievable? ? retry : raise
197
+ ensure
198
+ if File.exists? file
199
+ File.unlink file
200
+ end
201
+ end
202
+ end
203
+ end
169
204
  end
@@ -200,4 +200,28 @@ module Oddb2xml
200
200
  data
201
201
  end
202
202
  end
203
+ class EphaExtractor < Extractor
204
+ def initialize(io)
205
+ @io = io
206
+ end
207
+ def to_hash
208
+ data = []
209
+ ixno = 0
210
+ while line = @io.gets
211
+ next if line =~ /^ATC1;Name1;ATC2;Name2;/
212
+ row = line.chomp.gsub("\"", '').split(';')
213
+ ixno += 1
214
+ action = {}
215
+ action[:ixno] = ixno
216
+ action[:atc1] = row[0]
217
+ action[:atc2] = row[2]
218
+ action[:mechanism] = row[5]
219
+ action[:effect] = row[6]
220
+ action[:measures] = row[7]
221
+ action[:grad] = row[8]
222
+ data << action
223
+ end
224
+ data
225
+ end
226
+ end
203
227
  end
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "1.1.2"
2
+ VERSION = "1.1.3"
3
3
  end
data/oddb2xml.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'oddb2xml/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "oddb2xml"
8
+ gem.version = Oddb2xml::VERSION
9
+ gem.authors = [""]
10
+ gem.email = [""]
11
+ gem.description = %q{TODO: Write a gem description}
12
+ gem.summary = %q{TODO: Write a gem summary}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'rubyzip'
21
+ gem.add_dependency 'archive-tar-minitar'
22
+ gem.add_dependency 'mechanize'
23
+ gem.add_dependency 'nokogiri'
24
+ gem.add_dependency 'savon', '>= 2.0'
25
+ gem.add_dependency 'spreadsheet'
26
+
27
+ gem.add_development_dependency 'rspec'
28
+ gem.add_development_dependency 'webmock'
29
+ gem.add_development_dependency 'ZenTest'
30
+ end
data/spec/cli_spec.rb CHANGED
@@ -32,6 +32,7 @@ describe Oddb2xml::Cli do
32
32
  opts = {
33
33
  :compress_ext => 'tar.gz',
34
34
  :nonpharma => false,
35
+ :fi => false,
35
36
  :tag_suffix => nil,
36
37
  }
37
38
  Oddb2xml::Cli.new(opts)
@@ -64,6 +65,7 @@ describe Oddb2xml::Cli do
64
65
  opts = {
65
66
  :compress_ext => 'zip',
66
67
  :nonpharma => false,
68
+ :fi => false,
67
69
  :tag_suffix => nil,
68
70
  }
69
71
  Oddb2xml::Cli.new(opts)
@@ -96,6 +98,7 @@ describe Oddb2xml::Cli do
96
98
  opts = {
97
99
  :compress_ext => nil,
98
100
  :nonpharma => true,
101
+ :fi => false,
99
102
  :tag_suffix => nil,
100
103
  }
101
104
  Oddb2xml::Cli.new(opts)
@@ -110,12 +113,20 @@ describe Oddb2xml::Cli do
110
113
  Dir.glob('oddb_*.tar.gz').first.should be_nil
111
114
  Dir.glob('oddb_*.zip').first.should be_nil
112
115
  end
113
- it 'should create 2 xml files' do
116
+ it 'should create xml files' do
114
117
  $stdout.should_receive(:puts).with(/NonPharma/)
115
118
  cli.run
119
+ expected = [
120
+ 'oddb_product.xml',
121
+ 'oddb_article.xml',
122
+ 'oddb_limitation.xml',
123
+ 'oddb_substance.xml',
124
+ 'oddb_interaction.xml',
125
+ 'oddb_code.xml'
126
+ ].length
116
127
  Dir.glob('oddb_*.xml').each do |file|
117
128
  File.exists?(file).should be_true
118
- end
129
+ end.to_a.length.should equal expected
119
130
  end
120
131
  after(:each) do
121
132
  Dir.glob('oddb_*.xml').each do |file|
@@ -128,6 +139,7 @@ describe Oddb2xml::Cli do
128
139
  opts = {
129
140
  :compress_ext => nil,
130
141
  :nonpharma => false,
142
+ :fi => false,
131
143
  :tag_suffix => '_swiss'.upcase,
132
144
  }
133
145
  Oddb2xml::Cli.new(opts)
@@ -142,12 +154,20 @@ describe Oddb2xml::Cli do
142
154
  Dir.glob('oddb_*.tar.gz').first.should be_nil
143
155
  Dir.glob('oddb_*.zip').first.should be_nil
144
156
  end
145
- it 'should create 2 xml files with prefix swiss_' do
157
+ it 'should create xml files with prefix swiss_' do
146
158
  $stdout.should_receive(:puts).with(/Pharma/)
147
159
  cli.run
160
+ expected = [
161
+ 'swiss_product.xml',
162
+ 'swiss_article.xml',
163
+ 'swiss_limitation.xml',
164
+ 'swiss_substance.xml',
165
+ 'swiss_interaction.xml',
166
+ 'swiss_code.xml'
167
+ ].length
148
168
  Dir.glob('swiss_*.xml').each do |file|
149
169
  File.exists?(file).should be_true
150
- end
170
+ end.to_a.length.should equal expected
151
171
  end
152
172
  after(:each) do
153
173
  Dir.glob('swiss_*.xml').each do |file|
@@ -155,4 +175,47 @@ describe Oddb2xml::Cli do
155
175
  end
156
176
  end
157
177
  end
178
+ context 'when -o fi option is given' do
179
+ let(:cli) do
180
+ opts = {
181
+ :compress_ext => nil,
182
+ :nonpharma => false,
183
+ :fi => true,
184
+ :tag_suffix => nil,
185
+ }
186
+ Oddb2xml::Cli.new(opts)
187
+ end
188
+ it_behaves_like 'any interface'
189
+ it 'should have nonpharma option' do
190
+ cli.should have_option(:fi => true)
191
+ end
192
+ it 'should not create any compressed file' do
193
+ $stdout.should_receive(:puts).with(/Pharma/)
194
+ cli.run
195
+ Dir.glob('oddb_*.tar.gz').first.should be_nil
196
+ Dir.glob('oddb_*.zip').first.should be_nil
197
+ end
198
+ it 'should create xml files' do
199
+ $stdout.should_receive(:puts).with(/Pharma/)
200
+ cli.run
201
+ expected = [
202
+ 'oddb_fi.xml',
203
+ 'oddb_fi_product.xml',
204
+ 'oddb_product.xml',
205
+ 'oddb_article.xml',
206
+ 'oddb_limitation.xml',
207
+ 'oddb_substance.xml',
208
+ 'oddb_interaction.xml',
209
+ 'oddb_code.xml'
210
+ ].length
211
+ Dir.glob('oddb_*.xml').each do |file|
212
+ File.exists?(file).should be_true
213
+ end.to_a.length.should equal expected
214
+ end
215
+ after(:each) do
216
+ Dir.glob('oddb_*.xml').each do |file|
217
+ File.unlink(file) if File.exists?(file)
218
+ end
219
+ end
220
+ end
158
221
  end
@@ -9,6 +9,8 @@ shared_examples_for 'any compressor' do
9
9
  @compressor.contents << File.expand_path('../data/oddb_product.xml', __FILE__)
10
10
  @compressor.contents << File.expand_path('../data/oddb_substance.xml', __FILE__)
11
11
  @compressor.contents << File.expand_path('../data/oddb_limitation.xml', __FILE__)
12
+ @compressor.contents << File.expand_path('../data/oddb_fi.xml', __FILE__)
13
+ @compressor.contents << File.expand_path('../data/oddb_fi_product.xml', __FILE__)
12
14
  @compressor.finalize!.should == true
13
15
  compress_file = @compressor.instance_variable_get(:@compress_file)
14
16
  File.exists?(compress_file).should == true
@@ -0,0 +1,3 @@
1
+ ATC1;Name1;ATC2;Name2;Info;Mechanismus;Effekt;Massnahmen;Grad
2
+ "N06AB06";"Sertralin";"M03BX02";"Tizanidin";"Keine Interaktion";"Tizanidin wird über CYP1A2 metabolisiert. Sertralin beeinflusst CYP1A2 jedoch nicht.";"Keine Interaktion.";"Die Kombination aus Sertralin und Tizanidin hat kein bekanntes Interaktionspotential.";"A"
3
+ "J05AE08";"Atazanavir";"C10AA05";"Atorvastatin";"Erhöhtes Risiko für Myopathie und Rhabdomyolyse";"Atazanavir hemmt CYP3A4 und darüber auch den Abbau von Atorvastatin, was zu erhöhten Plasmakonzentrationen von Atorvastatin führt..";"Aufgrund der Inhibition von CYP3A4 durch Atazanavir kann die Atorvastatinkonzentration im Plasma ansteigen, was mit einem erhöhten Risiko für Myopathie und Rhabdomyolyse einhergeht.";"Kombination nach Möglichkeit meiden und alternativ Statin wählen, welches nicht mit Atazanavir interagiert, wie z.B. Pravastatin. Ist nach Nutzen-Risiko-Abwägung die Kombination aus Atorvastatin und Atazanavir erforderlich, niedrige Atorvastatindosis (z.B. 10 mg/d) wählen und auf Zeichen der Myopathie und Rhabdomyolyse, wie Muskelschwäche, Muskelschmerzen, verfärbter Urin und CK-Anstieg, achten. Die Kombination aus Atazanavir und Ritonavir mit Atorvastatin ist kontraindiziert.";"D"
File without changes
File without changes
@@ -5,6 +5,8 @@
5
5
  <title></title>
6
6
  </head>
7
7
  <body>
8
+ <form id="Form1" method="get" action="/Accept.aspx">
9
+ <input name="ctl00$MainContent$btnOK" value="1" />
10
+ </form>
8
11
  </body>
9
12
  </html>
10
-
Binary file
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE HTML>
2
+ <html lang="utf-8">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title></title>
6
+ </head>
7
+ <body>
8
+ <form id="Form1" method="get" action="/Accept.aspx">
9
+ <input name="ctl00$MainContent$BtnYes" value="1" />
10
+ </form>
11
+ </body>
12
+ </html>
13
+
@@ -21,7 +21,7 @@ describe Oddb2xml::BagXmlDownloader do
21
21
  include ServerMockHelper
22
22
  before(:each) do
23
23
  setup_bag_xml_server_mock
24
- @downloader = Oddb2xml::BagXmlDownloader.new()
24
+ @downloader = Oddb2xml::BagXmlDownloader.new
25
25
  end
26
26
  it_behaves_like 'any downloader'
27
27
  context 'when download is called' do
@@ -47,13 +47,13 @@ describe Oddb2xml::SwissIndexDownloader do
47
47
  before(:each) do
48
48
  setup_swiss_index_server_mock
49
49
  end
50
- context 'Pharma' do
50
+ context 'Pharma with DE' do
51
51
  before(:each) do
52
- @downloader = Oddb2xml::SwissIndexDownloader.new(:pharma)
52
+ @downloader = Oddb2xml::SwissIndexDownloader.new(:pharma, 'DE')
53
53
  end
54
54
  it_behaves_like 'any downloader'
55
55
  context 'when download_by is called with DE' do
56
- let(:xml) { @downloader.download_by('DE') }
56
+ let(:xml) { @downloader.download }
57
57
  it 'should parse response hash to xml' do
58
58
  xml.should be_a String
59
59
  xml.length.should_not == 0
@@ -65,13 +65,13 @@ describe Oddb2xml::SwissIndexDownloader do
65
65
  end
66
66
  end
67
67
  end
68
- context 'NonPharma' do
68
+ context 'NonPharma with FR' do
69
69
  before(:each) do
70
- @downloader = Oddb2xml::SwissIndexDownloader.new(:nonpharma)
70
+ @downloader = Oddb2xml::SwissIndexDownloader.new(:nonpharma, 'FR')
71
71
  end
72
72
  it_behaves_like 'any downloader'
73
- context 'when download_by is called with DE' do
74
- let(:xml) { @downloader.download_by('DE') }
73
+ context 'when download_by is called with FR' do
74
+ let(:xml) { @downloader.download }
75
75
  it 'should parse response hash to xml' do
76
76
  xml.should be_a String
77
77
  xml.length.should_not == 0
@@ -83,36 +83,90 @@ describe Oddb2xml::SwissIndexDownloader do
83
83
  end
84
84
  end
85
85
  end
86
+ end
86
87
 
87
88
  describe Oddb2xml::SwissmedicDownloader do
89
+ include ServerMockHelper
90
+ context 'orphans' do
91
+ before(:each) do
92
+ setup_swissmedic_server_mock
93
+ @downloader = Oddb2xml::SwissmedicDownloader.new(:orphans)
94
+ end
95
+ it_behaves_like 'any downloader'
96
+ context 'download_by for orphans xls' do
97
+ let(:io) { @downloader.download }
98
+ it 'should return valid IO' do
99
+ io.should be_a IO
100
+ io.bytes.should_not nil
101
+ end
102
+ it 'should clean up current directory' do
103
+ io.should_not raise_error(Timeout::Error)
104
+ File.exist?('oddb_orphans.xls').should be(false)
105
+ end
106
+ end
107
+ end
108
+ context 'fridges' do
109
+ before(:each) do
110
+ setup_swissmedic_server_mock
111
+ @downloader = Oddb2xml::SwissmedicDownloader.new(:fridges)
112
+ end
113
+ context 'download_by for fridges xls' do
114
+ let(:io) { @downloader.download }
115
+ it 'should return valid IO' do
116
+ io.should be_a IO
117
+ io.bytes.should_not nil
118
+ end
119
+ it 'should clean up current directory' do
120
+ io.should_not raise_error(Timeout::Error)
121
+ File.exist?('oddb_fridges.xls').should be(false)
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ describe Oddb2xml::SwissmedicInfoDownloader do
88
128
  include ServerMockHelper
89
129
  before(:each) do
90
- setup_swissmedic_server_mock
91
- @downloader = Oddb2xml::SwissmedicDownloader.new()
130
+ setup_swissmedic_info_server_mock
131
+ @downloader = Oddb2xml::SwissmedicInfoDownloader.new
92
132
  end
93
133
  it_behaves_like 'any downloader'
94
- context 'download_by for orphans xls' do
95
- let(:io) { @downloader.download_by(:orphans) }
96
- it 'should return valid IO' do
97
- io.should be_a IO
98
- io.bytes.should_not nil
134
+ context 'when download is called' do
135
+ let(:xml) { @downloader.download }
136
+ it 'should parse zip to string' do
137
+ xml.should be_a String
138
+ xml.length.should_not == 0
139
+ end
140
+ it 'should return valid xml' do
141
+ xml.should =~ /xml\sversion="1.0"/
142
+ xml.should =~ /medicalInformations/
143
+ xml.should =~ /content/
99
144
  end
100
145
  it 'should clean up current directory' do
101
- io.should_not raise_error(Timeout::Error)
102
- File.exist?('oddb_orphans.xls').should be(false)
146
+ xml.should_not raise_error(Timeout::Error)
147
+ File.exist?('swissmedic_info.zip').should be(false)
103
148
  end
104
149
  end
105
- context 'download_by for fridges xls' do
106
- let(:io) { @downloader.download_by(:fridges) }
107
- it 'should return valid IO' do
108
- io.should be_a IO
109
- io.bytes.should_not nil
150
+ end
151
+
152
+ describe Oddb2xml::EphaDownloader do
153
+ include ServerMockHelper
154
+ before(:each) do
155
+ setup_epha_server_mock
156
+ @downloader = Oddb2xml::EphaDownloader.new
157
+ end
158
+ it_behaves_like 'any downloader'
159
+ context 'when download is called' do
160
+ let(:xml) { @downloader.download }
161
+ it 'should read csv to IO Object' do
162
+ xml.should be_a IO
163
+ xml.bytes.should_not nil
110
164
  end
111
165
  it 'should clean up current directory' do
112
- io.should_not raise_error(Timeout::Error)
113
- File.exist?('oddb_fridges.xls').should be(false)
166
+ xml.should_not raise_error(Timeout::Error)
167
+ File.exist?('epha_interactions.csv').should be(false)
114
168
  end
115
169
  end
116
170
  end
117
171
 
118
- end
172
+
data/spec/spec_helper.rb CHANGED
@@ -21,6 +21,7 @@ module ServerMockHelper
21
21
  setup_swiss_index_server_mock
22
22
  setup_swissmedic_server_mock
23
23
  setup_swissmedic_info_server_mock
24
+ setup_epha_server_mock
24
25
  end
25
26
  def setup_bag_xml_server_mock
26
27
  # zip
@@ -101,28 +102,56 @@ module ServerMockHelper
101
102
  stub_html_url = "http://download.swissmedicinfo.ch/Accept.aspx?ReturnUrl=%2f"
102
103
  stub_response = File.read(File.expand_path("../data/swissmedic_info.html", __FILE__))
103
104
  stub_request(:get, stub_html_url).
104
- with(:headers => {
105
- 'Accept' => '*/*',
106
- 'Host' => 'download.swissmedicinfo.ch',
107
- }).
105
+ with(
106
+ :headers => {
107
+ 'Accept' => '*/*',
108
+ 'Host' => 'download.swissmedicinfo.ch',
109
+ }).
110
+ to_return(
111
+ :status => 200,
112
+ :headers => {'Content-Type' => 'text/html; charset=utf-8'},
113
+ :body => stub_response)
114
+ # html (dummy 2)
115
+ stub_html_url = 'http://download.swissmedicinfo.ch/Accept.aspx?ctl00$MainContent$btnOK=1'
116
+ stub_response = File.read(File.expand_path("../data/swissmedic_info_2.html", __FILE__))
117
+ stub_request(:get, stub_html_url).
118
+ with(
119
+ :headers => {
120
+ 'Accept' => '*/*',
121
+ 'Host' => 'download.swissmedicinfo.ch',
122
+ }).
108
123
  to_return(
109
124
  :status => 200,
110
125
  :headers => {'Content-Type' => 'text/html; charset=utf-8'},
111
126
  :body => stub_response)
112
127
  # zip
113
- stub_zip_url = "http://download.swissmedicinfo.ch/"
128
+ stub_zip_url = 'http://download.swissmedicinfo.ch/Accept.aspx?ctl00$MainContent$BtnYes=1'
114
129
  stub_response = File.read(File.expand_path('../data/swissmedic_info.zip', __FILE__))
115
130
  stub_request(:get, stub_zip_url).
131
+ with(
132
+ :headers => {
133
+ 'Accept' => '*/*',
134
+ 'Accept-Encoding' => 'gzip,deflate,identity',
135
+ 'Host' => 'download.swissmedicinfo.ch',
136
+ }).
137
+ to_return(
138
+ :status => 200,
139
+ :headers => {'Content-Type' => 'application/zip; charset=utf-8'},
140
+ :body => stub_response)
141
+ end
142
+ def setup_epha_server_mock
143
+ # csv
144
+ stub_csv_url = 'http://community.epha.ch/interactions_de_utf8.csv'
145
+ stub_response = File.read(File.expand_path('../data/epha_interactions.csv', __FILE__))
146
+ stub_request(:get, stub_csv_url).
116
147
  with(:headers => {
117
- 'Accept' => '*/*',
118
- 'Accept-Encoding' => 'gzip,deflate,identity',
119
- 'Host' => 'download.swisssmedicinfo.ch',
148
+ 'Accept' => '*/*',
149
+ 'Host' => 'community.epha.ch',
120
150
  }).
121
151
  to_return(
122
152
  :status => 200,
123
- :headers => {'Content-Type' => 'application/zip; charset=utf-8'},
153
+ :headers => {'Content-Type' => 'text/csv; charset=utf-8'},
124
154
  :body => stub_response)
125
-
126
155
  end
127
156
  end
128
157
 
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.1.2
4
+ version: 1.1.3
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-01-08 00:00:00.000000000 Z
12
+ date: 2013-01-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdoc
16
- requirement: &9807060 !ruby/object:Gem::Requirement
16
+ requirement: &19096920 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.10'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *9807060
24
+ version_requirements: *19096920
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hoe
27
- requirement: &9806460 !ruby/object:Gem::Requirement
27
+ requirement: &19112720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '2.13'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *9806460
35
+ version_requirements: *19112720
36
36
  description: ''
37
37
  email:
38
38
  - yasaka@ywesee.com, zdavatz@ywesee.com
@@ -59,11 +59,15 @@ files:
59
59
  - lib/oddb2xml/downloader.rb
60
60
  - lib/oddb2xml/extractor.rb
61
61
  - lib/oddb2xml/version.rb
62
+ - oddb2xml.gemspec
62
63
  - spec/builder_spec.rb
63
64
  - spec/cli_spec.rb
64
65
  - spec/compressor_spec.rb
65
66
  - spec/data/XMLPublications.zip
67
+ - spec/data/epha_interactions.csv
66
68
  - spec/data/oddb_article.xml
69
+ - spec/data/oddb_fi.xml
70
+ - spec/data/oddb_fi_product.xml
67
71
  - spec/data/oddb_limitation.xml
68
72
  - spec/data/oddb_product.xml
69
73
  - spec/data/oddb_substance.xml
@@ -74,6 +78,7 @@ files:
74
78
  - spec/data/swissmedic_fridges.xls
75
79
  - spec/data/swissmedic_info.html
76
80
  - spec/data/swissmedic_info.zip
81
+ - spec/data/swissmedic_info_2.html
77
82
  - spec/data/swissmedic_orphans.html
78
83
  - spec/data/swissmedic_orphans.xls
79
84
  - spec/data/wsdl.xml