czwartek, 5 listopada 2009

Ruby - zabawy z gem chronic

Ostatnio popełniłem skrypt do generowania statystyk z backupów wykonanych w określonych przedziałach czasowych. Uznałem, że bardzo wygodnie było by udostępnić elastyczny mechanizm umożliwiający podanie okresu na podstawie którego ma byc wygenerowana statystyka.

Tu z pomocą przychodzi gem w Ruby co się zowie 'chronic'. Najpierw zainstalujmy gema (niestety nie ma go w portage'u - przynajmniej głownym repo):

gem install chronic


I już mamy gema.
Pobawmy się tym trochę w irb (interaktywny interpreter Ruby - czy jakkolwiek to nazwać)
ja@komp ~ $ irb
irb(main):001:0> require 'chronic'
=> true
irb(main):002:0> Chronic.parse("yesterday")
=> Wed Nov 04 12:00:00 +0100 2009
irb(main):003:0> Chronic.parse("yesterday").class
=> Time
irb(main):004:0>


Jak widać chronic zwraca obiekt klasy Time - klasa wbudowana w Ruby (standard library). Umożliwia nam to proste operowanie w kodzie np. do generowania zapytań SQL (klauzula where time ...)

Oczywiście to dopiero początek:

irb(main):005:0> Chronic.parse("last friday")
=> Fri Oct 30 12:00:00 +0100 2009
irb(main):006:0> Chronic.parse("last friday at 5pm")
=> Fri Oct 30 17:00:00 +0100 2009
irb(main):007:0> Chronic.parse("last month")
=> Fri Oct 16 12:30:00 +0200 2009
irb(main):008:0> Chronic.parse("last wednesday")
=> Wed Nov 04 12:00:00 +0100 2009


To zaledwie parę przykładów - tak żeby pokazać co potrafi sparsować chronic.
Ważnym parametrem przy parsowaniu jest kontekst czasu - w skrócie czy chronic ma szukać w pasującej do opisu daty przeszłości czy w przyszłości:

irb(main):010:0> Chronic.parse("wednesday", :context => :past)
=> Wed Nov 04 12:00:00 +0100 2009
irb(main):011:0> Chronic.parse("wednesday", :context => :future)
=> Wed Nov 11 12:00:00 +0100 2009
irb(main):012:0> Chronic.parse("wednesday")
=> Wed Nov 11 12:00:00 +0100 2009


Jak widać domyślnym kontekstem jest :future.

Opcja :now umożliwia zdefiniowanie daty, która ma być przez parser traktowana jako data aktualna (odnośnik czasowy w stosunku do którego ma być wykonane obliczenie). Domyślnie jest to czas bieżący:

irb(main):024:0> Chronic.parse("wednesday 4:00", :now => Time.local(2005, 1, 1))
=> Wed Jan 05 16:00:00 +0100 2005


Opcja :ambiguous_time_range umożliwia określenie przedziału czasowego, w którym będzie poszukiwana punkt w czasie - zobaczmy to na przykładzie:

irb(main):024:0> Chronic.parse("wednesday 4:00", :now => Time.local(2005, 1, 1))
=> Wed Jan 05 16:00:00 +0100 2005
irb(main):020:0> Chronic.parse("wednesday 6:00", :ambiguous_time_range => 5)
=> Wed Nov 11 06:00:00 +0100 2009
irb(main):021:0> Chronic.parse("wednesday 4:00", :ambiguous_time_range => 5)
=> Wed Nov 11 16:00:00 +0100 2009


Określiłem przeszukiwany przedział czasowy na 5am-5pm - jak widać zwrócone czasy zawierają się w zdefiniowanym przeze mnie przedziale.

Pozostaje jeszcze opcja :guess - to już pozostawiam czytelnikowi

Przydatne linki:
Chronic gem

Na nowym portalu:
Gemcutter gems - chronic

2 komentarze:

  1. dziendobry

    nie rozumiem ... ambigious.range ....czy mozna jasniej

    ps
    zfrustroway czytelnik

    ps
    po za tym bomba ... albo bąba .. nie pamietam ;)

    OdpowiedzUsuń
  2. Najlepiej to potestować - myślę, że dosyc jasno to wytłumaczyłem. Poza tym zbyt ogólnie sformułowałeś problem - czego dokładnie nie rozumiesz? Czy spróbowałeś sam to potestować?

    OdpowiedzUsuń