1class Version 2 def initialize(name_product = nil, versions = nil, url = nil) 3 raise 'You must specify the name of the product' if name_product.nil? 4 raise 'You must specify the available versions of the product' if versions.nil? 5 raise 'You must specify the available url of the website' if url.nil? 6 7 @name = name_product 8 @versions = versions 9 @files = Hash['filenames' => [], 'files' => [], 'md5' => []] 10 @url = url 11 @got_best_versions = false 12 @best_versions = [] 13 14 versions.each do |version| 15 version[1].each do |file| 16 next if @files['filenames'].include? file[0] 17 @files['filenames'].push(file[0]) 18 @files['files'].push(URI.join(@url.to_s, file[0]).to_s) 19 status, url, ip, body, headers = open_target(@files['files'].last) 20 @files['md5'].push(Digest::MD5.hexdigest(body)) 21 end 22 end 23 end 24 25 def best_matches 26 return @best_versions if @got_best_versions == true 27 28 @versions.each do |version| 29 count = 0 30 version[1].each do |file| 31 i = @files['filenames'].index(file[0]) 32 count += 1 if @files['md5'][i] == file[1] 33 end 34 while !@best_versions.empty? && @best_versions[0][1] < count 35 @best_versions.delete_at(0) 36 end 37 if count > 0 && (@best_versions.empty? || @best_versions[0][1] == count) and \ 38 !@best_versions.include? [version[0], count] 39 @best_versions.insert(0, [version[0], count]) 40 end 41 end 42 43 @got_best_versions = true 44 @best_versions.flatten! 45 46 @best_versions.each_index { |i| @best_versions.delete_at(i + 1) }.sort! 47 48 @best_versions 49 end 50 51 def matches_format 52 self.best_matches if @got_best_versions == false 53 @best_versions 54 end 55end 56