Railsy opět nezklamaly

Když teď převádím uživatele ze staré galerie vystavuj.cz do její nové verze, kterou píšu v Ruby on Rails, nemůžu nepochválit railsy a tím pádem i jazyk Ruby. Nebude to žádná óda, ale musím (prostě musím) napsat, jak mi railsy celou věc usnadnily.

Převod jen tak mezi databázemi nebyl zcela možný, neboť mě odradila databáze galerijního programu Gallery2. Zkrátka jsem si řekl, že uživatele převedu parsováním stávajícího webu, stažením obrázků a následným vložením toho všeho do databáze.

A teď přišlo první rozhodování, jaký jazyk zvolit? Ruby? Python? Perl? Ne, Perl ne. V Ruby ještě nejsem takový mazák, ale bylo by to fajn. V Pythonu jsem psal větší projekt tohoto typu. Zvítězil Python. Když se ohlédnu, nevím, jestli jsem udělal nejlíp, ale nechci mu křivdit. Nebyla to zase taková hrůza, k čemuž přispěla hlavně knihovna lxml. Pracoval jsem tak trochu agilním stylem. Napsal jsem skript na část dat (např. adresy jednotlivých galerií), ty stáhl, zkontroloval a skript přepsal na další část dat (obrázky v galeriích). A tak stále dokola, dokud jsem neměl všechno. Snad by mě to netrvalo celý den, kdybych se nezasekal na Unicode a překladu šŠ na ss. Ten jsem mimochodem musel nakonec udělat ručně.
Na skriptech není nic zvláštního, přesto malá ukázka zde

for page in pages_list:
    tree = open_and_parse(page.strip())
    links = tree.findall('.//a[@href]')
    for link in links:
        link.make_links_absolute(base)
        # search in links
        href = link.get('href')
        if re.search('\/vystava\/[^/]*/$', href): # regul matches
           final.append(href+"\n") # get URL
list(set(final)) # my little uniq
galleries_FILE = open(galleries_file, "w")
galleries_FILE.writelines(final)


Lepší část přijde teď. Výsledné xml s daty se musí dát do databáze. Znovu Python? Ne, prosím (ale málem jsem v něm začal). Věděl jsem, že mně práci usnadní, když budu pracovat přes definovaný model galerie a všechno, co jsem potřeboval, se skrývalo v Railovském skriptu runner, který nabootoval Railsy, tedy celou galerii a umožnil mi vytvářet uživatele, galerie a obrázky jako bych pracoval v kontroléru. To je úžasné! Nemusel jsem vymýšlet SQL příkazy, model data zvalidoval, vytvořil všechny cizí klíče....

Jen ještě jedna věc. V tom xml byly jen URL obrázků. Jak je stáhnout a "uploadovat" do galerie? I na tento problém jsem vygooglil lék. Hezky Railovsky vyřešený upload přes URL, který jsem do modelu začlenil během krátké chvíle. Nyní stačilo jen spustit skript přes runner a xml se uložilo do databáze. Díky, Ruby on Rails, jste parádní.

Můj skript vypadal nějak takto

#!/usr/bin/env /home/fanda/www/ruby/vystavuj/script/runner
require 'xmlsimple'
vystavuj = XmlSimple.xml_in('vyla.xml')
vystavuj['artists'].each do |artist|
  puts artist['name']
  if User.find_by_name(artist['name'])
    next
  end
  # generování hesla
  chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
  pass = ""
  1.upto(10) { |i| pass << chars[rand(chars.size-1)] }
 
  xpars = { :name => artist['username'][0],
            :password => pass,
            :password_confirmation => pass,
            :email => artist['email'][0]       }
  user = User.create(xpars)
  #následuje přidání profilových informací a obrázků
end