oddb2xml 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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