module Oddb2xml
Constants
- COLUMNS_FEBRUARY_2019
please keep this constant in sync between (GEM) swissmedic-diff/lib/swissmedic-diff.rb and (GEM) oddb2xml/lib/oddb2xml/extractor.rb
- COLUMNS_JULY_2015
- DOWNLOADS
- FAKE_GTIN_START
- GalenicForm
- GalenicGroup
Calc
is responsible for analysing the columns “Packungsgrösse” and “Einheit”- VERSION
- WORK_DIR
- XML_OPTIONS
Public Class Methods
add_epha_changes_for_ATC(iksnr, atc_code, force_run: false)
click to toggle source
# File lib/oddb2xml/util.rb, line 68 def self.add_epha_changes_for_ATC(iksnr, atc_code, force_run: false) @atc_csv_content = {} if force_run if @atc_csv_content.size == 0 Oddb2xml.uri_open(@atc_csv_origin).readlines.each { |line| items = line.split(",") @atc_csv_content[[items[0], items[1]]] = items[2] } end new_value = @atc_csv_content[[iksnr.to_s, atc_code]] new_value || atc_code end
add_hash(string)
click to toggle source
# File lib/oddb2xml/util.rb, line 190 def self.add_hash(string) doc = Nokogiri::XML.parse(string) do |config| config.huge end nr = 0 doc.root.elements.each do |node| nr += 1 next if node.name.eql?("RESULT") node["SHA256"] = Digest::SHA256.hexdigest node.text end doc.to_xml end
calc_checksum(str)
click to toggle source
# File lib/oddb2xml/util.rb, line 19 def self.calc_checksum(str) str = str.strip sum = 0 val = str.split(//u) 12.times do |idx| fct = ((idx % 2) * 2) + 1 sum += fct * val[idx].to_i end ((10 - (sum % 10)) % 10).to_s end
check_column_indices(sheet)
click to toggle source
please keep this constant in sync between (GEM) swissmedic-diff/lib/swissmedic-diff.rb and (GEM) oddb2xml/lib/oddb2xml/extractor.rb
# File lib/oddb2xml/util.rb, line 118 def self.check_column_indices(sheet) row = sheet[5] # Headers are found at row 5 since February 5 error_2019 = nil 0.upto(COLUMNS_FEBRUARY_2019.size - 1).each { |idx| puts "#{idx}: #{row[idx].value}" } if $VERBOSE COLUMNS_FEBRUARY_2019.each { |key, value| header_name = row[COLUMNS_FEBRUARY_2019.keys.index(key)].value.to_s unless value.match(header_name) puts "#{__LINE__}: #{key} -> #{COLUMNS_FEBRUARY_2019.keys.index(key)} #{value}\nbut was #{header_name}" if $VERBOSE error_2019 = "Packungen.xlslx_has_unexpected_column_#{COLUMNS_FEBRUARY_2019.keys.index(key)}_#{key}_#{value}_but_was_#{header_name}" # require 'pry'; binding.pry break end } raise error_2019.to_s if error_2019 end
convert_to_8859_1(line)
click to toggle source
# File lib/oddb2xml/util.rb, line 60 def self.convert_to_8859_1(line) # We want to ignore lines which are not really UTF-8 encoded ausgabe = Oddb2xml.patch_some_utf8(line).encode("ISO-8859-1") ausgabe.encode("ISO-8859-1") rescue => error puts "#{error}: in #{line}" end
download_finished(file, remove_file = true)
click to toggle source
# File lib/oddb2xml/util.rb, line 106 def self.download_finished(file, remove_file = true) src = "#{WORK_DIR}/#{File.basename(file)}" dest = "#{DOWNLOADS}/#{File.basename(file)}" FileUtils.makedirs(DOWNLOADS) # return unless File.exists?(file) return unless file && File.exist?(file) return if File.expand_path(file).eql?(dest) FileUtils.cp(src, dest, verbose: false) Oddb2xml.log("download_finished saved as #{dest} #{File.size(dest)} bytes.") end
gen_prodno(iksnr, seqnr)
click to toggle source
# File lib/oddb2xml/util.rb, line 6 def self.gen_prodno(iksnr, seqnr) sprintf("%05d", iksnr) + sprintf("%02d", seqnr) end
getEan13forNo8(no8)
click to toggle source
# File lib/oddb2xml/util.rb, line 264 def self.getEan13forNo8(no8) @@no8_to_ean13[no8] || [] end
getEan13forProdno(prodno)
click to toggle source
# File lib/oddb2xml/util.rb, line 260 def self.getEan13forProdno(prodno) @@prodno_to_ean13[prodno] || [] end
getNo8ForEan13(ean13)
click to toggle source
# File lib/oddb2xml/util.rb, line 272 def self.getNo8ForEan13(ean13) @@ean13_to_no8[ean13] end
getProdnoForEan13(ean13)
click to toggle source
# File lib/oddb2xml/util.rb, line 268 def self.getProdnoForEan13(ean13) @@ean13_to_prodno[ean13] end
html_decode(string)
click to toggle source
# File lib/oddb2xml/util.rb, line 38 def self.html_decode(string) german = string german = string.force_encoding("ISO-8859-1").encode("UTF-8") if string.encoding.to_s.eql?("ASCII") until german.eql?(HTMLEntities.new.decode(german)) german = HTMLEntities.new.decode(german) end Oddb2xml.patch_some_utf8(german).gsub("<br>", "\n") end
log(msg)
click to toggle source
# File lib/oddb2xml/util.rb, line 81 def self.log(msg) return unless @options[:log] # TODO:: require 'pry'; binding.pry if msg.size > 1000 $stdout.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}: #{msg[0..250]}" $stdout.flush end
log_timestamp(msg)
click to toggle source
# File lib/oddb2xml/compare.rb, line 4 def self.log_timestamp(msg) full_msg = "#{Time.now.strftime("%H:%M:%S")}: #{msg}" puts full_msg $stdout.flush full_msg end
patch_some_utf8(line)
click to toggle source
# File lib/oddb2xml/util.rb, line 47 def self.patch_some_utf8(line) begin line = line.encode("utf-8") rescue end begin line.tr("\u0089", "‰").tr("\u0092", "’").tr("\u0096", "-").tr("\u2013", "-").tr("\u201D", '"').chomp rescue => error puts "#{error}: in #{line}" line end end
save_options(options)
click to toggle source
# File lib/oddb2xml/util.rb, line 88 def self.save_options(options) @options = options end
setEan13forNo8(no8, ean13)
click to toggle source
# File lib/oddb2xml/util.rb, line 248 def self.setEan13forNo8(no8, ean13) if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014 Oddb2xml.log "setEan13forNo8 #{no8} ean13 #{ean13}" end if @@no8_to_ean13[no8].nil? @@no8_to_ean13[no8] = ean13 @@ean13_to_no8[ean13] = no8 elsif !@@no8_to_ean13[no8].eql?(ean13) Oddb2xml.log "@@no8_to_ean13[no8] #{@@no8_to_ean13[no8]} not overridden by #{ean13}" end end
setEan13forProdno(prodno, ean13)
click to toggle source
# File lib/oddb2xml/util.rb, line 239 def self.setEan13forProdno(prodno, ean13) if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014 Oddb2xml.log "setEan13forProdno #{prodno} ean13 #{ean13}" end @@prodno_to_ean13[prodno] ||= [] @@prodno_to_ean13[prodno] << ean13 @@ean13_to_prodno[ean13] = prodno end
skip_download(file)
click to toggle source
# File lib/oddb2xml/util.rb, line 96 def self.skip_download(file) return false if defined?(VCR) dest = "#{DOWNLOADS}/#{File.basename(file)}" if File.exist?(dest) FileUtils.cp(dest, file, verbose: false, preserve: true) unless File.expand_path(file).eql?(dest) return true end false end
skip_download?()
click to toggle source
# File lib/oddb2xml/util.rb, line 92 def self.skip_download? @options[:skip_download] end
uri_open(url)
click to toggle source
# File lib/oddb2xml/util.rb, line 10 def self.uri_open(url) version = RUBY_VERSION.split(".").map { |x| x.to_i } if (version <=> [2, 5, 0]) >= 0 URI.parse(url).open else IO.popen(url) end end
validate_via_xsd(xsd_file, xml_file)
click to toggle source
# File lib/oddb2xml/util.rb, line 219 def self.validate_via_xsd(xsd_file, xml_file) xsd = IO.open(xsd_file).read xsd_rtikelstamm_xml = Nokogiri::XML::Schema(xsd) doc = Nokogiri::XML(File.read(xml_file)) xsd_rtikelstamm_xml.validate(doc).each do |error| if error.message puts "Failed validating #{xml_file} with #{File.size(xml_file)} bytes using XSD from #{xsd_file}" puts "CMD: xmllint --noout --schema #{xsd_file} #{xml_file}" end msg = "expected #{error.message} to be nil\nfor #{xml_file}" puts msg expect(error.message).to be_nil, msg end end
verify_sha256(file)
click to toggle source
# File lib/oddb2xml/util.rb, line 203 def self.verify_sha256(file) f = File.open(file) doc = Nokogiri::XML(f) nr = 0 doc.root.elements.each do |node| nr += 1 next if node.name.eql?("RESULT") sha256 = Digest::SHA256.hexdigest node.text unless node["SHA256"].eql?(sha256) puts "Verifiying #{node["SHA256"]} != expectd #{sha256} against node #{node.text} failed" exit(3) end end true end