oddb2xml 2.6.7 → 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 (53) hide show
  1. checksums.yaml +4 -4
  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 +30 -0
  7. data/README.md +1 -1
  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 +1077 -1039
  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 -233
  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 +155 -129
  21. data/lib/oddb2xml/extractor.rb +302 -296
  22. data/lib/oddb2xml/options.rb +34 -35
  23. data/lib/oddb2xml/parslet_compositions.rb +263 -265
  24. data/lib/oddb2xml/semantic_check.rb +39 -33
  25. data/lib/oddb2xml/util.rb +169 -159
  26. data/lib/oddb2xml/version.rb +1 -1
  27. data/lib/oddb2xml/xml_definitions.rb +32 -33
  28. data/oddb2xml.gemspec +32 -30
  29. data/spec/artikelstamm_spec.rb +139 -132
  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 +182 -157
  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/Preparations.xml +139 -3
  38. data/spec/data/refdata_NonPharma.xml +0 -3
  39. data/spec/data/refdata_Pharma.xml +10 -25
  40. data/spec/data/swissmedic_package.xlsx +0 -0
  41. data/spec/data/transfer.dat +3 -1
  42. data/spec/data/varia_De.htm +2 -2
  43. data/spec/data_helper.rb +47 -49
  44. data/spec/downloader_spec.rb +247 -260
  45. data/spec/extractor_spec.rb +173 -165
  46. data/spec/galenic_spec.rb +233 -256
  47. data/spec/options_spec.rb +116 -119
  48. data/spec/parslet_spec.rb +833 -861
  49. data/spec/spec_helper.rb +154 -153
  50. data/test_options.rb +39 -42
  51. data/tools/win_fetch_cacerts.rb +2 -3
  52. metadata +49 -5
  53. data/.travis.yml +0 -30
@@ -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(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,146 +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
- FileUtils.cp(File.join(WorkDir, file), File.join(WorkDir, file.sub('.xml', '_'+Time.now.strftime("%d.%m.%Y_%H.%M")+'.xml')), :verbose => false)
161
- end
162
158
  end
163
- rescue Interrupt
164
- files.values.each do |file|
165
- if File.exist? file
166
- File.unlink(file) # we don't save it as it might be only partly downloaded
167
- 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)
168
163
  end
169
- raise Interrupt
170
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
171
172
  end
172
- def download(what, type=nil)
173
+
174
+ def download(what, type = nil)
173
175
  case what
174
176
  when :company, :person
175
- var = (what == :company ? 'companies' : 'people')
176
- begin # instead of Thread.new do
177
- downloader = MedregbmDownloader.new(what)
178
- str = downloader.download
179
- Oddb2xml.log("SwissmedicInfoDownloader #{what} str #{str.size} bytes")
180
- self.instance_variable_set(
181
- "@#{var}".intern,
182
- items = MedregbmExtractor.new(str, what).to_arry
183
- )
184
- Oddb2xml.log("MedregbmExtractor #{what} added #{items.size} fachinfo")
185
- items
186
- 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
+
187
190
  when :fachinfo
188
- begin # instead of Thread.new do
189
- downloader = SwissmedicInfoDownloader.new
190
- xml = downloader.download
191
- Oddb2xml.log("SwissmedicInfoDownloader #{var} xml #{xml.size} bytes")
192
- @mutex.synchronize do
193
- hsh = SwissmedicInfoExtractor.new(xml).to_hash
194
- @infos = hsh
195
- Oddb2xml.log("SwissmedicInfoExtractor added #{@infos.size} fachinfo")
196
- @infos
197
- 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
198
201
  end
202
+
199
203
  when :orphan
200
204
  var = what.to_s
201
- begin # instead of Thread.new do
202
- downloader = SwissmedicDownloader.new(what, @options)
203
- bin = downloader.download
204
- Oddb2xml.log("SwissmedicDownloader #{var} #{bin} #{File.size(bin)} bytes")
205
- self.instance_variable_set(
206
- "@#{var}",
207
- items = SwissmedicExtractor.new(bin, what).to_arry
208
- )
209
- Oddb2xml.log("SwissmedicExtractor added #{items.size}")
210
- items
211
- 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
+
212
217
  when :interaction
213
- begin # instead of Thread.new do
214
- downloader = EphaDownloader.new
215
- str = downloader.download
216
- Oddb2xml.log("EphaDownloader str #{str.size} bytes")
217
- @mutex.synchronize do
218
- @actions = EphaExtractor.new(str).to_arry
219
- Oddb2xml.log("EphaExtractor added #{@actions.size} interactions")
220
- @actions
221
- 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
222
227
  end
228
+
223
229
  when :migel
224
- begin # instead of Thread.new do
230
+ # instead of Thread.new do
231
+ unless SKIP_MIGEL_DOWNLOADER
232
+
225
233
  downloader = MigelDownloader.new
226
234
  bin = downloader.download
227
235
  Oddb2xml.log("MigelDownloader bin #{bin.size} bytes")
@@ -230,99 +238,107 @@ module Oddb2xml
230
238
  Oddb2xml.log("MigelExtractor added #{@migel.size} migel items")
231
239
  @migel
232
240
  end
233
- end unless SkipMigelDownloader
241
+
242
+ end
234
243
  when :package
235
- begin # instead of Thread.new do
236
- downloader = SwissmedicDownloader.new(:package, @options)
237
- bin = downloader.download
238
- Oddb2xml.log("SwissmedicDownloader package #{bin} #{File.size(bin)} bytes")
239
- @mutex.synchronize do
240
- @packs = SwissmedicExtractor.new(bin, :package).to_hash
241
- Oddb2xml.log("SwissmedicExtractor added #{@packs.size} packs from #{bin}")
242
- @packs
243
- 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
244
253
  end
254
+
245
255
  when :lppv
246
- begin # instead of Thread.new do
247
- downloader = LppvDownloader.new
248
- str = downloader.download
249
- Oddb2xml.log("LppvDownloader str #{str.size} bytes")
250
- @mutex.synchronize do
251
- @lppvs = LppvExtractor.new(str).to_hash
252
- Oddb2xml.log("LppvExtractor added #{@lppvs.size} lppvs")
253
- @lppvs
254
- 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
255
265
  end
266
+
256
267
  when :bag
257
- begin # instead of Thread.new do
258
- downloader = BagXmlDownloader.new(@options)
259
- xml = downloader.download
260
- Oddb2xml.log("BagXmlDownloader xml #{xml.size} bytes")
261
- @mutex.synchronize do
262
- hsh = BagXmlExtractor.new(xml).to_hash
263
- @items = hsh
264
- Oddb2xml.log("BagXmlExtractor added #{@items.size} items.")
265
- @items
266
- 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
267
278
  end
279
+
268
280
  when :zurrose
269
- begin # instead of Thread.new do
270
- downloader = ZurroseDownloader.new(@options, @options[:transfer_dat])
271
- xml = downloader.download
272
- Oddb2xml.log("ZurroseDownloader xml #{xml.size} bytes")
273
- @mutex.synchronize do
274
- hsh = ZurroseExtractor.new(xml, @options[:extended], @options[:artikelstamm]).to_hash
275
- Oddb2xml.log("ZurroseExtractor added #{hsh.size} items from xml with #{xml.size} bytes")
276
- @infos_zur_rose = hsh
277
- 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
278
290
  end
291
+
279
292
  when :refdata
280
- begin # instead of Thread.new do
281
- downloader = RefdataDownloader.new(@options, type)
282
- begin
283
- xml = downloader.download
284
- Oddb2xml.log("RefdataDownloader #{type} xml #{xml.size} bytes")
285
- xml
286
- rescue SystemExit
287
- @mutex.synchronize do
288
- unless @_message # hook only one exit
289
- @_message = true
290
- exit
291
- end
292
- end
293
- 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
294
301
  @mutex.synchronize do
295
- hsh = RefdataExtractor.new(xml, type).to_hash
296
- @refdata_types[type] = hsh
297
- Oddb2xml.log("RefdataExtractor #{type} added #{hsh.size} keys now #{@refdata_types.keys} items from xml with #{xml.size} bytes")
298
- @refdata_types[type]
302
+ unless @_message # hook only one exit
303
+ @_message = true
304
+ exit
305
+ end
299
306
  end
300
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
+
301
315
  end
302
316
  end
317
+
303
318
  def compress
304
319
  compressor = Compressor.new(prefix, @options)
305
320
  files.values.each do |file|
306
- work_file = File.join(WorkDir, file)
307
- if File.exists?(work_file)
321
+ work_file = File.join(WORK_DIR, file)
322
+ if File.exist?(work_file)
308
323
  compressor.contents << work_file
309
324
  end
310
325
  end
311
326
  compressor.finalize!
312
327
  end
328
+
313
329
  def files
314
- unless @_files
315
- @_files = {}
316
- @_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]
317
333
  if @options[:artikelstamm]
318
- @_files[:artikelstamm] = "artikelstamm_#{Date.today.strftime('%d%m%Y')}_v5.xml"
334
+ @the_files[:artikelstamm] = "artikelstamm_#{Date.today.strftime("%d%m%Y")}_v5.xml"
319
335
  elsif @options[:address]
320
- @_files[:company] = "#{prefix}_betrieb.xml"
321
- @_files[:person] = "#{prefix}_medizinalperson.xml"
336
+ @the_files[:company] = "#{prefix}_betrieb.xml"
337
+ @the_files[:person] = "#{prefix}_medizinalperson.xml"
322
338
  elsif @options[:format] == :dat
323
- @_files[:dat] = "#{prefix}.dat"
339
+ @the_files[:dat] = "#{prefix}.dat"
324
340
  if @options[:nonpharma] # into one file
325
- @_files[:dat] = "#{prefix}_with_migel.dat"
341
+ @the_files[:dat] = "#{prefix}_with_migel.dat"
326
342
  end
327
343
  else # xml
328
344
  ##
@@ -330,18 +346,20 @@ module Oddb2xml
330
346
  # 1. additions
331
347
  # 2. subjects
332
348
  # 3. optional SUBJECTS
333
- _files = (ADDITIONS + SUBJECTS)
334
- _files += OPTIONALS if @options[:fi]
335
- _files.each do|sbj|
336
- @_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"
337
353
  end
338
354
  end
339
355
  end
340
- @_files
356
+ @the_files
341
357
  end
358
+
342
359
  def prefix
343
- @_prefix ||= (@options[:tag_suffix] || 'oddb').gsub(/^_|_$/, '').downcase
360
+ @_prefix ||= (@options[:tag_suffix] || "oddb").gsub(/^_|_$/, "").downcase
344
361
  end
362
+
345
363
  def report
346
364
  lines = []
347
365
  if @options[:calc]
@@ -350,45 +368,46 @@ module Oddb2xml
350
368
  lines << Calc.report_conversion
351
369
  lines << ParseComposition.report
352
370
  end
353
- if @options[:artikelstamm]
371
+ if @options[:artikelstamm]
354
372
  lines << "Generated artikelstamm.xml for Elexis"
355
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
356
383
  else
357
- unless @options[:address]
358
- types.each do |type|
359
- if @refdata_types[type]
360
- 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
361
387
 
362
- if type == :nonpharma
363
- nonpharmas = @refdata_types[type].keys
364
- if SkipMigelDownloader
365
- indices + nonpharmas.length
366
- else
367
- migel_xls = @migel.values.compact.select{|m| !m[:pharmacode]}.map{|m| m[:pharmacode] }
368
- indices += (migel_xls - nonpharmas).length # ignore duplicates, null
369
- end
370
- 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
371
392
  else
372
- 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
373
395
  end
396
+ lines << sprintf("\tNonPharma products: %i", indices)
397
+ else
398
+ lines << sprintf("\tPharma products: %i", indices)
374
399
  end
375
400
  end
376
- if (@options[:extended] || @options[:artikelstamm])
377
- lines << sprintf("\tInformation items zur Rose: %i", @infos_zur_rose.length)
378
- end
379
- else
380
- {
381
- 'Betrieb' => :@companies,
382
- 'Person' => :@people
383
- }.each do |type, var|
384
- lines << sprintf(
385
- "#{type} addresses: %i", self.instance_variable_get(var).length)
386
- end
401
+ end
402
+ if @options[:extended] || @options[:artikelstamm]
403
+ lines << sprintf("\tInformation items zur Rose: %i", @infos_zur_rose.length)
387
404
  end
388
405
  end
389
406
  puts lines.join("\n")
390
407
  end
391
- def types # RefData
408
+
409
+ # RefData
410
+ def types
392
411
  @_types ||=
393
412
  if @options[:nonpharma] || @options[:artikelstamm]
394
413
  [:pharma, :nonpharma]