# encoding: utf-8 require 'yaml' require 'benchmark' module Jeka class Make attr_reader :jeka attr_reader :folder def initialize(folder) @folder = folder _load end def _load @jeka = YAML::load(File.open(File.join(@folder, '_jeka.yaml'))) @implementations = [] @jeka["implementations"].each do |implementation| @implementations << Implementation.new(File.join(@folder, implementation)) end @test_set = TestSet.new(File.join(@folder, @jeka["tests"])) end def test(&block) return _test_all unless block @implementations.each do |implementation| @test_set.each do |input, output| block.call(implementation, input, output, implementation.run(false, input) == File.open(output).readlines.join("\n")) end end end def _test_all @implementations.each do |implementation| @test_set.each do |input, output| return false unless implementation.run(false, input) == File.open(output).readlines.join("\n") end end return true end def build @implementations.each do |implementation| implementation.build end end def benchmark(n, &block) @implementations.each do |implementation| @test_set.each do |input, output| results = [] n.times do results << Benchmark.measure { implementation.run(true, input) } end analysis = _benchmark_analysis(results, implementation.folder, input[input.rindex("/")+1..-7]) block.call(implementation, input, output, analysis) if block end end end def _benchmark_analysis(results, folder, test) analysis = [0, 0, 0, 0, 0, 0] count = 0; results.each do |r| r = r.to_a 5.times do |i| analysis[i+1] += r[i+1] end count += 1 end analysis.map! {|a| a/count} analysis[0] = "##{test}" f = File.new(File.join(folder, "#{test}.benchmark"), "w") f.write(analysis) return analysis end def generate_site(n, &block) algorithm = "" implementations = [] result_alg = {} benchmark(n) do |implementation, input, output, analysis| if result_alg[implementation.info["language"]] a = result_alg[implementation.info["language"]][1] a << analysis[1..-1] result_alg[implementation.info["language"]][1] = a else result_alg[implementation.info["language"]] = [implementation.info["comment"], [analysis[1..-1]], File.join(implementation.folder, implementation.info["source"])] end end algorithm, implementations = _generete_site(result_alg) #puts algorithm block.call([algorithm, @jeka], implementations) if block end def _generete_site(result) implementations = [] page = "---\n" page += "layout: algorithm\n" page += "title: #{@jeka["name"]}\n" page += "---\n\n" page += "h1. #{@jeka["name"]}\n\n" page += "h2. #{@jeka["type"]}\n\n" page += "h3. Descrição\n\n" file = File.new(File.join(@folder, "_description.textile"), "r") description = file.readlines page += "#{description.join("")}\n\n" page += "h3. Complexidade\n\n" page += "#{@jeka["complexity"]}\n\n" page += "h3. Referências\n\n" file = File.new(File.join(@folder, "_references.textile"), "r") references = file.readlines page += "#{references.join()}\n\n" page += "h3. Implementações\n\n" page += "|_. Linguagem |_. Comentário |_. Código fonte |_. Tempo de execução médio |\n" imp = [] result.each do |lang, result| implementations << [_generate_source_page(File.join(result[2]), "ruby"), result[0]] total = [0,0,0,0,0] total_index = 0 result[1].each do |r| total_index += 1 r.each_with_index do |v, i| total[i] += v end end total.each_with_index do |v, i| total[i] = total[i]/total_index end imp << ["| #{lang} | #{result[0]} | \"ver\":#{URI.escape("../../../../implementations/#{@jeka["date"].year}/#{'%02d' % @jeka["date"].month}/#{'%02d' % @jeka["date"].day}/#{result[0].gsub(" ", "_")}.html")} | #{total[3]}s |\n", total[3]] end imp = sort_imp(imp) imp.each do |i| page += i[0] end page += "\n" return page, implementations end def sort_imp(imp) for i in 0..(imp.size-1) do for j in (i+1)..(imp.size-1) do if imp[i][1] > imp[j][1] temp = imp[i] imp[i] = imp[j] imp[j] = temp end end end return imp end def _generate_source_page(file, lang) f = File.new(file, "r") src = f.readlines.join() page = "---\n" page += "layout: implementation\n" page += "title: Bubble Sort\n" page += "---\n\n" page += "{% highlight #{lang} %}\n" page += src page += "{% endhighlight %}\n" return page end end end