oddb2xml 2.7.1 → 2.7.2

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.
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]