sábado, 10 de abril de 2010

Datetime - Python

Esses dias trabalhei em um script de backup em Python e tive que utilizar funções relacionadas a data e hora.
Datetime é uma classe para facilitar a manipulação com os tipos de datas e horas, ela suporta operações aritméticas e lógicas com estes tipos.
Para auxiliar na explicação utilizarei o interpretador interativo do Python.

>>> from datetime import *
>>> date(2010,12,31)
datetime.date(2010, 12, 31)
#Esta função retorna um objeto do tipo datetime. Você passa como parametro date(ano, mes, dia).

>>> date.today()
datetime.date(2010, 4, 10)
#Esta função retorna um objeto do tipo datetime com a data atual do sistema. No meu caso retornou o objeto datetime.date(2010, 4, 10).

>>> x = date.today()
>>> x
datetime.date(2010, 4, 10)
>>> x.replace(day=30)
datetime.date(2010, 4, 30)
>>> x.replace(year=2009, month=11)
datetime.date(2009, 11, 10)
>>> x.replace(2010,04,10)
datetime.date(2010, 4, 10)
#A função replace retorna uma data substituindo os valores do objeto x pelos que foram passados como parâmetro, pode notar que tem como fazer vários tipos de substituição.

>>> x
datetime.date(2010, 4, 10)
>>> if x==date.today():
... print x.strftime('%d/%m/%Y')
...
10/04/2010
#Aqui você pode notar que existe uma sobrecarca de operador. Então podemos utilizar os operadores ('<', '>', '==', etc) para fazermos operações lógicas sobre os objetos datetime. E a função strftime() serve para converter uma data para uma string no formato que queremos.

>>> x = "20-10-2009"
>>> datetime.strptime(x,"%d-%m-%Y")
datetime.datetime(2009, 10, 20, 0, 0)
# A função strptime() retorna um objeto do tipo datetime apartir de uma string.

>>> x.isoformat()
'2010-04-10'
>>> str(x)
'2010-04-10'
#A função isoformat() e a str() são equivalentes. Ela retorna uma string no formato ISO de data.

>>> x.isoweekday()
6
>>> x.weekday()
5
#As duas funções retornam um inteiro para identificar qual dia da semana é. Porem a isoweekday() começa de 1 (Segunda) à 7 (Domingo) e a weekday() começa de 0 (Segunda) à 6 (Domingo).

>>> if x.weekday()==5:
... print "Segunda 0, Ter 1, Qua 2, Qui 3, Sex 4, Sab 5, Dom 6"
...
Segunda 0, Ter 1, Qua 2, Qui 3, Sex 4, Sab 5, Dom 6
>>> y = datetime.now()
>>> y
datetime.datetime(2010, 4, 10, 11, 55, 39, 820656)
#A função datetime.now() também retorna um objeto do tipo detetime com a data atual do sistema, incluindo hora, minuto, segundo...

>>> y = str(datetime.now().date())
>>> y
'2010-04-10'
# A função date() pega apenas a data de um objeto do tipo datetime. Neste caso utilizamos a função str() para retornar uma string.

>>> horas = datetime.now().time()
>>> print horas
13:53:31.271241
#A função time() retorna apenas as horas de um objeto datetime.

>>> horas.strftime("%H:%M.%S")
'13:53.31'
#Utilizamos a função strftime() para formatar as horas no formato que queremos.

>>> data_atual = date.today()
>>> data_atual
datetime.date(2010, 4, 10)
>>> data_atual = data_atual - timedelta(days=4)
>>> data_atual
datetime.date(2010, 4, 6)
#Aqui você pode notar que também conseguimos utilizar operações aritméticas com datas.

sexta-feira, 9 de abril de 2010

Inflections - CakePHP

De vez enquando temos problemas com a pluralização de palavras ou com o nome das classes do model... ou seja, problemas com os inflections.
Então fiz uma pequena aplicação para verificar a pluralização das palavras no CakePHP.

Primeiro passo: Criar o documento 'inflections_controller.php' no diretório 'app/controllers/'
A baixo segue um printscreen do fonte que você deve escrever:
obs:
linha 1: Importamos a classe Inflector.
linha 5: Assim não precisamos de um model para o controller.
linha 10: Passamos a palavra e suas variações para a view.

Agora crie o arquivo 'index.ctp 'no diretório 'app/view/inflections/'.
Abaixo segue o fonte:
Acessando a página da aplicação (no meu caso http://localhost/testes/inflections) temos o seguinte resultado:

Você pode notar que quando passamos a palavra 'imagem' para o plural, ela foi transformada para 'imagems'. Para corrigirmos este problema devemos acessar o
arquivo 'inflections.php' no diretório 'app/config/' e subistituir a linha:
$singularRules = array();
por
$singularRules = array('/(.*)ns$/i' => '\1m');
e
$pluralRules = array();
por
$pluralRules = array('/(.*)m$/i' => '\1ns');
Assim chegamos no seguinte resultado: