Ruby: Pravdivy pribeh

Je malo veci, na ktere bych si mohl na svem soucasnem projektu v Belgii stezovat. Jednou z nich je ale neskutecnej bordel v build systemu. Kazdej modul ma nekolik slozek lib (napr. lib-web, lib-build, lib-setup apod.) a v nich jsou rozhazeny ruzne knihovny v ruznych verzich. Dobrovolne jsem se nabidl, ze v tom udelam trochu poradek pomoci lokalni maven repository.

Abych ji mohl nejak rozumne naplnit, potreboval jsem si udelat seznam vsech knihoven (JARek) a u kazde vedet, kde a v jake verzi se pouziva. A prave tady jsem ocenil Ruby a jeho jednoduchost. Udelal jsem si v ruby skriptik, kterej mi rekurzivne proleze dany adresar a vygeneruje excelovsky soubor, ve kterem bude seznam vsech JARek, zvyrazni ty, ktere se pouzivaji v ruznych verzich, a u kazde verze mi vypise vsechny adresare, kde se nechazi. Celej skript vypada takto:

require "rubygems"
require "spreadsheet/excel"

include Spreadsheet

class Repository

  def initialize(file)
    @row = 0
    @artifacts = {}
    @excel_file = file
  end

  def artifact jar_file
    @artifacts[File.basename(jar_file)] ||= Hash.new
  end

  def version jar_file
    artifact(jar_file)[File.size(jar_file)] ||= Hash.new
  end

  def add jar_file
    version(jar_file)[File.dirname(jar_file)] = jar_file
  end

  def save
    workbook = Spreadsheet::Excel.new(@excel_file)
    @worksheet = workbook.add_worksheet("JARs")
    @red_style = workbook.add_format(:color=>"red")
    @blc_style = workbook.add_format(:color=>"black")
    @hdr_style = workbook.add_format(:color=>"blue", :bold=>true)
    @worksheet.write(0, 0, ["File Name",
                            "Repository",
                            "Group",
                            "Name",
                            "Version",
                            "Snapshot",
                            "Size",
                            "Locations"],
                          @hdr_style)
    @artifacts.each do|artifact|
      artifact[1].each do |version|
        put_line(artifact[0], artifact[1].size, version[0], version[1])
      end
    end
    workbook.close
  end

  def put_line(name, count, size, locations)
    style = count == 1 ? @blc_style : @red_style
    @row += 1
    @worksheet.write(@row, 0, name, style)
    @worksheet.write(@row, 3, File.basename(name, '.jar'), style)
    @worksheet.write(@row, 4, "1.0", style)
    @worksheet.write(@row, 5, 'false', style)
    @worksheet.write(@row, 6, size, style)
    @worksheet.write(@row, 7, locations.values.join(' | '), style)
  end

end

class JarExplorer

  def initialize(root)
    @root = root
  end

  def find_jars(excel_file)
    Dir.chdir(@root)
    repo = Repository.new(excel_file)
    Dir.glob("**/*.jar").each{|file| repo.add(file)}
    repo.save
  end

end

JarExplorer.new("/Users/jpisa/Workspaces").find_jars("/jars.xls")

Libi se mi na Ruby, jak jednodusse a rychle se da takovahle vec napsat a jak se da na prvni pohled neprijemna prace zautomatizovat a jeste se pri ni naucit nove veci.

Leave a Reply