eventual

DESCRIPCIÓN:

Reconocimiento de fechas y periodos en lenguaje natural. Útil para crear interfaces de usuario basadas en texto.

SINOPSIS:

El método event_parse del modulo Eventual reconoce y convierte una fecha o periodo expresado en lenguaje natural en objetos Date o DateTime

Ejemplos:

require 'rubygems'
require 'eventual' 

Eventual.parse( 'del 5 al 7 de junio del 2009' ).map
=> [#<DateTime: 4909975/2,0,2299161>, #<DateTime: 4909977/2,0,2299161>, #<DateTime: 4909979/2,0,2299161>]

# Si no se especifica el año se usará el año actual
Eventual.parse( 'del 5 al 7 de junio' ).map{ |d| d.to_s } # Quizá mas tarde se localize a otros idiomas
=> ["2010-06-05", "2010-06-06", "2010-06-07"]

# Se puede especificar un año por omisión
dates      = Eventual.parse( 'del 5 al 7 de junio', :default_year => 2007 )
dates.map{ |d| d.to_s }
=> ["2007-06-05", "2007-06-06", "2007-06-07"]

# Si se especifica la hora el resultado será un Array de DateTime
Eventual.parse( 'del 5 al 7 de junio del 2009 a las 16:00 y 18:00 horas', :lang => :es ).map
=> [#<DateTime: 14729929/6,0,2299161>, #<DateTime: 9819953/4,0,2299161>, #<DateTime: 14729935/6,0,2299161>, #<DateTime: 9819957/4,0,2299161>, #<DateTime: 14729941/6,0,2299161>, #<DateTime: 9819961/4,0,2299161>]

Eventual.parse( 'del 5 al 7 de junio del 2009 a las 16:00 y 18:00 horas' ).map{ |d| d.to_s }
=> ["2009-06-05T16:00:00+00:00", "2009-06-05T18:00:00+00:00", "2009-06-06T16:00:00+00:00", "2009-06-06T18:00:00+00:00", "2009-06-07T16:00:00+00:00", "2009-06-07T18:00:00+00:00"]

# Se pueden restringir los resultados a ciertos dias
Eventual.parse('lunes y martes de diciembre del 2001 a las 15:00').map{ |d| d.to_s  }  
=> ["2010-12-06T15:00:00+00:00", "2010-12-07T15:00:00+00:00", "2010-12-13T15:00:00+00:00", "2010-12-14T15:00:00+00:00", "2010-12-20T15:00:00+00:00", "2010-12-21T15:00:00+00:00", "2010-12-27T15:00:00+00:00", "2010-12-28T15:00:00+00:00"]

# Se puede checar si las fechas reconocidas incluyen cierta fecha, la comparación es "perezosa" es decir no instancia todos los objetos Date o DateTime 
# como hace map y por lo tanto es mas eficiente
Eventual.parse( 'del 5 al 7 de junio del 2007' ).include? Date.civil(2007, 6, 6)
=> true

Eventual.parse( 'del 5 al 7 de junio del 2007' ).include? Date.civil(2006, 6, 6)
=> false

# Se toma en cuenta la hora
Eventual.parse( 'del 5 al 7 de junio del 2007 a las 16:00' ).include? DateTime.civil(2007, 6, 6, 16, 0)
=> true

Eventual.parse( 'del 5 al 7 de junio del 2007 a las 16:00' ).include? DateTime.civil(2007, 6, 6, 15, 0)
=> false

# Si se pasa un Date que corresponda al periodo la comparación es positiva
Eventual.parse( 'del 5 al 7 de junio del 2007 a las 16:00' ).include? Date.civil(2007, 6, 6)
=> true

# Se puede pasar un rango de horas y se obtendrá un rango
Eventual.parse('1 de enero del 2010 de las 15:00 a las 16:00')
=> [(DateTime.civil 2010, 1, 1, 15)..(DateTime.civil 2010, 1, 1, 16)]

Eventual.parse('1 de enero del 2010 de las 15:00 a las 16:00 y de las 17:00 a las 19:00')

Ejemplos de formatos reconocidos:

  • Por mes

    • marzo

    • marzo de 2009

    • marzo del 2009

    • todo marzo 2009

    • marzo, 2009

    • marzo ‘09

  • Lista de dias

    • lunes y martes marzo del 2010

    • todos los lunes y martes de marzo del 2010

    • lunes y martes durante marzo del 2010

    • lunes y martes durante todo marzo del 2010

    • lunes y martes, marzo del 2010

    • 21 de marzo

    • 21 marzo

    • domingo 21 de marzo

    • domingo, 21 de marzo

    • 1, 2 y 3 de marzo

    • 1, 2 y 3 marzo

    • lunes 1, martes 2 y miercoles 3 de marzo

    • 1 al 3 de marzo

    • 1 al 3, marzo

    • del 1 al 3 de marzo

    • del 1 al 3, marzo

  • Rango de fechas

    • 24 de febrero al 3 de marzo del 2010

    • 24 de diciembre del 2009 al 3 de enero del 2010

    • lunes y martes del 1 al 22 de marzo del ‘10

    • fines de semana del 1 al 22 de marzo del ‘10

    • entre semana del 1 al 22 de marzo del ‘10

    • lunes y martes del 1 al 22 de marzo del ‘10

    • todos los lunes y martes del 1 al 22 de marzo del ‘10

    • los lunes y martes del 1 al 22 de marzo del ‘10

    • los lunes y los martes del 1 al 22 de marzo del ‘10

  • Con horario (se puede aplicar a todos los casos)

    • lunes y martes de diciembre a las 15

    • lunes y martes, de diciembre a las 15

    • lunes y martes de diciembre a las 15:30 hrs.

    • lunes y martes de diciembre a las 15:00 y 16:00 horas

    • lunes y martes de diciembre a las 15:00 y 16:00 horas

    • lunes y martes de diciembre a las 3 am

    • lunes y martes de diciembre a las 3:15 p.m.

  • Con rango de horario (se puede aplicar a todos los casos)

    • 1 de enero del 2010 de las 15:00 a las 16:00

    • 1 de enero del 2010 de las 15:00 a las 16:00 y de las 17:00 a las 19:00

    • 1 de enero del 2010 de las 15:00 a las 16:00, de las 17:00 a las 19:00 y de las 21:00 a las 22:00

  • Fechas compuestas

    • 1 de enero y lunes y martes del 1 de octubre al 2 de diciembre del 2008

TODO:

Formatos a reconocer

  • todo el año

  • lunes y martes de diciembre, 3:15 p.m.

INSTALACIÓN:

[sudo] gem install eventual

Documentation

rdoc.info/projects/maca/eventual

LICENCIA:

(The MIT License)

Copyright © 2009 Macario Ortega

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ‘Software’), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.