oddb2xml 2.7.1 → 2.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.standard.yml +2 -0
  4. data/Gemfile +3 -3
  5. data/History.txt +8 -0
  6. data/README.md +1 -1
  7. data/Rakefile +24 -23
  8. data/bin/check_artikelstamm +11 -11
  9. data/bin/compare_v5 +23 -23
  10. data/bin/oddb2xml +14 -13
  11. data/lib/oddb2xml.rb +1 -1
  12. data/lib/oddb2xml/builder.rb +1070 -1038
  13. data/lib/oddb2xml/calc.rb +232 -233
  14. data/lib/oddb2xml/chapter_70_hack.rb +38 -32
  15. data/lib/oddb2xml/cli.rb +252 -236
  16. data/lib/oddb2xml/compare.rb +70 -59
  17. data/lib/oddb2xml/compositions_syntax.rb +448 -430
  18. data/lib/oddb2xml/compressor.rb +20 -20
  19. data/lib/oddb2xml/downloader.rb +153 -127
  20. data/lib/oddb2xml/extractor.rb +302 -289
  21. data/lib/oddb2xml/options.rb +34 -35
  22. data/lib/oddb2xml/parslet_compositions.rb +263 -269
  23. data/lib/oddb2xml/semantic_check.rb +39 -33
  24. data/lib/oddb2xml/util.rb +163 -163
  25. data/lib/oddb2xml/version.rb +1 -1
  26. data/lib/oddb2xml/xml_definitions.rb +32 -33
  27. data/oddb2xml.gemspec +31 -32
  28. data/spec/artikelstamm_spec.rb +111 -110
  29. data/spec/builder_spec.rb +489 -505
  30. data/spec/calc_spec.rb +552 -593
  31. data/spec/check_artikelstamm_spec.rb +26 -26
  32. data/spec/cli_spec.rb +173 -174
  33. data/spec/compare_spec.rb +9 -11
  34. data/spec/composition_syntax_spec.rb +390 -409
  35. data/spec/compressor_spec.rb +48 -48
  36. data/spec/data/transfer.dat +1 -0
  37. data/spec/data_helper.rb +47 -49
  38. data/spec/downloader_spec.rb +247 -260
  39. data/spec/extractor_spec.rb +171 -159
  40. data/spec/galenic_spec.rb +233 -256
  41. data/spec/options_spec.rb +116 -119
  42. data/spec/parslet_spec.rb +833 -861
  43. data/spec/spec_helper.rb +154 -153
  44. data/test_options.rb +39 -42
  45. data/tools/win_fetch_cacerts.rb +2 -3
  46. metadata +19 -3
@@ -1,14 +1,19 @@
1
- # encoding: utf-8
2
- require 'oddb2xml/extractor'
3
- require 'ox'
4
- require 'open-uri'
1
+ require "oddb2xml/extractor"
2
+ require "ox"
3
+ require "open-uri"
5
4
 
6
5
  module Oddb2xml
7
6
  class Chapter70xtractor < Extractor
8
- def Chapter70xtractor.parse_td(elem)
7
+ def self.parse_td(elem)
9
8
  begin
10
9
  values = elem.is_a?(Array) ? elem : elem.values
11
- res = values.flatten.collect{|x| x.nil? ? nil : x.is_a?(Hash) ? x.values : x.gsub(/\r\n/,'').strip }
10
+ res = values.flatten.collect { |x|
11
+ if x.nil?
12
+ nil
13
+ else
14
+ x.is_a?(Hash) ? x.values : x.gsub(/\r\n/, "").strip
15
+ end
16
+ }
12
17
  puts "parse_td returns: #{res}" if $VERBOSE
13
18
  rescue => exc
14
19
  puts "Unable to pars #{elem} #{exc}"
@@ -18,53 +23,54 @@ module Oddb2xml
18
23
  res.flatten # .join("\t")
19
24
  end
20
25
  LIMITATIONS = {
21
- 'L' => 'Kostenübernahme nur nach vorgängiger allergologischer Abklärung.',
22
- 'L1' => 'Eine Flasche zu 20 ml Urtinktur einer bestimmten Pflanze pro Monat.',
23
- 'L1, L2' => 'Eine Flasche zu 20 ml Urtinktur einer bestimmten Pflanze pro Monat. Für Aesculus, Carduus Marianus, Ginkgo, Hedera helix, Hypericum perforatum, Lavandula, Rosmarinus officinalis, Taraxacum officinale.',
24
- 'L3' => 'Alle drei Monate wird eine Verordnung/Originalpackung pro Mittel vergütet.',
26
+ "L" => "Kostenübernahme nur nach vorgängiger allergologischer Abklärung.",
27
+ "L1" => "Eine Flasche zu 20 ml Urtinktur einer bestimmten Pflanze pro Monat.",
28
+ "L1, L2" => "Eine Flasche zu 20 ml Urtinktur einer bestimmten Pflanze pro Monat. Für Aesculus, Carduus Marianus, Ginkgo, Hedera helix, Hypericum perforatum, Lavandula, Rosmarinus officinalis, Taraxacum officinale.",
29
+ "L3" => "Alle drei Monate wird eine Verordnung/Originalpackung pro Mittel vergütet."
25
30
  }
26
31
  def self.items
27
32
  @@items
28
33
  end
29
- def self.parse(html_file = 'http://www.spezialitaetenliste.ch/varia_De.htm')
30
- data = Hash.new{|h,k| h[k] = [] }
34
+
35
+ def self.parse(html_file = "http://www.spezialitaetenliste.ch/varia_De.htm")
36
+ data = Hash.new { |h, k| h[k] = [] }
31
37
  Ox.default_options = {
32
- mode: :generic,
33
- effort: :tolerant,
34
- smart: true
38
+ mode: :generic,
39
+ effort: :tolerant,
40
+ smart: true
35
41
  }
36
- res = Ox.load(Oddb2xml.uri_open(html_file).read, mode: :hash_no_attrs).values.first['body']
42
+ res = Ox.load(Oddb2xml.uri_open(html_file).read, mode: :hash_no_attrs).values.first["body"]
37
43
  result = []
38
44
  idx = 0
39
45
  @@items = {}
40
46
  res.values.last.each do |item|
41
- item.values.first.each do |subElem|
42
- what = Chapter70xtractor.parse_td(subElem)
47
+ item.values.first.each do |sub_elem|
48
+ what = Chapter70xtractor.parse_td(sub_elem)
43
49
  idx += 1
44
50
  puts "#{idx}: xx #{what}" if $VERBOSE
45
51
  result << what
46
52
  end
47
53
  end
48
- result2 = result.find_all{ |x| (x.is_a?(Array) && x.first.is_a?(String)) && x.first.to_i > 100}
54
+ result2 = result.find_all { |x| (x.is_a?(Array) && x.first.is_a?(String)) && x.first.to_i > 100 }
49
55
  result2.each do |entry|
50
56
  data = {}
51
57
  pharma_code = entry.first
52
- ean13 = (Oddb2xml::FAKE_GTIN_START + pharma_code.to_s)
53
- if entry[2].encoding.to_s.eql?('ASCII-8BIT')
54
- german = CGI.unescape(entry[2].force_encoding('ISO-8859-1'))
58
+ ean13 = (Oddb2xml::FAKE_GTIN_START + pharma_code.to_s)
59
+ german = if entry[2].encoding.to_s.eql?("ASCII-8BIT")
60
+ CGI.unescape(entry[2].force_encoding("ISO-8859-1"))
55
61
  else
56
- german = entry[2]
62
+ entry[2]
57
63
  end
58
64
  @@items[ean13] = {
59
- :data_origin => 'Chapter70',
60
- :line => entry.join(","),
61
- :ean13 => ean13,
62
- :description => german,
63
- :quantity => entry[3],
64
- :pharmacode => pharma_code,
65
- :pub_price => entry[4],
66
- :limitation => entry[5],
67
- :type => :pharma,
65
+ data_origin: "Chapter70",
66
+ line: entry.join(","),
67
+ ean13: ean13,
68
+ description: german,
69
+ quantity: entry[3],
70
+ pharmacode: pharma_code,
71
+ pub_price: entry[4],
72
+ limitation: entry[5],
73
+ type: :pharma
68
74
  }
69
75
  end
70
76
  result2
data/lib/oddb2xml/cli.rb CHANGED
@@ -1,25 +1,21 @@
1
- # encoding: utf-8
2
-
3
- require 'thread'
4
- require 'oddb2xml/builder'
5
- require 'oddb2xml/downloader'
6
- require 'oddb2xml/extractor'
7
- require 'oddb2xml/compressor'
8
- require 'oddb2xml/options'
9
- require 'oddb2xml/util'
10
- require 'rubyXL'
11
- require 'date' # for today
1
+ require "oddb2xml/builder"
2
+ require "oddb2xml/downloader"
3
+ require "oddb2xml/extractor"
4
+ require "oddb2xml/compressor"
5
+ require "oddb2xml/options"
6
+ require "oddb2xml/util"
7
+ require "rubyXL"
8
+ require "date" # for today
12
9
 
13
10
  module Oddb2xml
14
-
15
11
  class Cli
16
12
  attr_reader :options
17
- SUBJECTS = %w[product article]
13
+ SUBJECTS = %w[product article]
18
14
  ADDITIONS = %w[substance limitation interaction code]
19
15
  OPTIONALS = %w[fi fi_product]
20
16
  def initialize(args)
21
17
  @options = args
22
- STDOUT.puts "\nStarting cli with from #{caller[1]} using #{@options}" if defined?(RSpec)
18
+ $stdout.puts "\nStarting cli with from #{caller(2..2).first} using #{@options}" if defined?(RSpec)
23
19
  Oddb2xml.save_options(@options)
24
20
  @mutex = Mutex.new
25
21
  # product
@@ -28,21 +24,22 @@ module Oddb2xml
28
24
  @lppvs = {} # lppv.txt from files repo
29
25
  @infos = {} # [option] FI from SwissmedicInfo
30
26
  @packs = {} # [option] Packungen from Swissmedic for dat
31
- @infos_zur_rose = {} # [addition] infos_zur_rose and other infos from zurrose transfer.txt
32
- @migel = {} # [addition] additional Non Pharma products from files repo
27
+ @infos_zur_rose = {} # [addition] infos_zur_rose and other infos from zurrose transfer.txt
28
+ @migel = {} # [addition] additional Non Pharma products from files repo
33
29
  @actions = [] # [addition] interactions from epha
34
30
  @orphan = [] # [addition] Orphaned drugs from Swissmedic xls
35
31
  # addresses
36
32
  @companies = [] # betrieb
37
- @people = [] # medizinalperson
33
+ @people = [] # medizinalperson
38
34
  @_message = false
39
35
  end
36
+
40
37
  def run
41
38
  threads = []
42
- startTime = Time.now
43
- files2rm = Dir.glob(File.join(Downloads, '*'))
44
- FileUtils.rm_f(files2rm, :verbose => @options[:log]) if files2rm.size > 0 and not Oddb2xml.skip_download?
45
- if @options[:calc] and not @options[:extended]
39
+ start_time = Time.now
40
+ files2rm = Dir.glob(File.join(DOWNLOADS, "*"))
41
+ FileUtils.rm_f(files2rm, verbose: @options[:log]) if (files2rm.size > 0) && !Oddb2xml.skip_download?
42
+ if @options[:calc] && !(@options[:extended])
46
43
  threads << download(:package) # swissmedic
47
44
  elsif @options[:address]
48
45
  [:company, :person].each do |type|
@@ -82,149 +79,157 @@ module Oddb2xml
82
79
  end
83
80
  build
84
81
  if @options[:artikelstamm] && system("which xmllint")
85
- elexis_v5_xsd = File.expand_path(File.join(__FILE__, '..', '..', '..', 'Elexis_Artikelstamm_v5.xsd'))
86
- cmd = "xmllint --noout --schema #{elexis_v5_xsd} #{@_files[:artikelstamm]}"
87
- if system(cmd)
88
- puts "Validatied #{@_files[:artikelstamm]}"
89
- else
90
- puts "Validating failed using #{cmd}"
91
- raise "Validating failed using #{cmd}"
92
- exit(2)
93
- end
82
+ elexis_v5_xsd = File.expand_path(File.join(__FILE__, "..", "..", "..", "Elexis_Artikelstamm_v5.xsd"))
83
+ cmd = "xmllint --noout --schema #{elexis_v5_xsd} #{@the_files[:artikelstamm]}"
84
+ if system(cmd)
85
+ puts "Validatied #{@the_files[:artikelstamm]}"
86
+ else
87
+ puts "Validating failed using #{cmd}"
88
+ raise "Validating failed using #{cmd}"
89
+ end
94
90
  end
95
91
  compress if @options[:compress_ext]
96
92
  res = report
97
- nrSecs = (Time.now - startTime).to_i
98
- if defined?(RSpec) && (nrSecs).to_i > 10 && ENV['TRAVIS'].to_s.empty? then require 'pry'; binding.pry ; end
93
+ nr_secs = (Time.now - start_time).to_i
94
+ if defined?(RSpec) && nr_secs.to_i > 10 && ENV["TRAVIS"].to_s.empty?
95
+ puts "Took took long #{nr_secs} seconds"
96
+ # require "pry"; binding.pry;
97
+ end
99
98
  res
100
99
  end
100
+
101
101
  private
102
+
102
103
  def build
103
- begin
104
- @_files = {"calc"=>"oddb_calc.xml"} if @options[:calc] and not (@options[:extended] || @options[:artikelstamm])
105
- builder = Builder.new(@options) do |builder|
106
- if @options[:calc] and not (@options[:extended] || @options[:artikelstamm])
107
- builder.packs = @packs
108
- elsif @options[:address]
109
- builder.companies = @companies
110
- builder.people = @people
111
- else # product
112
- if @options[:format] != :dat
113
- refdata = {}
114
- types.each do |type|
115
- refdata.merge!(@refdata_types[type]) if @refdata_types[type]
116
- end
117
- builder.refdata = refdata
118
- end
119
- # common sources
120
- builder.items = @items
121
- builder.flags = @flags
122
- builder.lppvs = @lppvs
123
- # optional sources
124
- builder.infos = @infos
125
- builder.packs = @packs
126
- # additional sources
127
- %w[actions orphan migel infos_zur_rose].each do |addition|
128
- builder.send("#{addition}=".intern, self.instance_variable_get("@#{addition}"))
104
+ @the_files = {"calc" => "oddb_calc.xml"} if @options[:calc] && !(@options[:extended] || @options[:artikelstamm])
105
+ builder = Builder.new(@options) do |builder|
106
+ if @options[:calc] && !(@options[:extended] || @options[:artikelstamm])
107
+ builder.packs = @packs
108
+ elsif @options[:address]
109
+ builder.companies = @companies
110
+ builder.people = @people
111
+ else # product
112
+ if @options[:format] != :dat
113
+ refdata = {}
114
+ types.each do |type|
115
+ refdata.merge!(@refdata_types[type]) if @refdata_types[type]
129
116
  end
117
+ builder.refdata = refdata
118
+ end
119
+ # common sources
120
+ builder.items = @items
121
+ builder.flags = @flags
122
+ builder.lppvs = @lppvs
123
+ # optional sources
124
+ builder.infos = @infos
125
+ builder.packs = @packs
126
+ # additional sources
127
+ %w[actions orphan migel infos_zur_rose].each do |addition|
128
+ builder.send("#{addition}=".intern, instance_variable_get("@#{addition}"))
130
129
  end
131
- builder.tag_suffix = @options[:tag_suffix]
132
130
  end
133
- files.each_pair do |sbj, file|
134
- builder.subject = sbj
135
- output = ''
136
- if !@options[:address] and (@options[:format] == :dat)
137
- types.each do |type|
138
- refdata1 = {}
139
- _sbj = (type == :pharma ? :dat : :with_migel_dat)
140
- builder.refdata = @refdata_types[type]
141
- builder.subject = _sbj
142
- builder.ean14 = @options[:ean14]
143
- if type == :nonpharma
144
- output << "\n"
145
- end
146
- output << builder.to_dat
131
+ builder.tag_suffix = @options[:tag_suffix]
132
+ end
133
+ files.each_pair do |sbj, file|
134
+ builder.subject = sbj
135
+ output = ""
136
+ if !@options[:address] && (@options[:format] == :dat)
137
+ types.each do |type|
138
+ a_sby = (type == :pharma ? :dat : :with_migel_dat)
139
+ builder.refdata = @refdata_types[type]
140
+ builder.subject = a_sby
141
+ builder.ean14 = @options[:ean14]
142
+ if type == :nonpharma
143
+ output << "\n"
147
144
  end
148
- else
149
- output = builder.to_xml
145
+ output << builder.to_dat
150
146
  end
151
- File.open(File.join(WorkDir, file), 'w:utf-8') do |fh|
152
- output.split("\n").each do |line|
153
- if /.xml$/i.match(file)
154
- fh.puts(line)
155
- else
156
- fh.puts(Oddb2xml.convert_to_8859_1(line))
157
- end
147
+ else
148
+ output = builder.to_xml
149
+ end
150
+ File.open(File.join(WORK_DIR, file), "w:utf-8") do |fh|
151
+ output.split("\n").each do |line|
152
+ if /.xml$/i.match?(file)
153
+ fh.puts(line)
154
+ else
155
+ fh.puts(Oddb2xml.convert_to_8859_1(line))
158
156
  end
159
157
  end
160
- if @options[:calc]
161
- ext = File.extname(file)
162
- dest = File.join(WorkDir, file.sub(ext, '_'+Time.now.strftime("%d.%m.%Y_%H.%M")+ext))
163
- FileUtils.cp(File.join(WorkDir, file), dest, :verbose => false)
164
- end
165
158
  end
166
- rescue Interrupt
167
- files.values.each do |file|
168
- if File.exist? file
169
- File.unlink(file) # we don't save it as it might be only partly downloaded
170
- end
159
+ if @options[:calc]
160
+ ext = File.extname(file)
161
+ dest = File.join(WORK_DIR, file.sub(ext, "_" + Time.now.strftime("%d.%m.%Y_%H.%M") + ext))
162
+ FileUtils.cp(File.join(WORK_DIR, file), dest, verbose: false)
171
163
  end
172
- raise Interrupt
173
164
  end
165
+ rescue Interrupt
166
+ files.values.each do |file|
167
+ if File.exist? file
168
+ File.unlink(file) # we don't save it as it might be only partly downloaded
169
+ end
170
+ end
171
+ raise Interrupt
174
172
  end
175
- def download(what, type=nil)
173
+
174
+ def download(what, type = nil)
176
175
  case what
177
176
  when :company, :person
178
- var = (what == :company ? 'companies' : 'people')
179
- begin # instead of Thread.new do
180
- downloader = MedregbmDownloader.new(what)
181
- str = downloader.download
182
- Oddb2xml.log("SwissmedicInfoDownloader #{what} str #{str.size} bytes")
183
- self.instance_variable_set(
184
- "@#{var}".intern,
185
- items = MedregbmExtractor.new(str, what).to_arry
186
- )
187
- Oddb2xml.log("MedregbmExtractor #{what} added #{items.size} fachinfo")
188
- items
189
- end
177
+ var = (what == :company ? "companies" : "people")
178
+ # instead of Thread.new do
179
+
180
+ downloader = MedregbmDownloader.new(what)
181
+ str = downloader.download
182
+ Oddb2xml.log("SwissmedicInfoDownloader #{what} str #{str.size} bytes")
183
+ instance_variable_set(
184
+ "@#{var}".intern,
185
+ items = MedregbmExtractor.new(str, what).to_arry
186
+ )
187
+ Oddb2xml.log("MedregbmExtractor #{what} added #{items.size} fachinfo")
188
+ items
189
+
190
190
  when :fachinfo
191
- begin # instead of Thread.new do
192
- downloader = SwissmedicInfoDownloader.new
193
- xml = downloader.download
194
- Oddb2xml.log("SwissmedicInfoDownloader #{var} xml #{xml.size} bytes")
195
- @mutex.synchronize do
196
- hsh = SwissmedicInfoExtractor.new(xml).to_hash
197
- @infos = hsh
198
- Oddb2xml.log("SwissmedicInfoExtractor added #{@infos.size} fachinfo")
199
- @infos
200
- end
191
+ # instead of Thread.new do
192
+
193
+ downloader = SwissmedicInfoDownloader.new
194
+ xml = downloader.download
195
+ Oddb2xml.log("SwissmedicInfoDownloader #{var} xml #{xml.size} bytes")
196
+ @mutex.synchronize do
197
+ hsh = SwissmedicInfoExtractor.new(xml).to_hash
198
+ @infos = hsh
199
+ Oddb2xml.log("SwissmedicInfoExtractor added #{@infos.size} fachinfo")
200
+ @infos
201
201
  end
202
+
202
203
  when :orphan
203
204
  var = what.to_s
204
- begin # instead of Thread.new do
205
- downloader = SwissmedicDownloader.new(what, @options)
206
- bin = downloader.download
207
- Oddb2xml.log("SwissmedicDownloader #{var} #{bin} #{File.size(bin)} bytes")
208
- self.instance_variable_set(
209
- "@#{var}",
210
- items = SwissmedicExtractor.new(bin, what).to_arry
211
- )
212
- Oddb2xml.log("SwissmedicExtractor added #{items.size}")
213
- items
214
- end
205
+ # instead of Thread.new do
206
+
207
+ downloader = SwissmedicDownloader.new(what, @options)
208
+ bin = downloader.download
209
+ Oddb2xml.log("SwissmedicDownloader #{var} #{bin} #{File.size(bin)} bytes")
210
+ instance_variable_set(
211
+ "@#{var}",
212
+ items = SwissmedicExtractor.new(bin, what).to_arry
213
+ )
214
+ Oddb2xml.log("SwissmedicExtractor added #{items.size}")
215
+ items
216
+
215
217
  when :interaction
216
- begin # instead of Thread.new do
217
- downloader = EphaDownloader.new
218
- str = downloader.download
219
- Oddb2xml.log("EphaDownloader str #{str.size} bytes")
220
- @mutex.synchronize do
221
- @actions = EphaExtractor.new(str).to_arry
222
- Oddb2xml.log("EphaExtractor added #{@actions.size} interactions")
223
- @actions
224
- end
218
+ # instead of Thread.new do
219
+
220
+ downloader = EphaDownloader.new
221
+ str = downloader.download
222
+ Oddb2xml.log("EphaDownloader str #{str.size} bytes")
223
+ @mutex.synchronize do
224
+ @actions = EphaExtractor.new(str).to_arry
225
+ Oddb2xml.log("EphaExtractor added #{@actions.size} interactions")
226
+ @actions
225
227
  end
228
+
226
229
  when :migel
227
- begin # instead of Thread.new do
230
+ # instead of Thread.new do
231
+ unless SKIP_MIGEL_DOWNLOADER
232
+
228
233
  downloader = MigelDownloader.new
229
234
  bin = downloader.download
230
235
  Oddb2xml.log("MigelDownloader bin #{bin.size} bytes")
@@ -233,99 +238,107 @@ module Oddb2xml
233
238
  Oddb2xml.log("MigelExtractor added #{@migel.size} migel items")
234
239
  @migel
235
240
  end
236
- end unless SkipMigelDownloader
241
+
242
+ end
237
243
  when :package
238
- begin # instead of Thread.new do
239
- downloader = SwissmedicDownloader.new(:package, @options)
240
- bin = downloader.download
241
- Oddb2xml.log("SwissmedicDownloader package #{bin} #{File.size(bin)} bytes")
242
- @mutex.synchronize do
243
- @packs = SwissmedicExtractor.new(bin, :package).to_hash
244
- Oddb2xml.log("SwissmedicExtractor added #{@packs.size} packs from #{bin}")
245
- @packs
246
- end
244
+ # instead of Thread.new do
245
+
246
+ downloader = SwissmedicDownloader.new(:package, @options)
247
+ bin = downloader.download
248
+ Oddb2xml.log("SwissmedicDownloader package #{bin} #{File.size(bin)} bytes")
249
+ @mutex.synchronize do
250
+ @packs = SwissmedicExtractor.new(bin, :package).to_hash
251
+ Oddb2xml.log("SwissmedicExtractor added #{@packs.size} packs from #{bin}")
252
+ @packs
247
253
  end
254
+
248
255
  when :lppv
249
- begin # instead of Thread.new do
250
- downloader = LppvDownloader.new
251
- str = downloader.download
252
- Oddb2xml.log("LppvDownloader str #{str.size} bytes")
253
- @mutex.synchronize do
254
- @lppvs = LppvExtractor.new(str).to_hash
255
- Oddb2xml.log("LppvExtractor added #{@lppvs.size} lppvs")
256
- @lppvs
257
- end
256
+ # instead of Thread.new do
257
+
258
+ downloader = LppvDownloader.new
259
+ str = downloader.download
260
+ Oddb2xml.log("LppvDownloader str #{str.size} bytes")
261
+ @mutex.synchronize do
262
+ @lppvs = LppvExtractor.new(str).to_hash
263
+ Oddb2xml.log("LppvExtractor added #{@lppvs.size} lppvs")
264
+ @lppvs
258
265
  end
266
+
259
267
  when :bag
260
- begin # instead of Thread.new do
261
- downloader = BagXmlDownloader.new(@options)
262
- xml = downloader.download
263
- Oddb2xml.log("BagXmlDownloader xml #{xml.size} bytes")
264
- @mutex.synchronize do
265
- hsh = BagXmlExtractor.new(xml).to_hash
266
- @items = hsh
267
- Oddb2xml.log("BagXmlExtractor added #{@items.size} items.")
268
- @items
269
- end
268
+ # instead of Thread.new do
269
+
270
+ downloader = BagXmlDownloader.new(@options)
271
+ xml = downloader.download
272
+ Oddb2xml.log("BagXmlDownloader xml #{xml.size} bytes")
273
+ @mutex.synchronize do
274
+ hsh = BagXmlExtractor.new(xml).to_hash
275
+ @items = hsh
276
+ Oddb2xml.log("BagXmlExtractor added #{@items.size} items.")
277
+ @items
270
278
  end
279
+
271
280
  when :zurrose
272
- begin # instead of Thread.new do
273
- downloader = ZurroseDownloader.new(@options, @options[:transfer_dat])
274
- xml = downloader.download
275
- Oddb2xml.log("ZurroseDownloader xml #{xml.size} bytes")
276
- @mutex.synchronize do
277
- hsh = ZurroseExtractor.new(xml, @options[:extended], @options[:artikelstamm]).to_hash
278
- Oddb2xml.log("ZurroseExtractor added #{hsh.size} items from xml with #{xml.size} bytes")
279
- @infos_zur_rose = hsh
280
- end
281
+ # instead of Thread.new do
282
+
283
+ downloader = ZurroseDownloader.new(@options, @options[:transfer_dat])
284
+ xml = downloader.download
285
+ Oddb2xml.log("ZurroseDownloader xml #{xml.size} bytes")
286
+ @mutex.synchronize do
287
+ hsh = ZurroseExtractor.new(xml, @options[:extended], @options[:artikelstamm]).to_hash
288
+ Oddb2xml.log("ZurroseExtractor added #{hsh.size} items from xml with #{xml.size} bytes")
289
+ @infos_zur_rose = hsh
281
290
  end
291
+
282
292
  when :refdata
283
- begin # instead of Thread.new do
284
- downloader = RefdataDownloader.new(@options, type)
285
- begin
286
- xml = downloader.download
287
- Oddb2xml.log("RefdataDownloader #{type} xml #{xml.size} bytes")
288
- xml
289
- rescue SystemExit
290
- @mutex.synchronize do
291
- unless @_message # hook only one exit
292
- @_message = true
293
- exit
294
- end
295
- end
296
- end
293
+ # instead of Thread.new do
294
+
295
+ downloader = RefdataDownloader.new(@options, type)
296
+ begin
297
+ xml = downloader.download
298
+ Oddb2xml.log("RefdataDownloader #{type} xml #{xml.size} bytes")
299
+ xml
300
+ rescue SystemExit
297
301
  @mutex.synchronize do
298
- hsh = RefdataExtractor.new(xml, type).to_hash
299
- @refdata_types[type] = hsh
300
- Oddb2xml.log("RefdataExtractor #{type} added #{hsh.size} keys now #{@refdata_types.keys} items from xml with #{xml.size} bytes")
301
- @refdata_types[type]
302
+ unless @_message # hook only one exit
303
+ @_message = true
304
+ exit
305
+ end
302
306
  end
303
307
  end
308
+ @mutex.synchronize do
309
+ hsh = RefdataExtractor.new(xml, type).to_hash
310
+ @refdata_types[type] = hsh
311
+ Oddb2xml.log("RefdataExtractor #{type} added #{hsh.size} keys now #{@refdata_types.keys} items from xml with #{xml.size} bytes")
312
+ @refdata_types[type]
313
+ end
314
+
304
315
  end
305
316
  end
317
+
306
318
  def compress
307
319
  compressor = Compressor.new(prefix, @options)
308
320
  files.values.each do |file|
309
- work_file = File.join(WorkDir, file)
310
- if File.exists?(work_file)
321
+ work_file = File.join(WORK_DIR, file)
322
+ if File.exist?(work_file)
311
323
  compressor.contents << work_file
312
324
  end
313
325
  end
314
326
  compressor.finalize!
315
327
  end
328
+
316
329
  def files
317
- unless @_files
318
- @_files = {}
319
- @_files[:calc] = "oddb_calc.xml" if @options[:calc]
330
+ unless @the_files
331
+ @the_files = {}
332
+ @the_files[:calc] = "oddb_calc.xml" if @options[:calc]
320
333
  if @options[:artikelstamm]
321
- @_files[:artikelstamm] = "artikelstamm_#{Date.today.strftime('%d%m%Y')}_v5.xml"
334
+ @the_files[:artikelstamm] = "artikelstamm_#{Date.today.strftime("%d%m%Y")}_v5.xml"
322
335
  elsif @options[:address]
323
- @_files[:company] = "#{prefix}_betrieb.xml"
324
- @_files[:person] = "#{prefix}_medizinalperson.xml"
336
+ @the_files[:company] = "#{prefix}_betrieb.xml"
337
+ @the_files[:person] = "#{prefix}_medizinalperson.xml"
325
338
  elsif @options[:format] == :dat
326
- @_files[:dat] = "#{prefix}.dat"
339
+ @the_files[:dat] = "#{prefix}.dat"
327
340
  if @options[:nonpharma] # into one file
328
- @_files[:dat] = "#{prefix}_with_migel.dat"
341
+ @the_files[:dat] = "#{prefix}_with_migel.dat"
329
342
  end
330
343
  else # xml
331
344
  ##
@@ -333,18 +346,20 @@ module Oddb2xml
333
346
  # 1. additions
334
347
  # 2. subjects
335
348
  # 3. optional SUBJECTS
336
- _files = (ADDITIONS + SUBJECTS)
337
- _files += OPTIONALS if @options[:fi]
338
- _files.each do|sbj|
339
- @_files[sbj] = "#{prefix}_#{sbj.to_s}.xml"
349
+ the_files = (ADDITIONS + SUBJECTS)
350
+ the_files += OPTIONALS if @options[:fi]
351
+ the_files.each do |sbj|
352
+ @the_files[sbj] = "#{prefix}_#{sbj}.xml"
340
353
  end
341
354
  end
342
355
  end
343
- @_files
356
+ @the_files
344
357
  end
358
+
345
359
  def prefix
346
- @_prefix ||= (@options[:tag_suffix] || 'oddb').gsub(/^_|_$/, '').downcase
360
+ @_prefix ||= (@options[:tag_suffix] || "oddb").gsub(/^_|_$/, "").downcase
347
361
  end
362
+
348
363
  def report
349
364
  lines = []
350
365
  if @options[:calc]
@@ -353,45 +368,46 @@ module Oddb2xml
353
368
  lines << Calc.report_conversion
354
369
  lines << ParseComposition.report
355
370
  end
356
- if @options[:artikelstamm]
371
+ if @options[:artikelstamm]
357
372
  lines << "Generated artikelstamm.xml for Elexis"
358
373
  lines += Builder.articlestamm_v5_info_lines
374
+ elsif @options[:address]
375
+ {
376
+ "Betrieb" => :@companies,
377
+ "Person" => :@people
378
+ }.each do |type, var|
379
+ lines << sprintf(
380
+ "#{type} addresses: %i", instance_variable_get(var).length
381
+ )
382
+ end
359
383
  else
360
- unless @options[:address]
361
- types.each do |type|
362
- if @refdata_types[type]
363
- indices = @refdata_types[type].values.flatten.length
384
+ types.each do |type|
385
+ if @refdata_types[type]
386
+ indices = @refdata_types[type].values.flatten.length
364
387
 
365
- if type == :nonpharma
366
- nonpharmas = @refdata_types[type].keys
367
- if SkipMigelDownloader
368
- indices + nonpharmas.length
369
- else
370
- migel_xls = @migel.values.compact.select{|m| !m[:pharmacode]}.map{|m| m[:pharmacode] }
371
- indices += (migel_xls - nonpharmas).length # ignore duplicates, null
372
- end
373
- lines << sprintf("\tNonPharma products: %i", indices)
388
+ if type == :nonpharma
389
+ nonpharmas = @refdata_types[type].keys
390
+ if SKIP_MIGEL_DOWNLOADER
391
+ indices + nonpharmas.length
374
392
  else
375
- lines << sprintf("\tPharma products: %i", indices)
393
+ migel_xls = @migel.values.compact.select { |m| !m[:pharmacode] }.map { |m| m[:pharmacode] }
394
+ indices += (migel_xls - nonpharmas).length # ignore duplicates, null
376
395
  end
396
+ lines << sprintf("\tNonPharma products: %i", indices)
397
+ else
398
+ lines << sprintf("\tPharma products: %i", indices)
377
399
  end
378
400
  end
379
- if (@options[:extended] || @options[:artikelstamm])
380
- lines << sprintf("\tInformation items zur Rose: %i", @infos_zur_rose.length)
381
- end
382
- else
383
- {
384
- 'Betrieb' => :@companies,
385
- 'Person' => :@people
386
- }.each do |type, var|
387
- lines << sprintf(
388
- "#{type} addresses: %i", self.instance_variable_get(var).length)
389
- end
401
+ end
402
+ if @options[:extended] || @options[:artikelstamm]
403
+ lines << sprintf("\tInformation items zur Rose: %i", @infos_zur_rose.length)
390
404
  end
391
405
  end
392
406
  puts lines.join("\n")
393
407
  end
394
- def types # RefData
408
+
409
+ # RefData
410
+ def types
395
411
  @_types ||=
396
412
  if @options[:nonpharma] || @options[:artikelstamm]
397
413
  [:pharma, :nonpharma]