Skip to content

Commit

Permalink
Expandindo a geração de rotas para seleção de dados de testes.
Browse files Browse the repository at this point in the history
  • Loading branch information
leonelsanchesdasilva committed Jan 14, 2024
1 parent 8840e87 commit 2dd5179
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 49 deletions.
25 changes: 14 additions & 11 deletions index-gerar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ import prompts from 'prompts';
import { Classe } from '@designliquido/delegua/fontes/declaracoes';
import { pluralizar } from '@designliquido/flexoes';

import { criarDiretorioSeNaoExiste, criarNovoControlador, importarModelos, obterTodosModelos } from './interface-linha-comando/gerar';
import { criarDiretorioSeNaoExiste, importarModelos, obterTodosModelos } from './interface-linha-comando/gerar';
import { GeradorVisoes } from './interface-linha-comando/gerar/gerador-visoes';
import { GeradorRotas } from './interface-linha-comando/gerar/gerador-rotas';

const pontoDeEntradaGerar = async (argumentos: string[]) => {
// argumentos[0] normalmente é o nome do executável, seja Node, Bun, etc.
Expand All @@ -26,30 +27,32 @@ const pontoDeEntradaGerar = async (argumentos: string[]) => {
}

const declaracoes = importarModelos(nomeModelo);
criarDiretorioSeNaoExiste('controladores');
criarDiretorioSeNaoExiste('rotas');

const geradorVisoes = new GeradorVisoes();
const geradorRotas = new GeradorRotas();

// Aqui apenas aceitamos declarações de classes. Pode ser mais de uma.
for (const declaracao of declaracoes.filter((d) => d instanceof Classe)) {
const declaracaoModelo = <Classe>declaracao;
const nomeBaseModelo = declaracaoModelo.simbolo.lexema.toLocaleLowerCase('pt');
const nomeControladorPlural = pluralizar(nomeBaseModelo).toLocaleLowerCase('pt');
const nomeModeloPlural = pluralizar(nomeBaseModelo).toLocaleLowerCase('pt');

const caminhoControlador = criarNovoControlador(nomeControladorPlural);
const caminhoControlador = geradorRotas.criarNovasRotas(declaracaoModelo);
console.info(`Controlador ${caminhoControlador}`);

// Visões
criarDiretorioSeNaoExiste('visoes', nomeControladorPlural);
const geradorVisoes = new GeradorVisoes();
criarDiretorioSeNaoExiste('visoes', nomeModeloPlural);

const visaoSelecionarTudo = geradorVisoes.criarNovaVisao(nomeControladorPlural, declaracaoModelo, 'selecionarTudo');
const visaoSelecionarTudo = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'selecionarTudo');
console.info(`Visão ${visaoSelecionarTudo}`);
const visaoSelecionarUm = geradorVisoes.criarNovaVisao(nomeControladorPlural, declaracaoModelo, 'selecionarUm');
const visaoSelecionarUm = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'selecionarUm');
console.info(`Visão ${visaoSelecionarUm}`);
const visaoAdicionar = geradorVisoes.criarNovaVisao(nomeControladorPlural, declaracaoModelo, 'adicionar');
const visaoAdicionar = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'adicionar');
console.info(`Visão ${visaoAdicionar}`);
const visaoAtualizar = geradorVisoes.criarNovaVisao(nomeControladorPlural, declaracaoModelo, 'atualizar');
const visaoAtualizar = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'atualizar');
console.info(`Visão ${visaoAtualizar}`);
const visaoExcluir = geradorVisoes.criarNovaVisao(nomeControladorPlural, declaracaoModelo, 'excluir');
const visaoExcluir = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'excluir');
console.info(`Visão ${visaoExcluir}`);
}
};
Expand Down
66 changes: 66 additions & 0 deletions interface-linha-comando/gerar/gerador-rotas.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import * as sistemaArquivos from 'fs';
import * as caminho from 'path';

import { Classe } from '@designliquido/delegua/fontes/declaracoes';
import { pluralizar } from '@designliquido/flexoes';
import { criarDiretorioSeNaoExiste } from '.';

export class GeradorRotas {
indentacao: number;

constructor() {
this.indentacao = 4;
}

/**
* Cria arquivos `.delegua` no diretório 'rotas/<modelo no plural>' com cinco rotas:
* - Arquivo `inicial.delegua`
* - rotaGet (para selecionar vários registros na base de dados)
* - rotaPost (para gravar 1 registro na base de dados)
* - Arquivo `[id].delegua`
* - rotaGet (para selecionar 1 registro por id na base de dados)
* - rotaPut (para alterar 1 registro na base de dados)
* - rotaDelete (para excluir 1 registro na base de dados)
* @param {Classe} declaracaoModelo O nome do diretório das rotas: o nome do modelo no plural.
* @returns {string} O caminho completo onde os arquivos de rotas foram criados.
*/
criarNovasRotas(declaracaoModelo: Classe): string {
const nomeBaseModelo = declaracaoModelo.simbolo.lexema.toLocaleLowerCase('pt');
const nomeModeloPlural = pluralizar(nomeBaseModelo).toLocaleLowerCase('pt');
const diretorioRotas = caminho.join(process.cwd(), 'rotas', nomeModeloPlural);

const conteudoSelecionarTudo = this.criarRotaSelecionarTudo(declaracaoModelo);
const conteudoAdicionar = `liquido.rotaPost(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`;
const conteudoAtualizar = `liquido.rotaPut(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`;
const conteudoExcluir = `liquido.rotaDelete(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`;
const conteudoControlador = `${conteudoSelecionarTudo}${conteudoAdicionar}${conteudoAtualizar}${conteudoExcluir}`;

criarDiretorioSeNaoExiste('rotas', nomeModeloPlural);
const caminhoRotas = caminho.join(diretorioRotas, 'inicial.delegua');
sistemaArquivos.writeFileSync(
caminhoRotas,
conteudoControlador
);

return caminhoRotas;
}

private criarRotaSelecionarTudo(declaracaoModelo: Classe) {
// Isso aqui não vai ficar assim.
// É preciso montar as partes de dados antes.
const dadosTestes = [];
for (const propriedade of declaracaoModelo.propriedades) {
dadosTestes.push(`"${propriedade.nome.lexema}": "Teste"`);
}

return `liquido.rotaGet(funcao(requisicao, resposta) {\n` +
`${" ".repeat(this.indentacao)}resposta.lmht({\n` +
`${" ".repeat(this.indentacao * 2)}"linhas": [\n` +
`${" ".repeat(this.indentacao * 3)}{${dadosTestes.reduce(
(acumulador, elemento) => acumulador + ', ' + elemento
)}}\n` +
`${" ".repeat(this.indentacao * 2)}]\n` +
`${" ".repeat(this.indentacao)}})\n` +
`})\n\n`;
}
}
19 changes: 14 additions & 5 deletions interface-linha-comando/gerar/gerador-visoes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,27 +61,36 @@ export class GeradorVisoes {
*/
private corpoInicial(declaracaoModelo: Classe): string {
// Colunas de cabeçalho
const colunasTabela: string[] = [];
const colunasCabecaTabela: string[] = [];
for (const propriedade of declaracaoModelo.propriedades) {
colunasTabela.push(" ".repeat(this.indentacao * 5) + `<célula>${propriedade.nome.lexema}</célula>`);
colunasCabecaTabela.push(" ".repeat(this.indentacao * 5) + `<célula>${propriedade.nome.lexema}</célula>`);
}

const linhaCabecaTabela = " ".repeat(this.indentacao * 4) + '<linha>\n' +
colunasTabela.reduce(
colunasCabecaTabela.reduce(
(acumulador, elemento) => acumulador + '\n' + elemento
) +
'\n' + " ".repeat(this.indentacao * 4) + '</linha>';

const cabecaTabela = `${" ".repeat(this.indentacao * 3)}<cabeça-tabela>\n${linhaCabecaTabela}\n${" ".repeat(this.indentacao * 3)}</cabeça-tabela>`;

// Colunas do corpo da tabela
const colunasCorpoTabela: string[] = [];
for (const propriedade of declaracaoModelo.propriedades) {
colunasCorpoTabela.push(" ".repeat(this.indentacao * 5) + `<célula>{{${propriedade.nome.lexema}}}</célula>`);
}

const linhaCorpoTabela = " ".repeat(this.indentacao * 4) + '<linha>\n' +
colunasTabela.reduce(
colunasCorpoTabela.reduce(
(acumulador, elemento) => acumulador + '\n' + elemento
) +
'\n' + " ".repeat(this.indentacao * 4) + '</linha>';

const corpoTabela = `${" ".repeat(this.indentacao * 3)}<corpo-tabela>\n${linhaCorpoTabela}\n${" ".repeat(this.indentacao * 3)}</corpo-tabela>`;
const corpoTabela = `${" ".repeat(this.indentacao * 3)}<corpo-tabela>\n` +
`${" ".repeat(this.indentacao * 3)}{{#cada linhas}}\n` +
`${linhaCorpoTabela}\n` +
`${" ".repeat(this.indentacao * 3)}{{/cada}}\n` +
`${" ".repeat(this.indentacao * 3)}</corpo-tabela>`;

return `${" ".repeat(this.indentacao * 2)}<tabela>\n${cabecaTabela}\n${corpoTabela}\n${" ".repeat(this.indentacao * 2)}</tabela>`;
}
Expand Down
27 changes: 0 additions & 27 deletions interface-linha-comando/gerar/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,30 +51,3 @@ export function criarDiretorioSeNaoExiste(...partesDiretorio: string[]) {
sistemaArquivos.mkdirSync(caminhoDiretorio);
}
}

/**
* Cria um arquivo `.delegua` no diretório 'controladores' com quatro rotas:
* - rotaGet (para selecionar 1 ou vários registros na base de dados)
* - rotaPost (para gravar 1 registro na base de dados)
* - rotaPut (para alterar 1 registro na base de dados)
* - rotaDelete (para excluir 1 registro na base de dados)
* @param {string} nome O nome do controlador.
* @returns {string} O caminho completo onde o controlador foi criado.
*/
export function criarNovoControlador(nome: string): string {
const diretorioControladores = caminho.join(process.cwd(), 'controladores');

const conteudoSelecionarTudo = `liquido.rotaGet(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`;
const conteudoAdicionar = `liquido.rotaPost(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`;
const conteudoAtualizar = `liquido.rotaPut(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`;
const conteudoExcluir = `liquido.rotaDelete(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`;
const conteudoControlador = `${conteudoSelecionarTudo}${conteudoAdicionar}${conteudoAtualizar}${conteudoExcluir}`;
const caminhoControlador = caminho.join(diretorioControladores, nome + '.delegua');
sistemaArquivos.writeFileSync(
caminhoControlador,
conteudoControlador
);

return caminhoControlador;
}

12 changes: 6 additions & 6 deletions liquido.ts
Original file line number Diff line number Diff line change
Expand Up @@ -356,20 +356,20 @@ export class Liquido implements LiquidoInterface {
const { valor } = JSON.parse(retornoInterpretador.resultado.pop());

let statusHttp: number = 200;
if (valor.campos.statusHttp) {
statusHttp = valor.campos.statusHttp;
if (valor.propriedades.statusHttp) {
statusHttp = valor.propriedades.statusHttp;

Check warning on line 360 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
}

Check warning on line 361 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement

Check warning on line 361 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch

try {
if (valor.campos.lmht) {
const resultadoFormatacaoLmht = await this.formatadorLmht.formatar(caminhoRota, valor.campos.valores);
if (valor.propriedades.lmht) {
const resultadoFormatacaoLmht = await this.formatadorLmht.formatar(caminhoRota, valor.propriedades.valores);

Check warning on line 365 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
return {
corpoRetorno: resultadoFormatacaoLmht,
statusHttp: statusHttp
};
} else if (valor.campos.mensagem) {
} else if (valor.propriedades.mensagem) {
return {
corpoRetorno: valor.campos.mensagem,
corpoRetorno: valor.propriedades.mensagem,
statusHttp: statusHttp
};

Check warning on line 374 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
}

Check warning on line 375 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement

Check warning on line 375 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement

Check warning on line 375 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch

Check warning on line 375 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch

Check warning on line 375 in liquido.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch
Expand Down

0 comments on commit 2dd5179

Please sign in to comment.