BrazilUtils API

Cv, desde que comecei a usar o fórum do GUJ, as suas respostas sempre foram algumas das que mais levo em consideração. Por isso, vou aceitar o seu conselho e levar isso de forma construtiva. Aliás, alguns posts atrás neste tópico você vai ver que o Fábio Patrício perguntou se tinha algum Arquiteto ou Gerente do projeto e nós dissemos que não. Vou considerar seu post como um aceite para o cargo extra-oficial de Manager-Escrachator do projeto. Bem vindo.
Quanto às suas colocações, vamos lá…

Quanto aos testes: alguns posts atrás você me sugeriu que usasse Junit ao invés de psvm. Eu, modestamente, tentei seguir seu conselho e fiz uma “classezinha” extendento TestCase. Gostei bastante e vou acertar os outros assim como fazer o que está pendente. Não conheço o Emma, vou dar uma olhada.

Singleton: BrKit. Foi uma sugestão do início do projeto, o Ironlinx já tinha sugerido que isso seria uma grande centralizador sem necessidade. Ela estva lá abandonada, como o velo falou, nem dá pra instanciar. Já apaguei e vou fingir que nada aconteceu.

Com relação a Documentação: Neste ponto não posso tomar decisão sozinho. A questão da documentação foi definida na reunião do projeto e acho que devemos discutir novamente para mudar. Por enquanto estou fazendo como combinamos. Bem antes, eu tinha dito que isso dependeria do rumo que tudo tomasse, da forma como está, acho que o melhor realmente é fazer em português.

CVS: Como já dissemos, o Fernando (scottys0) colocou o código lá como teste. Ele cismou que ia fazer e fez, assim como o canal IRC que ficou muito bacana. Legal, desse tipo de iniciativa é que estamos precisando. Ontem pela manhã eu nunca havia usado um CVS, depois que ele colocou o código lá estou desvendando como funciona o CVS no Eclipse. Vou conversar com ele sobre as mensagens.

Packages vazias ou Código pela metade: Aqui comigo não existe nenhum pacote vazio. Deve ser por causa to teste que falei. Os códigos pela metade são, por exemplo, a Classe de Cpf cujo único método vazio é o de validação. Deixei vazio por que é o “filé” da classe. Alguém que não está participando poderia se interessar e querer implementar (quem quiser, por favor).

Expressões Regulares: outra dica que pretendo aceitar. Conheço expressões regulares de “olhada” e não estava querendo parar o que estava fazendo para estudar. Agora que está rodando, pelo menos, posso me aprofundar.

LGPL: Vou colocar o bloquinho nos arquivos. Qual o link para o texto padrão?

Constructor Duplicados e com Exceções: Para coisas como CEP, CPF, CNPF, UF etc existe sempre uma classe simples que pode-se fazer

  Coisa coisa = new CoisaAdapter();
  coisa.setCoisa(“Coisinha”);

e outras que são do tipo ValidCoisa. Onde se faz

  Coisa coisa = new ValidCoisa(“Coisinha”); // gera ValidatinException

No primeiro tipo existe um constructor simples na segunda o constructor garante que você não instancia um CPF se ele não for válido. Ou seja, isValid() é sempre true.
Isso foi só uma idéia, não sei se terá utilidade mas achei interessante implementar dessa forma. Se é inútil eu não sei, gostaria de opiniões. Os duplicados existem por uma questão de conforto de quem está criando a classe, pode passar como String ou como int.

Interface Endereço e afins: Essas interfaces tem tudo a ver com os dois tipos de classe acima. Coisa coisa = new CoisaAdapter ou Coisa coisa = new ValidCoisa. Mas, realmente, no caso de Endereço, Telefone e talvez p Cep não seja necessário. A do Telefone já retirei.

TipoLogradouro – No início do tópico o Grivon fez uma Classe para Logradouro com um início de normalização. Eu escrevi um código só pra dar a ele uma estrutura já próxima com o que estávamos fazendo. Até criei uma TipoLogradouroNormalizer mas não sei como será a implementação disso. Não queria atropelar o código que ele estava fazendo. Foi só uma idéia. Quanto a lista de valores, sim, posso fazer como enum. Ainda estou usando o Eclipse 3.0.1, mas pretendo começar a usar o 1.5 em breve.

“Represents the DDD of a Telefone”: como já disse acima, talvez devamos rever a questão da documentação. Por isso não dediquei muito tempo ao javadoc. . Aliás ao longo da discussão surgiram algumas dúvidas de como seria o nome da classe Logradouro em inglês etc. Isso inclui o DDD, DDI e a parte do número que sobra. Realmente não conheço as palavras em inglês para melhor definir as partes do telefone. Por isso, inclusive, as classes se chamam DDD, DDI e Base! Gostaria realmente de uma sugestão melhor que isso.

Acho que é isso. Valeu pelas “broncas”. :lol:
Sim, vou estudar Expressões regulares. :wink:

Galera do projeto, vejam aqui meu MSN grinvon@hotmail.com

Mesmo eu me contradizendo e me ridicularizando o tempo todo? Uau :mrgreen:

Gostei da descricao do cargo :mrgreen:
Vou poder colocar isso no meu cartao de visita?

Carlos Villela
Escrachator-In-Chief
GUJ, Inc
escracho@lixo.org

Cv, suas críticas são válidas e bem-vindas. :thumbup:
Não haverá API meio-a-meio… deverá ser tudo em Inglês, mantendo nomes comuns em português(como siglas).
O aportuguesamento do projeto beneficiaria a parte br, mas depois o que faríamos com métricas e outras?Cavalos-a -vapor?Traduziria Newton também???O q envolver detalhes, explicaremos melhor(mesmo em inglês…) Simples. e validateCPF() não seria algo difícil de compreender…não?Quanto ao DDD eu sei q ficou brabo…

E tah meia-boca agora, não lançaremos um release assim…
O pessoal tava reclamando muito de código, foi postado para dar uma idéia(ou incentivo) para o pessoal.Não para usar em “produção”.
Mas realmente está na hora de darmos um rumo ao caos.
E então Cv, vc vai ficar aí sentado na janela ou vai expor a bunda com a gente? :smiley:
Clica na opção de “PM” lah na página do projeto… :slight_smile:

Grinvon, eu te adicionei no ICQ e ateh agora vc não me autorizou! :?
Usamos muito mais icq do q msn…

Antes que o cv volte a falar das tais regular expressions, vou facilitar um pouco a vida…
aqui tem uma boa parte das que vocês precisam. Só por favor, não reinventem a roda. :smiley:

Ah, é fácil adaptar as RegEx pra Java, não é só dar copy paste, mas uma consulta rápida à API resolve tudo…

Ironlynx, te perguntei no ICQ sobre o código de barras e você nem respondeu :frowning: :frowning: :frowning: Conseguiu implementar o I25? É só dele que vai precisar? (note que estou apenas sendo curioso e intrometido, não tô ajudando em nada).

Ah e já estou como “observer” (é pelo andar da carruagem vai ser só isso mesmo :frowning: ) no Java.net.

Tava reparando no tamanho não só do tópico em si, mas dos posts… que tal fazer um livro? “BrazilUtils - A Bíblia” (com voz roca do Cid Moreira)…

Renato, foi malzz… eu nem peguei nesse aspecto ainda.O rafael(outro membro do projeto) ia tentar fazer.Se ele não conseguir eu faço. :wink:

Renato, se vc perceber, esse tópico oferece uma visão para todos aqueles que pretendem fazer um projetinho OS de como ele é.E, como pode ver, não é fácil quanto parece…

Relaxa Ironlynx, só tô brincando, só brincando…

@+ e não foi malz não, eu só sou um intrometido!!! Era só curiosidade mesmo, já que estávamos falando disso outro dia.

E, você fez uma aparição relâmpago no ICQ, nem consegui responder!! Como você não leu o artigo todo, não deve saber que existe uma classe pronta para pintar o I25. Aliás muito bom o artigo, conseguir entender, e conseguir entender uma coisa após ler um artigo é um mérito não tão comum como deveria. Parabéns ao cara que nem sei quem é…

Meu projetinho OS não me parece tão complicado… E, bem, a idéia do BrazilUtils me parece de um projeto relativamente grande

[quote=cv]Eu sou tosco e vou xingar um monte, mas por favor tomem um prozac e levem isso de forma construtiva enquanto ainda eh tempo, ou esse projeto vai ser um desastre.

Broncas:
.
.
.

  • cv, enfiando o peh na maior e mais fedida jaca de todos os tempos[/quote]
    Esse foi uns dos posts mais engraçados que eu já vi aqui! Isso que eu chamo de CRÍTICA construtiva!

hehehe

E eu tinha esperanca na humanidade… :roll:

[quote=Ironlynx]Não haverá API meio-a-meio… deverá ser tudo em Inglês, mantendo nomes comuns em português(como siglas).
O aportuguesamento do projeto beneficiaria a parte br, mas depois o que faríamos com métricas e outras?Cavalos-a -vapor?Traduziria Newton também???O q envolver detalhes, explicaremos melhor(mesmo em inglês…) Simples. e validateCPF() não seria algo difícil de compreender…não?Quanto ao DDD eu sei q ficou brabo… [/quote]

Ou seja, vc esta me dizendo que nao vai fazer nada sobre coisas como “Returns the DDD of a Telefone”? OK, eu pelo menos tentei evitar que um monte de usuarios da sua API perdesse o emprego pq teve uma crise de riso enquanto programava :mrgreen:

[quote=Ironlynx]E tah meia-boca agora, não lançaremos um release assim…
O pessoal tava reclamando muito de código, foi postado para dar uma idéia(ou incentivo) para o pessoal.Não para usar em “produção”.
Mas realmente está na hora de darmos um rumo ao caos.[/quote]

Foi, uhhh… mais ou menos isso que eu tentei incentivar voces a fazer :smiley:

[quote=Ironlynx]E então Cv, vc vai ficar aí sentado na janela ou vai expor a bunda com a gente? :smiley:
Clica na opção de “PM” lah na página do projeto… :slight_smile: [/quote]

Foi mal, gente, mas eu tou com muito pouco tempo pra poder ajudar voces do jeito que eu queria. Melhor ficar na bronca ocasional aqui no forum, mesmo, e assim eu nao me comprometo a fazer nada que eu nao posso.

E, bom, eu nao sei uma forma menos rude de dizer isso, mas da minha bunda cuido eu :mrgreen:

  • cv, cuidando da propria bunda e tirando ela da reta

Sanduiche-iche? :lol: :lol:

Bom, cv, quando quiser a casa estará aberta. :wink:
Jah temos 12 membros no projeto e um bom PM(Principalmente veterano de guerra) nos faz falta.Não seria alguem que necessariamente fosse codificar(jah são 6 os devs mas quem coda mais eh o Douglas q eh owner), mas alguem que pudesse alertar de erros antes mesmos que eles acontececem(Existe alguem assim???huahauha…).Pois afinal, números por extenso, cpf, rg… somos nós reescrevendo a roda, e botando uns aros de magnésio nela, para que ninguem tenha q fazê-lo. :smiley:

[quote=louds][quote=cv]
Ou seja, vc esta me dizendo que nao vai fazer nada sobre coisas como “Returns the DDD of a Telefone”? OK, eu pelo menos tentei evitar que um monte de usuarios da sua API perdesse o emprego pq teve uma crise de riso enquanto programava :mrgreen:
[/quote]

Sanduiche-iche? :lol: :lol: [/quote]

Nossa, nao me faz eu lembrar dessa mulher. :lol:

Lóóóóóógico

Um item da lista do CV eu “matei” …

Buildfile: /home/scottys0/workspace/brazilutils/build.xml
compile:
test:
    [junit] Running org.brazilutils.test.UFTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.498 sec
    [junit] Testsuite: org.brazilutils.test.UFTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.498 sec
    [junit] ------------- Standard Output ---------------
    [junit] 90175758-53
    [junit] PR
    [junit] Paraná
    [junit] Sum:160 Mod:6 Dif:5 Dv:5
    [junit] Sum:206 Mod:8 Dif:3 Dv:3
    [junit] ------------- ---------------- ---------------
    [junit] Testcase: test took 0.498 sec
BUILD SUCCESSFUL
Total time: 5 seconds

DICA O projeto está usando Jdk 1.5, aproveite a especificação da linguagem e use oque ela oferece … ex.

ANTES
for (int i; i < TIPOS.length(); i++) {
        boolean b = list.add(TIPOS[i]);			 
}
         
DEPOIS

for ( String str : TIPOS) {
        boolean b = list.add(TIPOS);			 
}

:stuck_out_tongue: só pegando no pé …

Isso Fernando!
Pessoal, meu Eclipse tah chiando com Generics, alguem jah teve algo parecido?Eu uso o 3.1M6.

apaga teu projeto local e baixa a ultima versão do cvs, o projeto tava configurado para aceitar somente java 1.4

// Editado
… agora vi q nao subiu .project pro cvs :s

chegando em casa vou arrumar

Pessoal, refiz a classe TipoLogradouro. Fiz como enum e implementei a normalização usando Expressões Regulares. Ainda não está no CVS mas segue o código para críticas e sugestões.

public enum TipoLogradouro {
    Aeroporto(""),
    Alameda(""),
    Área(""),
    Avenida("Av", "AV.*"),
    Campo(""),
    Chácara(""),
    Colônia(""),
    Condomínio("Cond", "COND.*"),
    Conjunto(""),
    Distrito(""),
    Esplanada(""),
    Estação("Esta", "ESTA.*"),
    Estrada("Estr", "ESTR.*"),
    Favela(""),
    Fazenda(""),
    Feira(""),
    Jardim(""),
    Ladeira(""),
    Lago(""),
    Lagoa(""),
    Largo(""),
    Loteamento(""),
    Morro(""),
    Núcleo(""),
    Parque(""),
    Passarela(""),
    Pátio(""),
    Praça(""),
    Quadra("Q", "Q.*"),
    Recanto(""),
    Residencial(""),
    Rodovia("Rod", "ROD.*"),
    Rua("R", "RU.*"),
    Setor(""),
    Sítio(""),
    Travessa("Trav", "TRA.*"),
    Trecho(""),
    Trevo(""),
    Vale(""),
    Vereda(""),
    Via(""),
    Viaduto(""),
    Viela(""),
    Vila("");
	
	/**
	 * @param tipo
	 * @return
	 */
	public static TipoLogradouro create(String tipo){
		String upper = tipo.toUpperCase();
		// Try match the Name
		for (TipoLogradouro t: EnumSet.range
			(TipoLogradouro.Aeroporto, TipoLogradouro.Vila)){
			String s = t.name().toUpperCase(); 
			if (upper.equals(s)) return t;
		}
		// Try match the Abbreviature
		for (TipoLogradouro t: EnumSet.range
			(TipoLogradouro.Aeroporto, TipoLogradouro.Vila)){
			String a = t.getAbbreviature().toUpperCase().toString();
			if (upper.equals(a)) return t;
		}				
		return null;
	}
	/**
	 * @param tipo 
	 * @return
	 */
	public static boolean isValid(String tipo){
		String upper = tipo.toUpperCase();
		for (TipoLogradouro t: EnumSet.range
			(TipoLogradouro.Aeroporto, TipoLogradouro.Vila)){
			String s = t.name().toUpperCase(); 
			if (upper.equals(s)) return true;
		}				
		return false;
	}
	
	/**
	 * @param tipo
	 * @return
	 */
	public static String normalize(String tipo){
		String result = null;
		for (TipoLogradouro t: EnumSet.range
			(TipoLogradouro.Aeroporto, TipoLogradouro.Vila)){
			result = t.doNormalize(tipo);
			if (result != null) return result;
		}		
		return null;
	}
	
    private String abbreviature;
	private String regex = null;
	
	/**
	 * @param abbreviature Abbreviature
	 * @param names Possible names
	 */
	private TipoLogradouro(String abbreviature, String ... args){
		this.abbreviature = abbreviature;
		if (args.length > 0) {
			regex = args[0];
		}	
	}

	/**
	 * @param tipo
	 * @return
	 */
	public String doNormalize(String tipo){
		String upper = tipo.toUpperCase();
		String result = null;
		if (regex != null) {
			if (upper.matches(regex)) return name();
		}
		return result;
	}
	
	/**
	 * @return The Abbreviature
	 */
	public String getAbbreviature() {
		return abbreviature;
	}
}

Douglas, aih so tem o codigo… cade o teste, pra gente poder saber se ele funciona ou nao, e o que ele faz, sem ter que ler/entender?

Fiz um simples:

package org.brazilutils.test;

import org.brazilutils.br.endereco.Logradouro;
import org.brazilutils.br.endereco.TipoLogradouro;

import junit.framework.TestCase;

public class LogradouroTest extends TestCase {

	public void test1() throws Exception {
		Logradouro l = new Logradouro();
		l.setLogradouro("Avenida Teste"); // valid
		assertTrue(l.isValid());
	}
	public void test2() throws Exception {
		Logradouro l = new Logradouro();
		l.setLogradouro("Nonono Teste"); // invalid
		assertTrue(!l.isValid());
	}
	public void test3() throws Exception {
		Logradouro l = new Logradouro();
		l.setLogradouro("Rua"); // invalid
		assertTrue(!l.isValid());
	}
	public void test4() throws Exception {
		Logradouro l = new Logradouro();
		l.setLogradouro("Avenida Teste");
		// tipo = Avenida
		// Nome = Teste
		String av = TipoLogradouro.Avenida.toString();
		assertTrue( l.getTipo().equals(av) && 
				    l.getNome().equals("Teste") );
	}
	public void test5() throws Exception {
		Logradouro l = new Logradouro();
		l.setLogradouro("Aven Teste");
		// Aven -> Avenida
		l.normalize();
		String av = TipoLogradouro.Avenida.toString();
		assertTrue( l.getTipo().equals(av)); //Avenida
		l.setLogradouro("Estr. Teste");
		// Estr -> Estrada
		l.normalize();
		String estrada = TipoLogradouro.Estrada.toString();
		assertTrue( l.getTipo().equals(estrada)); //Estrada		
	}
	
}