oddb2xml 2.6.9 → 2.7.4

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 (51) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +40 -0
  3. data/.standard.yml +2 -0
  4. data/Elexis_Artikelstamm_v5.xsd +0 -3
  5. data/Gemfile +3 -3
  6. data/History.txt +28 -0
  7. data/README.md +3 -3
  8. data/Rakefile +24 -23
  9. data/bin/check_artikelstamm +11 -11
  10. data/bin/compare_v5 +23 -23
  11. data/bin/oddb2xml +14 -13
  12. data/lib/oddb2xml.rb +1 -1
  13. data/lib/oddb2xml/builder.rb +1075 -1048
  14. data/lib/oddb2xml/calc.rb +232 -233
  15. data/lib/oddb2xml/chapter_70_hack.rb +38 -32
  16. data/lib/oddb2xml/cli.rb +252 -235
  17. data/lib/oddb2xml/compare.rb +70 -59
  18. data/lib/oddb2xml/compositions_syntax.rb +448 -430
  19. data/lib/oddb2xml/compressor.rb +20 -20
  20. data/lib/oddb2xml/downloader.rb +156 -128
  21. data/lib/oddb2xml/extractor.rb +295 -302
  22. data/lib/oddb2xml/options.rb +34 -35
  23. data/lib/oddb2xml/parslet_compositions.rb +263 -269
  24. data/lib/oddb2xml/semantic_check.rb +39 -33
  25. data/lib/oddb2xml/util.rb +166 -164
  26. data/lib/oddb2xml/version.rb +1 -1
  27. data/lib/oddb2xml/xml_definitions.rb +32 -33
  28. data/oddb2xml.gemspec +32 -31
  29. data/spec/artikelstamm_spec.rb +116 -135
  30. data/spec/builder_spec.rb +495 -524
  31. data/spec/calc_spec.rb +552 -593
  32. data/spec/check_artikelstamm_spec.rb +26 -26
  33. data/spec/cli_spec.rb +173 -174
  34. data/spec/compare_spec.rb +9 -11
  35. data/spec/composition_syntax_spec.rb +390 -409
  36. data/spec/compressor_spec.rb +48 -48
  37. data/spec/data/refdata_NonPharma.xml +0 -3
  38. data/spec/data/refdata_Pharma.xml +0 -26
  39. data/spec/data/transfer.dat +1 -0
  40. data/spec/data/varia_De.htm +2 -2
  41. data/spec/data_helper.rb +47 -49
  42. data/spec/downloader_spec.rb +251 -260
  43. data/spec/extractor_spec.rb +172 -164
  44. data/spec/galenic_spec.rb +233 -256
  45. data/spec/options_spec.rb +116 -119
  46. data/spec/parslet_spec.rb +833 -861
  47. data/spec/spec_helper.rb +153 -153
  48. data/test_options.rb +39 -42
  49. data/tools/win_fetch_cacerts.rb +2 -3
  50. metadata +48 -5
  51. data/.travis.yml +0 -29
@@ -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: true) 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,148 +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
- exit(2)
92
- 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
93
90
  end
94
91
  compress if @options[:compress_ext]
95
92
  res = report
96
- nrSecs = (Time.now - startTime).to_i
97
- 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
98
98
  res
99
99
  end
100
+
100
101
  private
102
+
101
103
  def build
102
- begin
103
- @_files = {"calc"=>"oddb_calc.xml"} if @options[:calc] and not (@options[:extended] || @options[:artikelstamm])
104
- builder = Builder.new(@options) do |builder|
105
- if @options[:calc] and not (@options[:extended] || @options[:artikelstamm])
106
- builder.packs = @packs
107
- elsif @options[:address]
108
- builder.companies = @companies
109
- builder.people = @people
110
- else # product
111
- if @options[:format] != :dat
112
- refdata = {}
113
- types.each do |type|
114
- refdata.merge!(@refdata_types[type]) if @refdata_types[type]
115
- end
116
- builder.refdata = refdata
117
- end
118
- # common sources
119
- builder.items = @items
120
- builder.flags = @flags
121
- builder.lppvs = @lppvs
122
- # optional sources
123
- builder.infos = @infos
124
- builder.packs = @packs
125
- # additional sources
126
- %w[actions orphan migel infos_zur_rose].each do |addition|
127
- 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]
128
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}"))
129
129
  end
130
- builder.tag_suffix = @options[:tag_suffix]
131
130
  end
132
- files.each_pair do |sbj, file|
133
- builder.subject = sbj
134
- output = ''
135
- if !@options[:address] and (@options[:format] == :dat)
136
- types.each do |type|
137
- refdata1 = {}
138
- _sbj = (type == :pharma ? :dat : :with_migel_dat)
139
- builder.refdata = @refdata_types[type]
140
- builder.subject = _sbj
141
- builder.ean14 = @options[:ean14]
142
- if type == :nonpharma
143
- output << "\n"
144
- end
145
- 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"
146
144
  end
147
- else
148
- output = builder.to_xml
145
+ output << builder.to_dat
149
146
  end
150
- File.open(File.join(WorkDir, 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))
156
- 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))
157
156
  end
158
157
  end
159
- if @options[:calc]
160
- ext = File.extname(file)
161
- dest = File.join(WorkDir, file.sub(ext, '_'+Time.now.strftime("%d.%m.%Y_%H.%M")+ext))
162
- FileUtils.cp(File.join(WorkDir, file), dest, :verbose => false)
163
- end
164
158
  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
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)
170
163
  end
171
- raise Interrupt
172
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
173
172
  end
174
- def download(what, type=nil)
173
+
174
+ def download(what, type = nil)
175
175
  case what
176
176
  when :company, :person
177
- var = (what == :company ? 'companies' : 'people')
178
- begin # instead of Thread.new do
179
- downloader = MedregbmDownloader.new(what)
180
- str = downloader.download
181
- Oddb2xml.log("SwissmedicInfoDownloader #{what} str #{str.size} bytes")
182
- self.instance_variable_set(
183
- "@#{var}".intern,
184
- items = MedregbmExtractor.new(str, what).to_arry
185
- )
186
- Oddb2xml.log("MedregbmExtractor #{what} added #{items.size} fachinfo")
187
- items
188
- 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
+
189
190
  when :fachinfo
190
- begin # instead of Thread.new do
191
- downloader = SwissmedicInfoDownloader.new
192
- xml = downloader.download
193
- Oddb2xml.log("SwissmedicInfoDownloader #{var} xml #{xml.size} bytes")
194
- @mutex.synchronize do
195
- hsh = SwissmedicInfoExtractor.new(xml).to_hash
196
- @infos = hsh
197
- Oddb2xml.log("SwissmedicInfoExtractor added #{@infos.size} fachinfo")
198
- @infos
199
- 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
200
201
  end
202
+
201
203
  when :orphan
202
204
  var = what.to_s
203
- begin # instead of Thread.new do
204
- downloader = SwissmedicDownloader.new(what, @options)
205
- bin = downloader.download
206
- Oddb2xml.log("SwissmedicDownloader #{var} #{bin} #{File.size(bin)} bytes")
207
- self.instance_variable_set(
208
- "@#{var}",
209
- items = SwissmedicExtractor.new(bin, what).to_arry
210
- )
211
- Oddb2xml.log("SwissmedicExtractor added #{items.size}")
212
- items
213
- 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} from #{bin}")
215
+ items
216
+
214
217
  when :interaction
215
- begin # instead of Thread.new do
216
- downloader = EphaDownloader.new
217
- str = downloader.download
218
- Oddb2xml.log("EphaDownloader str #{str.size} bytes")
219
- @mutex.synchronize do
220
- @actions = EphaExtractor.new(str).to_arry
221
- Oddb2xml.log("EphaExtractor added #{@actions.size} interactions")
222
- @actions
223
- 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
224
227
  end
228
+
225
229
  when :migel
226
- begin # instead of Thread.new do
230
+ # instead of Thread.new do
231
+ unless SKIP_MIGEL_DOWNLOADER
232
+
227
233
  downloader = MigelDownloader.new
228
234
  bin = downloader.download
229
235
  Oddb2xml.log("MigelDownloader bin #{bin.size} bytes")
@@ -232,99 +238,107 @@ module Oddb2xml
232
238
  Oddb2xml.log("MigelExtractor added #{@migel.size} migel items")
233
239
  @migel
234
240
  end
235
- end unless SkipMigelDownloader
241
+
242
+ end
236
243
  when :package
237
- begin # instead of Thread.new do
238
- downloader = SwissmedicDownloader.new(:package, @options)
239
- bin = downloader.download
240
- Oddb2xml.log("SwissmedicDownloader package #{bin} #{File.size(bin)} bytes")
241
- @mutex.synchronize do
242
- @packs = SwissmedicExtractor.new(bin, :package).to_hash
243
- Oddb2xml.log("SwissmedicExtractor added #{@packs.size} packs from #{bin}")
244
- @packs
245
- 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
246
253
  end
254
+
247
255
  when :lppv
248
- begin # instead of Thread.new do
249
- downloader = LppvDownloader.new
250
- str = downloader.download
251
- Oddb2xml.log("LppvDownloader str #{str.size} bytes")
252
- @mutex.synchronize do
253
- @lppvs = LppvExtractor.new(str).to_hash
254
- Oddb2xml.log("LppvExtractor added #{@lppvs.size} lppvs")
255
- @lppvs
256
- 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
257
265
  end
266
+
258
267
  when :bag
259
- begin # instead of Thread.new do
260
- downloader = BagXmlDownloader.new(@options)
261
- xml = downloader.download
262
- Oddb2xml.log("BagXmlDownloader xml #{xml.size} bytes")
263
- @mutex.synchronize do
264
- hsh = BagXmlExtractor.new(xml).to_hash
265
- @items = hsh
266
- Oddb2xml.log("BagXmlExtractor added #{@items.size} items.")
267
- @items
268
- 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
269
278
  end
279
+
270
280
  when :zurrose
271
- begin # instead of Thread.new do
272
- downloader = ZurroseDownloader.new(@options, @options[:transfer_dat])
273
- xml = downloader.download
274
- Oddb2xml.log("ZurroseDownloader xml #{xml.size} bytes")
275
- @mutex.synchronize do
276
- hsh = ZurroseExtractor.new(xml, @options[:extended], @options[:artikelstamm]).to_hash
277
- Oddb2xml.log("ZurroseExtractor added #{hsh.size} items from xml with #{xml.size} bytes")
278
- @infos_zur_rose = hsh
279
- 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
280
290
  end
291
+
281
292
  when :refdata
282
- begin # instead of Thread.new do
283
- downloader = RefdataDownloader.new(@options, type)
284
- begin
285
- xml = downloader.download
286
- Oddb2xml.log("RefdataDownloader #{type} xml #{xml.size} bytes")
287
- xml
288
- rescue SystemExit
289
- @mutex.synchronize do
290
- unless @_message # hook only one exit
291
- @_message = true
292
- exit
293
- end
294
- end
295
- 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
296
301
  @mutex.synchronize do
297
- hsh = RefdataExtractor.new(xml, type).to_hash
298
- @refdata_types[type] = hsh
299
- Oddb2xml.log("RefdataExtractor #{type} added #{hsh.size} keys now #{@refdata_types.keys} items from xml with #{xml.size} bytes")
300
- @refdata_types[type]
302
+ unless @_message # hook only one exit
303
+ @_message = true
304
+ exit
305
+ end
301
306
  end
302
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
+
303
315
  end
304
316
  end
317
+
305
318
  def compress
306
319
  compressor = Compressor.new(prefix, @options)
307
320
  files.values.each do |file|
308
- work_file = File.join(WorkDir, file)
309
- if File.exists?(work_file)
321
+ work_file = File.join(WORK_DIR, file)
322
+ if File.exist?(work_file)
310
323
  compressor.contents << work_file
311
324
  end
312
325
  end
313
326
  compressor.finalize!
314
327
  end
328
+
315
329
  def files
316
- unless @_files
317
- @_files = {}
318
- @_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]
319
333
  if @options[:artikelstamm]
320
- @_files[:artikelstamm] = "artikelstamm_#{Date.today.strftime('%d%m%Y')}_v5.xml"
334
+ @the_files[:artikelstamm] = "artikelstamm_#{Date.today.strftime("%d%m%Y")}_v5.xml"
321
335
  elsif @options[:address]
322
- @_files[:company] = "#{prefix}_betrieb.xml"
323
- @_files[:person] = "#{prefix}_medizinalperson.xml"
336
+ @the_files[:company] = "#{prefix}_betrieb.xml"
337
+ @the_files[:person] = "#{prefix}_medizinalperson.xml"
324
338
  elsif @options[:format] == :dat
325
- @_files[:dat] = "#{prefix}.dat"
339
+ @the_files[:dat] = "#{prefix}.dat"
326
340
  if @options[:nonpharma] # into one file
327
- @_files[:dat] = "#{prefix}_with_migel.dat"
341
+ @the_files[:dat] = "#{prefix}_with_migel.dat"
328
342
  end
329
343
  else # xml
330
344
  ##
@@ -332,18 +346,20 @@ module Oddb2xml
332
346
  # 1. additions
333
347
  # 2. subjects
334
348
  # 3. optional SUBJECTS
335
- _files = (ADDITIONS + SUBJECTS)
336
- _files += OPTIONALS if @options[:fi]
337
- _files.each do|sbj|
338
- @_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"
339
353
  end
340
354
  end
341
355
  end
342
- @_files
356
+ @the_files
343
357
  end
358
+
344
359
  def prefix
345
- @_prefix ||= (@options[:tag_suffix] || 'oddb').gsub(/^_|_$/, '').downcase
360
+ @_prefix ||= (@options[:tag_suffix] || "oddb").gsub(/^_|_$/, "").downcase
346
361
  end
362
+
347
363
  def report
348
364
  lines = []
349
365
  if @options[:calc]
@@ -352,45 +368,46 @@ module Oddb2xml
352
368
  lines << Calc.report_conversion
353
369
  lines << ParseComposition.report
354
370
  end
355
- if @options[:artikelstamm]
371
+ if @options[:artikelstamm]
356
372
  lines << "Generated artikelstamm.xml for Elexis"
357
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
358
383
  else
359
- unless @options[:address]
360
- types.each do |type|
361
- if @refdata_types[type]
362
- 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
363
387
 
364
- if type == :nonpharma
365
- nonpharmas = @refdata_types[type].keys
366
- if SkipMigelDownloader
367
- indices + nonpharmas.length
368
- else
369
- migel_xls = @migel.values.compact.select{|m| !m[:pharmacode]}.map{|m| m[:pharmacode] }
370
- indices += (migel_xls - nonpharmas).length # ignore duplicates, null
371
- end
372
- 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
373
392
  else
374
- 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
375
395
  end
396
+ lines << sprintf("\tNonPharma products: %i", indices)
397
+ else
398
+ lines << sprintf("\tPharma products: %i", indices)
376
399
  end
377
400
  end
378
- if (@options[:extended] || @options[:artikelstamm])
379
- lines << sprintf("\tInformation items zur Rose: %i", @infos_zur_rose.length)
380
- end
381
- else
382
- {
383
- 'Betrieb' => :@companies,
384
- 'Person' => :@people
385
- }.each do |type, var|
386
- lines << sprintf(
387
- "#{type} addresses: %i", self.instance_variable_get(var).length)
388
- end
401
+ end
402
+ if @options[:extended] || @options[:artikelstamm]
403
+ lines << sprintf("\tInformation items zur Rose: %i", @infos_zur_rose.length)
389
404
  end
390
405
  end
391
406
  puts lines.join("\n")
392
407
  end
393
- def types # RefData
408
+
409
+ # RefData
410
+ def types
394
411
  @_types ||=
395
412
  if @options[:nonpharma] || @options[:artikelstamm]
396
413
  [:pharma, :nonpharma]